Synthetic commit for tag v_2_9_5 v_2_9_5
authorFabian Keil <fk@fabiankeil.de>
Wed, 27 Mar 2002 15:30:26 +0000 (15:30 +0000)
committerFabian Keil <fk@fabiankeil.de>
Wed, 27 Mar 2002 15:30:26 +0000 (15:30 +0000)
223 files changed:
.gitignore
AUTHORS [deleted file]
ChangeLog [deleted file]
GNUmakefile.in [deleted file]
Junkbuster Status.URL [new file with mode: 0644]
LICENSE [deleted file]
Makefile [deleted file]
Makefile.in [new file with mode: 0644]
README [deleted file]
acconfig.h
actionlist.h
actions.c
actions.h
actionsfile [moved from default.action with 75% similarity, mode: 0755]
advanced.action [deleted file]
amiga.c
amiga.h
basic.action [deleted file]
cgi.c
cgi.h
cgiedit.c [deleted file]
cgiedit.h [deleted file]
cgisimple.c [deleted file]
cgisimple.h [deleted file]
config
config.guess [deleted file]
config.h.in [new file with mode: 0644]
config.h.win
config.h.win32threads.win [deleted file]
config.sub [deleted file]
configure [moved from pcre/configure with 73% similarity, mode: 0755]
configure.in
console_junkbuster.dsp [moved from vc_console.dsp with 58% similarity, mode: 0755]
contrib.sh [deleted file]
cygwin.h
deanimate.c [deleted file]
deanimate.h [deleted file]
default.filter [deleted file]
doc/.gitignore [deleted file]
doc/USER_DOC_IS_WIDELY_OBSOLETED [new file with mode: 0644]
doc/changes.txt [new file with mode: 0644]
doc/fb.gif [moved from doc/obsolete/fb.gif with 100% similarity]
doc/gpl.html
doc/ijbfaq.html [moved from doc/obsolete/ijbfaq.html with 97% similarity]
doc/ijbman.html [moved from doc/obsolete/ijbman.html with 97% similarity]
doc/pcrs.3 [deleted file]
doc/source/.gitignore [deleted file]
doc/source/developer-manual.sgml [deleted file]
doc/source/faq.sgml [deleted file]
doc/source/ldp.dsl [deleted file]
doc/source/user-manual.sgml [deleted file]
doc/text/developer-manual.txt [deleted file]
doc/text/faq.txt [deleted file]
doc/text/user-manual.txt [deleted file]
doc/top.gif [moved from doc/obsolete/top.gif with 100% similarity]
doc/webserver/.gitignore [deleted file]
doc/webserver/.htaccess [deleted file]
doc/webserver/README.txt
doc/webserver/config/.htaccess [deleted file]
doc/webserver/config/index.php [deleted file]
doc/webserver/default_page.php [deleted file]
doc/webserver/developer-manual.html [new file with mode: 0644]
doc/webserver/documentation-guidelines.html [new file with mode: 0644]
doc/webserver/faq.html [new file with mode: 0644]
doc/webserver/index.html
doc/webserver/p_doc.css [deleted file]
doc/webserver/p_web.css [deleted file]
doc/webserver/redirect.php
doc/webserver/robots.txt [deleted file]
doc/webserver/swa.css [new file with mode: 0644]
doc/webserver/testplan.html [new file with mode: 0644]
doc/webserver/user-manual.html [new file with mode: 0644]
encode.c
encode.h
errlog.c
errlog.h
filters.c
filters.h
gateway.c
gateway.h
icons/denyrule.ico [new file with mode: 0644]
icons/icon1.ico [new file with mode: 0644]
icons/idle.ico
icons/junkbust.ico [moved from icons/privoxy.ico with 59% similarity]
icons/os2.ico [deleted file]
icons/os20.ico [deleted file]
icons/os21.ico [deleted file]
icons/os22.ico [deleted file]
icons/os23.ico [deleted file]
icons/os24.ico [deleted file]
icons/os25.ico [deleted file]
icons/os26.ico [deleted file]
icons/os27.ico [deleted file]
icons/os28.ico [deleted file]
install-sh [deleted file]
intermediate.action [deleted file]
jbsockets.c
jbsockets.h
jcc.c
jcc.h
junkbuster-rh.spec [new file with mode: 0644]
junkbuster-suse.spec [new file with mode: 0644]
junkbuster.1 [new file with mode: 0644]
junkbuster.init [new file with mode: 0644]
junkbuster.init.suse [new file with mode: 0644]
junkbuster.logrotate [moved from privoxy.logrotate with 56% similarity]
junkbuster.monthly [moved from privoxy.monthly with 87% similarity]
junkbuster.weekly [moved from privoxy.weekly with 84% similarity]
killpopup.c
killpopup.h
list.c
list.h
loadcfg.c
loadcfg.h
loaders.c
loaders.h
miscutil.c
miscutil.h
parsers.c
parsers.h
pcre/.gitignore [deleted file]
pcre/Makefile.in [deleted file]
pcre/RunTest.in [deleted file]
pcre/config.guess [deleted file]
pcre/config.h [deleted file]
pcre/config.in [deleted file]
pcre/config.sub [deleted file]
pcre/configure.in [deleted file]
pcre/dftables.c [deleted file]
pcre/dll.mk [deleted file]
pcre/doc/ChangeLog [deleted file]
pcre/doc/NON-UNIX-USE [deleted file]
pcre/doc/Tech.Notes [deleted file]
pcre/doc/authors [deleted file]
pcre/doc/copying [deleted file]
pcre/doc/news [deleted file]
pcre/doc/pcre.3 [deleted file]
pcre/doc/pcre.html [deleted file]
pcre/doc/pcre.txt [deleted file]
pcre/doc/pcregrep.1 [deleted file]
pcre/doc/pcregrep.html [deleted file]
pcre/doc/pcregrep.txt [deleted file]
pcre/doc/pcreposix.3 [deleted file]
pcre/doc/pcreposix.html [deleted file]
pcre/doc/pcreposix.txt [deleted file]
pcre/doc/pcretest.txt [deleted file]
pcre/doc/perltest.txt [deleted file]
pcre/doc/readme [deleted file]
pcre/get.c [deleted file]
pcre/install [deleted file]
pcre/install-sh [deleted file]
pcre/internal.h [deleted file]
pcre/licence [deleted file]
pcre/ltconfig [deleted file]
pcre/ltmain.sh [deleted file]
pcre/maketables.c [deleted file]
pcre/pcre-config [deleted file]
pcre/pcre-config.in [deleted file]
pcre/pcre.c [deleted file]
pcre/pcre.def [deleted file]
pcre/pcre.h [deleted file]
pcre/pcre.in [deleted file]
pcre/pcregrep.c [deleted file]
pcre/pcreposix.c [deleted file]
pcre/pcreposix.h [deleted file]
pcre/pcretest.c [deleted file]
pcre/study.c [deleted file]
pcre/vc_dftables.dsp [deleted file]
pcrs.c
pcrs.h
privoxy-rh.spec [deleted file]
privoxy-suse.spec [deleted file]
privoxy.1 [deleted file]
privoxy.init [deleted file]
privoxy.init.suse [deleted file]
project.h
re_filterfile [new file with mode: 0644]
showargs.c [new file with mode: 0644]
showargs.h [new file with mode: 0644]
ssplit.c
ssplit.h
templates/blocked
templates/blocked-compact [deleted file]
templates/cgi-error-404 [deleted file]
templates/cgi-error-bad-param [deleted file]
templates/cgi-error-disabled [deleted file]
templates/cgi-error-file [deleted file]
templates/cgi-error-modified [deleted file]
templates/cgi-error-parse [deleted file]
templates/connect-failed
templates/default
templates/edit-actions-add-url-form [deleted file]
templates/edit-actions-for-url [deleted file]
templates/edit-actions-for-url-filter [deleted file]
templates/edit-actions-list [deleted file]
templates/edit-actions-list-section [deleted file]
templates/edit-actions-list-url [deleted file]
templates/edit-actions-remove-url-form [deleted file]
templates/edit-actions-url-form [deleted file]
templates/no-such-domain
templates/show-request [deleted file]
templates/show-status
templates/show-status-file
templates/show-url-info
templates/show-version [deleted file]
templates/toggle [deleted file]
templates/toggle-mini [deleted file]
templates/untrusted
testdrive.status [deleted file]
urlmatch.c [deleted file]
urlmatch.h [deleted file]
vc_junkbuster.dsp [moved from vc_privoxy.dsp with 61% similarity]
vc_junkbuster.dsw [moved from vc_privoxy.dsw with 68% similarity]
w32.rc
w32log.c
w32log.h
w32res.h
w32rulesdlg.c [new file with mode: 0644]
w32rulesdlg.h [new file with mode: 0644]
w32taskbar.c
w32taskbar.h
win32.c
win32.h

index 9ea1fd2..6780c5a 100644 (file)
@@ -26,30 +26,18 @@ _$*
 *.ln
 core
 # CVS default ignores end
-*.txt
-GNUmakefile
+.\logfile
 Makefile
-configure
+config
 config.cache
 config.h
-config.h.in
 config.log
 config.status
-jarfile
 junkbstr.txt
 junkbuster
 junkbuster.log
 logfile
 permissionsfile
-privoxy
-privoxy.exe
 re_filterfile
-vc_debug
-vc_debug_winthr
 vc_junkbuster.ncb
 vc_junkbuster.opt
-vc_junkbuster.plg
-vc_release
-vc_release_winthr
-w32.aps
-w32.res
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644 (file)
index 9bece11..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,53 +0,0 @@
-              Authors of Privoxy v2.9.x and 3.x
-===========================================================================
-
-Current Project developers:
-
- Stefan Waldherr
- Andreas Oesterhelt
- Jon Foster
-
- Markus Breitenbach
- Thomas Steudten
-
-Current Project Contributors (in alphabetical order):
-
- David Schmidt (OS/2, Mac OSX ports)
- Gabriel L. Somlo
- Hal Burgiss (docs)
- Haroon Rafique
- John Venvertloh
- Joerg Strohmayer
- Rodney Stromlund
- Rodrigo Barbosa (RPM specfiles)
- Sarantis Paskalis
- Shamim Mohamed
-
-Originally developed by:
-
- Junkbusters Corp.
- Anonymous Coders
-
-Thanks to the many people who have tested Privoxy, reported bugs,
-or made suggestions. These include (in alphabetical order):
-
- Aaron Hamid
- Alexander Lazic  (FreeBSD patch)
- Andrew J. Caines
- Bart Schelstraete
- Clifford Caoile
- Darren Wiebe
- Gabor Liptak
- Guy
- Ken Arromdee
- Magnus Holmgren
- Paul Lieverse
- Peter E
- Reiner Buehl
-
-If we've missed you off this list, please let us know!
-
-Privoxy team. http://www.privoxy.org/
-ijbswa-developers@lists.sourceforge.net
-
-
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644 (file)
index e16c454..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,202 +0,0 @@
---------------------------------------------------------------------
-ChangeLog for Internet JunkBuster
---------------------------------------------------------------------
-
-*** Version 2.9.13 Beta *** 
-
-- *NEWS*: The project has been renamed to Privoxy! The new name is 
-reflected throughout (file locations, etc).
-- ijb.action is now default.action. re_filterfile is now 
-default.filter.
-- http://i.j.b/ is now http://p.p/
-- The 'logo' option for replacing ad iamges is removed now. 'Pattern' 
-(checkerboard) is now the default.
-
-
-*** Version 2.9.12 Beta *** 
-
-- **READ**: The default listening PORT is NOW 8118!!! Changed from 
-8000 due to conflict with NAS (Network Audio Server, whatever that 
-is.)
-- More CGI actions editor fixes and improvements.
-- Win32 command line fix ups.
-- re_filterfile now has modular sections that can be activated on a 
-per site basis. Some new goodies there too.
-- +filter now takes arguments to match FILTER sections in re_filterfile
-for even more flexibility. 
-- Added a new image blocker option: +image-blocker{pattern}, which 
-displays a checkerboard patthern and scales better than the logo.
-- PNG images will be used in place of GIF for JB built-in images
-if configured with --enable-no-gif.
-- Clean up compiler warnings (mostly).
-- Improved handling of failed DNS lookups & diagnostics for failed bind
-to listen socket
-- Made --no-daemon mode log to tty instead of logfile.
-- Various spec file and init script cleanups and improvements (Redhat and
-SuSE).
-- CGI Editor works on OS/2 now.
-- Fix restart failure where sockets were in TIME_WAIT.
-- Fixes for actions cgi editor, make sure we have right file.
-- A --pidfile command line option now, in addition to --help, 
---version, --no-daemon, --user and configfile. --no-daemon replaces
-the former -d option and _DEBUG define. --user will drop privileges 
-to the specified user.
-- Signal handling cleanups (*nix).
-- CGI actions editor improvements and fixes.
-- Error handling improvements, especially out of memory.
-- Default re_filterfile fix that caused spurious IJB logos 
-(instead of 'blank').
-- configure.in threading fixes for Solaris.
-- Various other minor fixes.
-
-
-*** Version 2.9.11 Beta Changes ***
-
-- Add "session" cookie concept where cookies exist for the life 
-of that browser session only (ie never goes to disk). 
-- Checks for correct header length.
-- Fix user:pass@host.domain.com auth bug.
-- Better signal handling on *nix.
-- Fix CFLAGS hard-coded in configure.in
-- Fix threading bug re: gethostbyname() that caused random 
-URLs to fail in some cases.
-
-
-*** Version 2.9.11 Alpha Changes ***
-
-- A web-based editor for the actions file is included (go to http://i.j.b/).
-- Web-based toggle IJB on/off support.
-- Cookie handling has changed - the new +no-cookies-keep feature is now the
-default.
-- actionsfile is renamed to ijb.action.
-- junkbstr.txt is now config.txt on Win32.
-- Support for running IJB as a UNIX daemon process has improved.
-- Unix daemon now returns error code on failed start.
-- Timestamps in logfile and jarfile now.
-- Fix for the Netscape bug reintroduced in 2.9.9.
-- make should now abort if gmake (GNU make) not present.
-- Many other minor bugfixes
-- Start a ChangeLog :)
-
-
-
-*** Version 2.9.3 pre-Alpha Changes ***
-
-- Amiga support (completely untested by me - I don't have an Amiga)
-- "tinygif 3" support (redirects blocked images to a specified URL, so
-the browser doesn't have to load and cache many copies of the same
-image).
-- one case where there were both local and global "referrer" variables
-(yuck!) clarified by renaming the local one to "refer".
-- Fixed some places where close() was used instead of close_socket().
-Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these.
-- Temporary hack to get FORCE_LOAD to work with IE.  I just lowercased the
-FORCE_LOAD_PREFIX.  Needs fixing properly.
-- Most URLs hardcoded into JunkBuster were changed to go through a script
-e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq
-The only other URLs left are the GNU GPL:
-  http://www.fsf.org/copyleft/gpl.html
-and the home page:
-  http://ijbswa.sourceforge.net/
-... and various URLs which will be intercepted by JunkBuster anyway.
-TODO: Still need to do something with the URLs in JunkBuster Corp's 
-copyright/trademark notice on the bottom of the show-proxy-args page.
-- PCRE or GNU Regex is now a #define option.
-
-
-*** Version 2.9.2 pre-Alpha Changes ***
-
-- Andreas applied the latest version of the FORCE patch.
-
-
-*** Version 2.9.1 pre-Alpha Changes ***
-
-- in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD
-(BTW: I think FORCE is precise enough, since loading remote
-data is the whole purpose of a proxy..)
-- Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.'
-is more elegant and looks like a hostname in the URL, it doesn't
-make clear to the inexperienced user that the proxy is bypassed. It
-also has a higher name collision risk.
-- Filled in the function header templates for my functions in
-parsers.c (again). They obviously got lost in our current
-patch war ;-)
-- Cut the credit for the Â§-referrer-option from the config file,
-that Stefan had placed there.
-- Improved the re_filterfile 
-
-
-*** Version 2.9.0 pre-Alpha Changes ***
-
--  Now use PCRE, not GNU REGEX.  I have not yet had chance to check the
-syntax of the block/image/cookie file to ensure that they match what
-is expected - however they seem to work.
--  Replaced "configure" script with one generated by "autoconf".  Also 
-use a header "config.h" (was ijbconfig.h in my previous release) for 
-the #defines.  "config.h" is now generated with "autoheader" from 
-"acconfig.h" and "configure.in".  (Note that to install you do not
-need autoconf or autoheader - just run "./configure".)
-To see command-line options, run "./configure --help".
-This is my first ever autoconf script, so it has some rough edges
-(how PCRE is handled is the roughest).
--  Error logging code replaced with new module errlog.c, based on the
-one from JunkBusterMT (but with the threading code removed).
--  Most of Rodney's 0.21 and 0.21A patches applied. (Marked *).  I did not
-apply all of these, since I had already independently done conditional
-popup file, conditional image file, and integration of popup code.
-- ACL, Jar and trust files conditionally compiled.
-- New source file headers.
-- Various cosmetic changes.  (But I have not consistently ordered the 
-config files - I think that's worthwhile, but it's 1am and I want to
-get this released!)
-- RCS tags on .h files.
--  RCS tags are const char[] rather than const char *.  (Saves 4 bytes
-per tag ;-)
-- VC++ project files renamed to vc_junkbuster.*.
-- show-proxy-args now shows status of all conditionals, not just REGEX
-- Various functions moved around.  Most notably all the system-specific
-sockets code which was spread between jcc.c, bind.c, and connect.c,
-has been moved to "jbsockets.c".  The non-system-specific code from
-connect.c and socks4.c has been movet to "gateway.c".  Also, the
-config file loader and the global variables it writes to have been
-moved to "loadcfg.c".  (Maybe this should go into loaders.c?)
-And candidate for the "worst filename ever" award is "miscutil.c",
-which contains, well, miscellaneous utility functions like zalloc.
-(Suggestions for a better name for this file are welcome!)
-- Loaders now use a common function to read a line and skip comments,
-and this function also stores the proxy_args.
-- Added ./junkbuster --help     (Not for Win32 GUI)
-- Added ./junkbuster --version  (Not for Win32 GUI)
-- Win32 resources are now all marked as "U.S. English", rather than
-being a mix of "U.S. English", "U.K. English" and "Irish English".
-- Version number changes to 2.9.0
-
-
-
-----------------------------------------------------------------------
-Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-               Privoxy team. http://www.privoxy.org/
-
-               Based on the Internet Junkbuster originally written
-               by and Copyright (C) 1997 Anonymous Coders and 
-               Junkbusters Corporation.  http://www.junkbusters.com
-
-               This program is free software; you can redistribute it 
-               and/or modify it under the terms of the GNU General
-               Public License as published by the Free Software
-               Foundation; either version 2 of the License, or (at
-               your option) any later version.
-
-               This program is distributed in the hope that it will
-               be useful, but WITHOUT ANY WARRANTY; without even the
-               implied warranty of MERCHANTABILITY or FITNESS FOR A
-               PARTICULAR PURPOSE.  See the GNU General Public
-               License for more details.
-
-               The GNU General Public License should be included with
-               this file.  If not, you can view it at
-               http://www.gnu.org/copyleft/gpl.html
-               or write to the Free Software Foundation, Inc., 59
-               Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-
diff --git a/GNUmakefile.in b/GNUmakefile.in
deleted file mode 100644 (file)
index 7726cc7..0000000
+++ /dev/null
@@ -1,945 +0,0 @@
-# Note:  Makefile is built automatically from Makefile.in
-#
-# $Id: GNUmakefile.in,v 1.36 2002/03/27 14:58:08 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-#############################################################################
-# Version number (for RPM)
-#############################################################################
-
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_POINT = @VERSION_POINT@
-CODE_STATUS   = @CODE_STATUS@
-VERSION       = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT)
-# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile
-RPM_VERSION   = $(VERSION)
-RPM_PACKAGEV  = @VERSION_RPM_PACKAGE@
-
-
-#############################################################################
-# Directories for "make install"
-#############################################################################
-
-DEST        = @sysconfdir@/privoxy
-SBIN_DEST   = @sbindir@
-MAN_DEST    = @mandir@
-
-
-#############################################################################
-# Build tools
-#############################################################################
-
-PROGRAM    = privoxy@EXEEXT@
-CC         = @CC@
-ECHO       = echo
-GZIP_PROG  = gzip
-INSTALL    = cp -f
-LD         = @CC@
-RM         = rm -f
-STRIP_PROG = strip
-SED       = sed
-CAT        = cat
-RPM        = rpm
-MV        = mv
-TAR        = tar
-MAKE       = make
-LN         = ln
-WDUMP      = @WDUMP@ -dump
-JADEBIN    = @JADEBIN@
-DB         = $(JADEBIN) -t sgml -ihtml -D.. -d ldpOK.dsl\#html
-DB2HTML    = @DB2HTML@
-DKPREFIX   = @DKPREFIX@
-MAN2HTML   = @MAN2HTML@
-TARGET_OS  = foobar
-
-# Program to do LF->CRLF
-#
-# The sed version should be the most portable, but it doesn't for for me,
-# the other two do.  FIXME.
-#   - Jon
-#DOSFILTER  = $(SED) -e $$'s,$$,\r,'
-#DOSFILTER  = gawk -v ORS='\r\n' '{print $0;}'
-DOSFILTER  = perl -p -e 's/\n/\r\n/'
-
-#############################################################################
-# Setup for make distribution rh and suse for now 
-#############################################################################
-
-TAR_ARCH = /tmp/privoxy-$(RPM_VERSION).tar.gz
-RPM_BASE = @RPM_BASE@
-
-#############################################################################
-# Filenames and libraries
-#############################################################################
-
-C_SRC  = actions.c cgi.c cgiedit.c cgisimple.c deanimate.c encode.c \
-         errlog.c filters.c gateway.c jbsockets.c jcc.c killpopup.c \
-         list.c loadcfg.c loaders.c miscutil.c parsers.c ssplit.c \
-         urlmatch.c
-
-C_OBJS = $(C_SRC:.c=.@OBJEXT@)
-C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h
-
-CONFIG_FILES = config trust \
-               default.action \
-               basic.action intermediate.action advanced.action \
-               default.filter \
-               templates/*
-
-DOC_FILES = AUTHORS LICENSE README ChangeLog doc/text/* privoxy.1
-
-W32_SRC   = @WIN_ONLY@w32log.c w32taskbar.c win32.c
-W32_FILES = @WIN_ONLY@w32.res
-W32_OBJS  = @WIN_ONLY@$(W32_SRC:.c=.@OBJEXT@) $(W32_FILES)
-W32_HDRS  = @WIN_ONLY@w32log.h w32taskbar.h win32.h w32res.h
-W32_LIB   = @WIN_ONLY@-lwsock32 -lcomctl32
-W32_INIS  = @WIN_ONLY@config.txt trust.txt
-
-PCRS_SRC     = @STATIC_PCRS_ONLY@pcrs.c
-PCRS_OBJS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.@OBJEXT@)
-PCRS_HDRS    = @STATIC_PCRS_ONLY@$(PCRS_SRC:.c=.h)
-
-PCRE_SRC     = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c
-PCRE_OBJS    = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.@OBJEXT@)
-PCRE_HDRS    = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h
-
-# No REGEX (Either because dynamically linked pcreposix, or no regex at all):
-REGEX_SRC    =
-# GNU REGEX:
-@GNU_REGEX_ONLY@REGEX_SRC    = gnu_regex.c
-# PCRE REGEX:
-@PCRE_REGEX_ONLY@@STATIC_PCRE_ONLY@REGEX_SRC = pcre/pcreposix.c
-
-REGEX_OBJS   = $(REGEX_SRC:.c=.@OBJEXT@)
-REGEX_HDRS   = $(REGEX_SRC:.c=.h)
-
-# Dependencies introduced by #include "project.h".
-PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h
-
-# Socket libraries for platforms that need them explicitly defined
-SOCKET_LIB   = @SOCKET_LIB@
-
-# PThreads library, if needed.
-PTHREAD_LIB  = @PTHREAD_ONLY@@PTHREAD_LIB@
-
-SRCS         = $(C_SRC)  $(W32_SRC)  $(PCRS_SRC)  $(PCRE_SRC)  $(REGEX_SRC)
-OBJS         = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS)
-HDRS         = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS)
-LIBS         = @LIBS@ $(W32_LIB) $(SOCKET_LIB) $(PTHREAD_LIB)
-
-
-#############################################################################
-# Compiler switches
-#############################################################################
-
-# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type build.
-# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for a
-# Win32 GUI build.
-# The flag "-pthread" is required if using Pthreads under Linux (and
-# possibly other OSs).
-SPECIAL_CFLAGS = @SPECIAL_CFLAGS@
-
-# Add your flags here 
-OTHER_CFLAGS =   
-
-CFLAGS = @CFLAGS@ @CPPFLAGS@ $(OTHER_CFLAGS) $(SPECIAL_CFLAGS) -Wall \
-         @STATIC_PCRE_ONLY@ -Ipcre 
-
-LDFLAGS = $(DEBUG_CFLAGS) $(SPECIAL_CFLAGS)
-
-
-#############################################################################
-# Build section.
-#
-# There should NOT be any targets above this line.
-#############################################################################
-all: $(PROGRAM)
-
-
-#############################################################################
-# Phony targets
-#############################################################################
-.PHONY: all inifiles redhat-dist redhat-upload solaris-dist suse-dist \
-suse-upload win-dist tarball-dist dok redhat-dok webserver clean clobber tags \
-install
-
-
-#############################################################################
-# Define this explicitly because Solaris is broken!
-#############################################################################
-%.o: %.c
-       $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
-
-
-#############################################################################
-# Win32 config files
-#############################################################################
-
-inifiles: $(W32_INIS)
-
-config.txt: config
-       $(SED) -e 's!\trustfile trust!trustfile trust.txt!' \
-              -e 's!\jarfile jarfile!jarfile jar.log!' \
-              -e 's!\logfile logfile!logfile privoxy.log!' \
-              -e 's!#Win32-only: !!' \
-              < $< | \
-              $(DOSFILTER) > $@
-       # LF to CRLF in default.action
-       $(DOSFILTER) <default.action >default.action.txt && mv default.action.txt default.action
-       # LF to CRLF in default.filter
-       $(DOSFILTER) <default.filter >default.filter.txt && mv default.filter.txt default.filter
-
-trust.txt: trust
-       $(DOSFILTER) < $< > $@ 
-
-re_filterfile.txt: re_filterfile
-       $(DOSFILTER) < $< > $@ 
-
-
-#############################################################################
-# redhat distribution alpha and x86
-#############################################################################
-
-redhat-dist:
-       for dir in RPMS SRPMS BUILD SOURCES SPECS; do \
-               if [ ! -w $(RPM_BASE)/$$dir ]; then \
-                       $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \
-                       $(ECHO) "Or add a suitable path to .rpmmacros like."; \
-                       $(ECHO) "%_topdir /home/foo/rpm-build"; \
-                       exit 1; \
-               fi; \
-       done; \
-
-       $(MAKE) clobber
-       if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi
-
-       TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \
-       if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSION)/g' \
-             -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \
-              privoxy-rh.spec > $$TMPFILE ; then \
-      $(MV) -f $$TMPFILE privoxy-rh.spec; \
-   else \
-      $(ECHO) "Could not set version info in specfile."; \
-      exit 1;\
-   fi
-
-       $(TAR) --exclude "CVS" --exclude "privoxy-suse.spec" -czf $(TAR_ARCH) .
-       $(RPM) --clean -ta  $(TAR_ARCH)
-       if [ -f $(TAR_ARCH) ]; then  $(RM) $(TAR_ARCH); fi
-
-#
-# anonymously ncftps the rpms to sourceforge
-#
-redhat-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm
-# better should use `arch` here instead of ix86 to support other platforms too
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-     # w3m http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-
-#############################################################################
-# sun solaris  distribution
-#############################################################################
-
-solaris-dist:
-       @$(ECHO) ""
-       @$(ECHO) "You have run autoconf && autoheader && ./configure right?"
-       @$(ECHO) ""
-       $(MAKE) $(PROGRAM)
-       $(STRIP_PROG) $(PROGRAM)
-       $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS)
-# add program
-       $(TAR) -C.. -cvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$(PROGRAM)
-# add config files
-       for foo in $(CONFIG_FILES); do \
-               $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \
-       done; 
-# add documentation
-       for foo in $(DOC_FILES); do \
-               $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -uvhf privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar privoxy-$(VERSION)-$(CODE_STATUS)/$$foo; \
-       done; 
-# and zip the archive
-       $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)
-       $(GZIP_PROG) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar
-       @$(ECHO) Distribution with binary created.
-
-# anonymously ncftps the tarball to sourceforge
-solaris-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# use with care
-solaris-clean:
-       $(RM) privoxy-$(TARGET_OS)-$(VERSION)-$(CODE_STATUS)-src.tar*
-
-#############################################################################
-# hpux distribution
-#############################################################################
-hpux-dist:
-       @$(ECHO) coming soon. 
-hpux-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# debian distribution
-#############################################################################
-debian-dist:
-       @$(ECHO) coming soon. 
-debian-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# macosx distribution
-#############################################################################
-macosx-dist:
-       @$(ECHO) coming soon. 
-macosx-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# amiga distribution
-#############################################################################
-amiga-dist:
-       @$(ECHO) coming soon. 
-amiga-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# freebsd distribution
-#############################################################################
-freebsd-dist:
-       @$(ECHO) coming soon. 
-freebsd-upload:
-       @$(ECHO) coming soon. 
-
-#############################################################################
-# suse distribution. works fine. no need to be root. 
-#############################################################################
-suse-dist:
-       for dir in RPMS SRPMS BUILD SOURCES SPECS; do \
-               if [ ! -w $(RPM_BASE)/$$dir ]; then \
-                       $(ECHO) "$(RPM_BASE)/$$dir is not writable for you. Maybe try as root."; \
-                       $(ECHO) "Or add a suitable path to .rpmmacros like."; \
-                       $(ECHO) "%_topdir /home/foo/rpm-build"; \
-                       exit 1; \
-               fi; \
-       done; \
-
-       $(MAKE) clobber
-       if [ -f $(TAR_ARCH) ]; then $(RM) $(TAR_ARCH); fi
-
-       TMPFILE=$$(mktemp -q /tmp/$(PROGRAM).XXXXXX); \
-       if $(SED) -e 's/^\(Version:\).*/\1 $(RPM_VERSIO)/g' \
-             -e 's/^\(Release:\).*/\1 $(RPM_PACKAGEV)/g' \
-              privoxy-suse.spec > $$TMPFILE ; then \
-      $(MV) -f $$TMPFILE privoxy-suse.spec; \
-   else \
-      $(ECHO) "Could not set version info in specfile."; \
-      exit 1;\
-   fi
-
-       $(TAR) --exclude "CVS" --exclude "privoxy-rh.spec" -czf $(TAR_ARCH) .
-       $(RPM) --clean -ta  $(TAR_ARCH)
-       if [ -f $(TAR_ARCH) ]; then  $(RM) $(TAR_ARCH); fi
-
-#
-# anonymously ncftps the rpms to sourceforge
-#
-suse-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/SRPMS/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).src.rpm
-# better should use `arch` here instead of ix86 to support other platforms too
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming $(RPM_BASE)/RPMS/*/privoxy-suse-$(RPM_VERSION)-$(RPM_PACKAGEV).*.rpm
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# handle with care. use with root.
-suse-clean:
-       rpm -e junkbuster-suse || true
-       rm -rf /etc/junkbuster
-       rm -rf /etc/rc.d/junkbuster*
-       rm -rf /var/run/junkbuster.pid 
-       rm -rf /var/log/junkbuster
-       rm -f /etc/init.d/junkbuster
-       rm -f /usr/sbin/junkbuster
-       rm -f /usr/sbin/rcjunkbuster
-       rm -f /usr/share/man/man1/junkbuster.1.gz
-       rpm -e privoxy-suse || true
-       rm -rf /etc/privoxy
-       rm -rf /etc/rc.d/privoxy*
-       rm -rf /var/run/privoxy.pid 
-       rm -rf /var/log/privoxy
-       rm -f /etc/init.d/privoxy
-       rm -f /usr/sbin/privoxy
-       rm -f /usr/sbin/rcprivoxy
-       rm -f /usr/share/man/man1/privoxy.1.gz
-
-#############################################################################
-# Windows distribution
-#############################################################################
-win-dist:
-       $(ECHO) Not implemented.
-
-
-#############################################################################
-# Tarball distribution
-#############################################################################
-tarball-dist: clobber
-       $(LN) -s current ../privoxy-$(VERSION)-$(CODE_STATUS)
-       $(TAR) -C.. --exclude "CVS" --exclude "#*" --exclude ".#*" --exclude ".cvsignore" -cvhzf privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz privoxy-$(VERSION)-$(CODE_STATUS)
-       $(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)
-       @$(ECHO) Tarball (without any binary) created.
-
-# anonymously ncftps the tarball to sourceforge
-tarball-upload:
-       ncftpput -u anonymous -p ijbswa-developers@lists.sourceforge.net upload.sourceforge.net /incoming privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) Now goto
-       @$(ECHO) http://sourceforge.net/project/admin/editpackages.php?group_id=11118
-       @$(ECHO) ... and release the files.
-       @$(ECHO) -------------------------------------------------------
-
-# handle with care
-tarball-clean:
-       $(RM) privoxy-$(VERSION)-$(CODE_STATUS)-src.tar.gz
-
-#############################################################################
-#
-# Documentation
-#
-# converts doc/source/*.sgml into html, text and man pages
-#
-#############################################################################
-dok: doc/source/ldpOK.dsl man2html-swa
-       mkdir -p doc/text doc/man
-#  user manual
-       rm -rf doc/webserver/user-manual
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl user-manual.sgml && mv user-manual ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks user-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/user-manual.txt && rm -rf tmp.html user-manual
-##  developer manual
-       rm -rf doc/webserver/developer-manual
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl developer-manual.sgml && mv developer-manual ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks developer-manual.sgml > tmp.html && lynx -dump tmp.html > ../text/developer-manual.txt && rm -rf tmp.html developer-manual
-##  faq
-       rm -rf doc/webserver/faq
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl faq.sgml && mv faq ../webserver
-       cd doc/source && $(DB2HTML) -s ldpOK.dsl --nochunks faq.sgml > tmp.html && lynx -dump tmp.html > ../text/faq.txt && rm -rf tmp.html faq
-
-man2html-swa:
-       if [ "$(MAN2HTML)" != "false" ]; then \
-               mkdir -p doc/webserver/man-page; \
-               $(ECHO) "<html><head><title>Privoxy|Doc/Man page</title><link rel=\"stylesheet\" type=\"text/css\" href=\"../p_web.css\"></head><body><H2>NAME</H2>" > doc/webserver/man-page/privoxy-man-page.html; \
-               man ./privoxy.1 | $(MAN2HTML) -bare \
-                >> doc/webserver/man-page/privoxy-man-page.html; \
-               $(ECHO) "</body></html>" >> doc/webserver/man-page/privoxy-man-page.html; \
-       fi
-
-redhat-dok: doc/source/ldpOK.dsl man2html
-       mkdir -p doc/text doc/man doc/source/user-manual \
-          doc/source/developer-manual doc/source/faq
-##  user manual
-       rm -rf doc/webserver/user-manual
-       cd doc/source/user-manual && $(DB) ../user-manual.sgml && cd .. &&\
-          mv user-manual ../webserver
-       cd doc/source && $(DB) -V nochunks user-manual.sgml > tmp.html && \
-          $(WDUMP) tmp.html > ../text/user-manual.txt && rm -rf tmp.html \
-          user-manual
-##  developer manual
-       rm -rf doc/webserver/developer-manual
-       cd doc/source/developer-manual && $(DB) ../developer-manual.sgml &&\
-          cd .. && mv developer-manual ../webserver
-       cd doc/source && $(DB) -V nochunks developer-manual.sgml > tmp.html && \
-          $(WDUMP) tmp.html > ../text/developer-manual.txt && rm -rf tmp.html \
-          developer-manual
-##  faq
-       rm -rf doc/webserver/faq
-       cd doc/source/faq && $(DB) ../faq.sgml && cd .. && mv faq ../webserver
-       cd doc/source && $(DB) -V nochunks faq.sgml > tmp.html && $(WDUMP) \
-          tmp.html > ../text/faq.txt && rm -rf tmp.html faq
-
-doc/source/ldpOK.dsl:
-       if [ "$(DKPREFIX)" != "none" ]; then \
-               sed -e "s@/usr/share/sgml/docbook/dsssl-stylesheets@$(DKPREFIX)@g" doc/source/ldp.dsl > doc/source/ldpOK.dsl; \
-       else \
-               cp doc/source/ldp.dsl doc/source/ldpOK.dsl; \
-       fi
-
-man2html:
-       if [ "$(MAN2HTML)" != "false" ]; then \
-               $(MAN2HTML) privoxy.1 |grep -v "^Content-type" > doc/webserver/man-page/privoxy-man-page.html; \
-       fi
-
-#############################################################################
-#
-# Webserver
-#
-# moves dokumentation to webserver
-#
-#############################################################################
-webserver:
-       @$(ECHO) -------------------------------------------------------
-       @$(ECHO) You have run make dok/redhat-dok before, right?
-       @$(ECHO) Note that this command scps all stuff to the webserver,
-       @$(ECHO) it will not remove obsolete documents.
-       @$(ECHO) -------------------------------------------------------
-       chmod -R a+r doc/webserver
-       find doc/webserver -type d -exec chmod a+rx {} \;
-       cd doc/webserver && scp -Cr . ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-
-#############################################################################
-# Source file dependencies
-#############################################################################
-
-actions.@OBJEXT@:   actions.c   actions.h   config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h
-cgi.@OBJEXT@:       cgi.c       cgi.h       config.h $(PROJECT_H_DEPS) cgiedit.h cgisimple.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-cgiedit.@OBJEXT@:   cgiedit.c   cgiedit.h   config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-cgisimple.@OBJEXT@: cgisimple.c cgisimple.h config.h $(PROJECT_H_DEPS) cgi.h list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
-deanimate.@OBJEXT@: deanimate.c deanimate.h config.h $(PROJECT_H_DEPS)
-encode.@OBJEXT@:    encode.c    encode.h    config.h
-errlog.@OBJEXT@:    errlog.c    errlog.h    config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h
-filters.@OBJEXT@:   filters.c   filters.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h ssplit.h cgi.h deanimate.h @WIN_ONLY@win32.h 
-gateway.@OBJEXT@:   gateway.c   gateway.h   config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h
-jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h
-jcc.@OBJEXT@:       jcc.c       jcc.h       config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h cgi.h
-killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h
-list.@OBJEXT@:      list.c      list.h      config.h $(PROJECT_H_DEPS) list.h miscutil.h
-loadcfg.@OBJEXT@:   loadcfg.c   loadcfg.h   config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h @WIN_ONLY@w32log.h win32.h
-loaders.@OBJEXT@:   loaders.c   loaders.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h
-miscutil.@OBJEXT@:  miscutil.c  miscutil.h  config.h
-parsers.@OBJEXT@:   parsers.c   parsers.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h ssplit.h
-ssplit.@OBJEXT@:    ssplit.c    ssplit.h    config.h miscutil.h
-urlmatch.@OBJEXT@:  urlmatch.c  urlmatch.h  config.h $(PROJECT_H_DEPS) errlog.h miscutil.h ssplit.h
-
-# GNU regex
-gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h
-
-# PCRS
-pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h
-
-# PCRE
-pcre/get.@OBJEXT@:        pcre/get.c        pcre/config.h pcre/internal.h pcre/pcre.h
-pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h
-pcre/pcre.@OBJEXT@:       pcre/pcre.c       pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c 
-pcre/pcreposix.@OBJEXT@:  pcre/pcreposix.c  pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h
-pcre/study.@OBJEXT@:      pcre/study.c      pcre/config.h pcre/internal.h pcre/pcre.h
-
-# An auxiliary program makes the PCRE default character table source
-
-pcre/chartables.c:   pcre/dftables@EXEEXT@
-               pcre/dftables@EXEEXT@ >pcre/chartables.c
-
-pcre/dftables@EXEEXT@:       pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h
-               $(CC) -o pcre/dftables@EXEEXT@ $(CFLAGS) pcre/dftables.c
-
-# Win32
-w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32taskbar.h win32.h
-w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h
-win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h
-
-w32.res: w32.rc w32res.h icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/idle.ico icons/privoxy.ico config.h
-       windres -D__MINGW32__=0.2 -O coff -i $< -o $@
-
-# AmigaOS
-@AMIGAOS_ONLY@OBJS += amiga.o
-@AMIGAOS_ONLY@CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -m68020 -noixemul -fbaserel -msmall-code
-@AMIGAOS_ONLY@LDFLAGS += -m68020 -noixemul -fbaserel
-@AMIGAOS_ONLY@LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o
-@AMIGAOS_ONLY@amiga.o: amiga.c amiga.h config.h
-
-
-$(PROGRAM): $(OBJS) $(W32_FILES)
-       $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
-
-clean:
-       $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS) $(PROGRAM) junkbuster
-
-clobber: clean
-       $(RM) $(PROGRAM) cscope.* logfile *.pdb *.lib *.exp `find . -name tags` `find . -name TAGS` config.status config.h.in config.log junkbuster.log privoxy.log config.cache *~ *.tar.gz configure
-
-tags: $(SRCS) $(HDRS)
-       etags $(SRCS) $(HDRS)
-
-install: all
-       #
-       # FIXME: This is a dirty hack to have an install target
-       #        that works at least for some setups. This needs
-       #        to be fixed!
-       #
-       $(STRIP_PROG) $(PROGRAM)
-       $(INSTALL) $(PROGRAM) $(SBIN_DEST)
-       mkdir -p $(DEST)/user-manual
-       mkdir -p $(DEST)/templates
-       cp -r doc/webserver/user-manual $(DEST)
-       cp -r templates $(DEST)
-       $(INSTALL) config default.action default.filter trust $(DEST)
-       # FIXME $(ECHO) privoxy.logrotate privoxy.monthly privoxy.weekly
-       # FIXME: Need new manual! $(GZIP_PROG) -c privoxy.1 > $(MAN_DEST)/privoxy.1.gz
-       $(INSTALL) privoxy.init /etc/init.d/privoxy
-
-
-#############################################################################
-
-## Local Variables:
-## tab-width: 3
-## end:
-
-# $Log: GNUmakefile.in,v $
-# Revision 1.36  2002/03/27 14:58:08  swa
-# can be used by mutilple targets
-#
-# Revision 1.35  2002/03/27 14:53:19  swa
-# added solaris-dist
-#
-# Revision 1.34  2002/03/27 10:30:11  swa
-# we want a html man file on the webserver
-#
-# Revision 1.33  2002/03/27 03:05:35  hal9
-# Added man2html target for docs (redhat-dok only for now)
-#
-# Revision 1.32  2002/03/26 22:29:54  swa
-# we have a new homepage!
-#
-# Revision 1.31  2002/03/26 14:00:18  swa
-# fixed make tarball, tarball-dist, tarball-clean
-#
-# Revision 1.30  2002/03/25 12:52:25  swa
-# new targets
-#
-# Revision 1.29  2002/03/24 17:03:55  jongfoster
-# Name change
-#
-# Revision 1.28  2002/03/24 16:19:48  swa
-# configure needs to be generated.
-#
-# Revision 1.27  2002/03/24 16:13:57  swa
-# generated files are a nono in cvs
-#
-# Revision 1.26  2002/03/24 15:36:02  swa
-# did not build.
-#
-# Revision 1.25  2002/03/24 14:31:08  swa
-# remove more crappy files. set RPM
-# release version correctly.
-#
-# Revision 1.24  2002/03/24 14:19:55  swa
-# set rpm package release in configure.in. nowhere else.
-#
-# Revision 1.23  2002/03/24 13:06:49  swa
-# suse-clean now runs fine
-#
-# Revision 1.22  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.21  2002/03/24 12:43:57  swa
-# name change
-#
-# Revision 1.20  2002/03/24 11:39:17  jongfoster
-# Renaming config files
-#
-# Revision 1.19  2002/03/22 20:53:03  morcego
-# - Ongoing process to change name to JunkbusterNG
-# - configure/configure.in: no change needed
-# - GNUmakefile.in:
-#         - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#         - PROGRAM    = jbng@EXEEXT@
-#         - rh-spec now references as junkbusterng-rh.spec
-#         - redhat-upload: references changed to junkbusterng-* (package names)
-#         - tarball-dist: references changed to JunkbusterNG-distribution-*
-#         - tarball-src: now JunkbusterNG-*
-#         - install: initscript now junkbusterng.init and junkbusterng (when
-#                    installed)
-# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-# - junkbusterng.spec:
-#         - References to the expression ijb where changed where possible
-#         - New package name: junkbusterng (all in lower case, acording to
-#           the LSB recomendation)
-#         - Version changed to: 2.9.13
-#         - Release: 1
-#         - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#           right. If it obsoletes, why conflict ? Have to check it later)
-#         - Summary changed: Stefan, please check and aprove it
-#         - Changes description to use the new name
-#         - Sed string was NOT changed. Have to wait to the manpage to
-#           change first
-#         - Keeping the user junkbuster for now. It will require some aditional
-#           changes on the script (scheduled for the next specfile release)
-#         - Added post entry to move the old logfile to the new log directory
-#         - Removing "chkconfig --add" entry (not good to have it automaticaly
-#           added to the startup list).
-#         - Added preun section to stop the service with the old name, as well
-#           as remove it from the startup list
-#         - Removed the chkconfig --del entry from the conditional block on
-#           the preun scriptlet (now handled on the %files section)
-# - junkbuster.init: renamed to junkbusterng.init
-# - junkbusterng.init:
-#         - Changed JB_BIN to jbng
-#         - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#           be used where necessary (config dir)
-#
-# Aditional notes:
-# - The config directory is /etc/junkbuster yet. Have to change it on the
-# specfile, after it is changes on the code
-# - The only files that got renamed on the cvs tree were the rh specfile and
-# the init file. Some file references got changes on the makefile and on the
-# rh-spec (as listed above)
-#
-# Revision 1.18  2002/03/21 23:00:00  swa
-# want to autogenerate stuff.
-#
-# Revision 1.17  2002/03/19 19:30:04  morcego
-# - Fixing stylesheet checking on configure. If it is found, no further checks
-#   should be done
-#
-# - configure will now check for db2html or docbook2html (should work now
-#   on SuSe without the docbktls package)
-#
-# Revision 1.16  2002/03/14 22:32:32  hal9
-# Bumped the RPM version.
-#
-# Revision 1.15  2002/03/08 20:00:28  swa
-# some leftovers.
-#
-# Revision 1.14  2002/03/07 18:25:56  swa
-# synced redhat and suse build process
-#
-# Revision 1.13  2002/03/07 17:17:56  oes
-# (Hopefully) fixed for older make versions
-#
-# Revision 1.12  2002/03/07 15:28:27  swa
-# more informative
-#
-# Revision 1.11  2002/03/06 14:33:18  sarantis
-# Use proper temp file, not "abc".
-#
-# Revision 1.10  2002/03/06 14:19:35  sarantis
-# Cleanup PID_FILE_PATH from redhat-dist target
-#
-# Revision 1.9  2002/03/05 17:31:11  morcego
-# Search for docbook.dsl. Should solve portability problems for SuSe.
-#
-# Revision 1.8  2002/03/05 14:07:42  morcego
-# configure now detects rpm topdir, and change GNUmakefile acordingly
-#    (based on sugestion by Sarantis Paskalis)
-#
-# Revision 1.7  2002/03/05 13:43:28  morcego
-# Checking for text browser, so redhat-dok can work.
-#
-# Revision 1.6  2002/03/05 13:10:51  morcego
-# Changes to implement redhat-dok (Hal Burgiss)
-# Changes to make it work on other distros and out-of-the-shelf configurations
-#
-# Revision 1.5  2002/02/27 15:30:39  hal9
-# Reset $(RPM_PACKAGEV) to 1 (was 2)
-#
-# Revision 1.4  2002/01/17 21:44:04  jongfoster
-# Adding urlmatch.[ch]
-#
-# Revision 1.3  2002/01/04 15:26:08  oes
-# Added tarball-src target
-#
-# Revision 1.2  2001/12/30 14:07:31  steudten
-# - Add signal handling (unix)
-# - Add SIGHUP handler (unix)
-# - Add creation of pidfile (unix)
-# - Add action 'top' in rc file (RH)
-# - Add entry 'SIGNALS' to manpage
-# - Add exit message to logfile (unix)
-#
-# Revision 1.1  2001/12/01 11:22:57  jongfoster
-# Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of
-# make break in a more obvious way.
-# Adding .PHONY section.
-#
-# Revision 1.40  2001/12/01 00:24:11  jongfoster
-# Renaming various config files
-# Fixing CR->CRLF under Win32 (I hope)
-#
-# Revision 1.39  2001/11/06 12:07:30  steudten
-# Add --clean for building rpm in target redhat-dist.
-#
-# Revision 1.38  2001/11/05 21:35:23  steudten
-# Complete rewrite for the 'redhat-dist' target.
-# Checks for writeable RPM build directories for calling user.
-# So you must not be root, just set the modes to 1777 to
-# build a RH package.
-# Fix the upload-target to be arch independant.
-# Add target for 'solaris-dist' - coming soon.
-#
-# Revision 1.37  2001/11/01 00:52:04  hal9
-# Redhat-upload stuff per Stefan.
-#
-# Revision 1.36  2001/10/31 19:26:13  swa
-# automate process of uploading new releases
-# to sf.
-#
-# Revision 1.35  2001/10/15 22:14:59  joergs
-# Removed -O2 and -Wall from AmigaOS-only CFLAGS since they are now in
-#  the general CFLAGS already.
-#
-# Revision 1.34  2001/10/15 18:28:06  steudten
-# remove config.cache for target clobber.
-# Cleanup make dist for RH and S.u.S.E.
-#
-# Revision 1.33  2001/10/10 12:43:33  oes
-# Added ugly hack to make install target work at least for some setups.
-#
-# Revision 1.32  2001/10/09 22:38:19  jongfoster
-# Correcting actionsfile filename for Win32 INI build
-#
-# Revision 1.31  2001/09/23 10:13:48  swa
-# upload process established. run make webserver and
-# the documentation is moved to the webserver. documents
-# are now linked correctly.
-#
-# Revision 1.30  2001/09/19 17:55:49  oes
-# Fixed CFLAGS
-#
-# Revision 1.29  2001/09/16 17:34:27  jongfoster
-# Removing showargs.[ch], adding cgi(simple|edit).[ch]
-# Replacing $(OBJEXT) with @OBJEXT@ - this seems to be a common source
-# of build problems.
-#
-# Revision 1.28  2001/09/13 15:19:08  swa
-# we want text files as well.
-#
-# Revision 1.27  2001/09/13 13:11:37  steudten
-#
-# Replace DEBUG_CFLAGS with OTHER_CFLAGS
-#
-# Revision 1.26  2001/09/12 23:44:54  david__schmidt
-# Mac OSX (Darwin) support added.
-#
-# Revision 1.25  2001/09/12 22:55:45  joergs
-# AmigaOS support added.
-#
-# Revision 1.24  2001/09/12 17:28:59  david__schmidt
-#
-# OS/2 port: update autoconf'd support for the platform.
-#
-# Revision 1.23  2001/09/12 16:28:42  swa
-# added "make dok" section to generate html pages from
-# the sgml source documents. note that the we do not want
-# generated stuff in cvs.
-#
-# Revision 1.22  2001/09/10 16:31:23  swa
-# buildroot definition in the specfile fucks up the build
-# process under suse. hence I moved it to the "rpm -ta"
-# command
-#
-# Revision 1.21  2001/09/10 11:12:49  oes
-# Turning on -Wall
-#
-# Revision 1.20  2001/08/02 22:04:29  jongfoster
-# Removing some remaining references to obsolete w32rulesdlg.[ch]
-#
-# Revision 1.19  2001/07/30 22:14:03  jongfoster
-# Removing obsolete w32rulesdlg.c and w32rulesdlg.h
-#
-# Revision 1.18  2001/07/29 17:09:17  jongfoster
-# Major changes to build system in order to fix these bugs:
-# - pthreads under Linux was broken - changed -lpthread to -pthread
-# - Compiling in MinGW32 mode under CygWin now correctly detects
-#   which shared libraries are available
-# - Solaris support (?) (Not tested under Solaris yet)
-#
-# Revision 1.17  2001/07/28 16:44:54  oes
-# Fixed sed LF->CRLF conversion and removed deprecated files
-#
-# Revision 1.16  2001/07/15 19:45:33  jongfoster
-# Added support for linking with POSIX threads library
-#
-# Revision 1.15  2001/07/13 13:48:07  oes
-#  - Moved STATIC #define for pcre to (ac)config.h
-#  - Made -Ipcre depandant on static pcre compilation to
-#    avoid version conflicts
-#  - Included compilation and depandancies for new deanimate.c
-#  - Made changes to the pcre/pcreposix/pcrs build process
-#    as required by the new library autodetection in
-#    configure.in
-#
-# Revision 1.14  2001/07/01 16:27:44  oes
-# Fixed misplaced dependancy
-#
-# Revision 1.13  2001/06/29 13:18:36  oes
-# - added depandancy of filters.o on cgi.h
-#
-# Revision 1.12  2001/06/12 17:15:56  swa
-# fixes, because a clean build on rh6.1 was impossible.
-# GZIP confuses make, %configure confuses rpm, etc.
-#
-# Revision 1.11  2001/06/11 11:26:35  sarantis
-# RPM version should be the same as ijbswa version.  The rpm release is
-# specified in the specfile.
-#
-# Revision 1.10  2001/06/07 17:27:45  swa
-# added suse build section
-#
-# Revision 1.9  2001/06/04 18:31:58  swa
-# files are now prefixed with either `confdir' or `logdir'.
-# `make redhat-dist' replaces both entries confdir and logdir
-# with redhat values
-#
-# Revision 1.8  2001/06/04 10:44:57  swa
-# `make redhatr-dist' now works. Except for the paths
-# in the config file.
-#
-# Revision 1.7  2001/06/03 17:09:09  swa
-# swa for oes: reversed my earlier change
-#
-# Revision 1.6  2001/06/03 17:07:27  swa
-# swa for oes
-#
-# Revision 1.5  2001/06/03 13:57:26  swa
-# compile cgi.c (for andreas' GUI)
-#
-# Revision 1.4  2001/05/31 21:18:45  jongfoster
-# Added files actions.[ch], actionlist.h, list.[ch] to Makefile
-#
-# Revision 1.3  2001/05/29 20:02:48  joergs
-# Changes for AmigaOS added.
-#
-# Revision 1.2  2001/05/17 22:23:23  oes
-#  - Added auto-generation of CRLFs for Win32 config files
-#  - Added comment-prefix to all Win32-only options in the config file
-#    and provided auto stripping of this prefix for the Win32 platform by make
-#
-# Revision 1.1.1.1  2001/05/15 13:59:00  oes
-# Initial import of version 2.9.3 source tree
-#
-#
diff --git a/Junkbuster Status.URL b/Junkbuster Status.URL
new file mode 100644 (file)
index 0000000..6c95de6
Binary files /dev/null and b/Junkbuster Status.URL differ
diff --git a/LICENSE b/LICENSE
deleted file mode 100644 (file)
index 1bcc46f..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,342 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-\f
-                   GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-\f
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-\f
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-\f
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                           NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-           How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
-
diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index c195c8d..0000000
--- a/Makefile
+++ /dev/null
@@ -1,63 +0,0 @@
-# $Id: Makefile,v 1.2 2002/03/24 13:25:42 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# $Log: Makefile,v $
-# Revision 1.2  2002/03/24 13:25:42  swa
-# name change related issues
-#
-# Revision 1.1  2001/12/01 11:24:29  jongfoster
-# Will display a warning if non-GNU make is used
-#
-#
-
-#############################################################################
-
-error: GNUmakefile
-       @echo
-       @echo "ERROR!"
-       @echo "To build this program, you must run ./configure and then run GNU make."
-       @echo
-       @echo "You are not using the GNU version of Make - maybe it's called gmake"
-       @echo "or it's in a different directory?"
-       @echo
-
-GNUmakefile:
-       @echo
-       @echo "ERROR!"
-       @echo "To build this program, you must run ./configure and then run GNU make."
-       @echo
-       @echo "You haven't run ./configure yet."
-       @echo
-       @false
-
-.PHONY: error
-
-#############################################################################
-
-## Local Variables:
-## tab-width: 3
-## end:
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..338f97b
--- /dev/null
@@ -0,0 +1,352 @@
+# Note:  Makefile is built automatically from Makefile.in
+#
+# $Id: Makefile.in,v 1.12 2001/06/12 17:15:56 swa Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: Makefile.in,v $
+# Revision 1.12  2001/06/12 17:15:56  swa
+# fixes, because a clean build on rh6.1 was impossible.
+# GZIP confuses make, %configure confuses rpm, etc.
+#
+# Revision 1.11  2001/06/11 11:26:35  sarantis
+# RPM version should be the same as ijbswa version.  The rpm release is
+# specified in the specfile.
+#
+# Revision 1.10  2001/06/07 17:27:45  swa
+# added suse build section
+#
+# Revision 1.9  2001/06/04 18:31:58  swa
+# files are now prefixed with either `confdir' or `logdir'.
+# `make redhat-dist' replaces both entries confdir and logdir
+# with redhat values
+#
+# Revision 1.8  2001/06/04 10:44:57  swa
+# `make redhatr-dist' now works. Except for the paths
+# in the config file.
+#
+# Revision 1.7  2001/06/03 17:09:09  swa
+# swa for oes: reversed my earlier change
+#
+# Revision 1.6  2001/06/03 17:07:27  swa
+# swa for oes
+#
+# Revision 1.5  2001/06/03 13:57:26  swa
+# compile cgi.c (for andreas' GUI)
+#
+# Revision 1.4  2001/05/31 21:18:45  jongfoster
+# Added files actions.[ch], actionlist.h, list.[ch] to Makefile
+#
+# Revision 1.3  2001/05/29 20:02:48  joergs
+# Changes for AmigaOS added.
+#
+# Revision 1.2  2001/05/17 22:23:23  oes
+#  - Added auto-generation of CRLFs for Win32 config files
+#  - Added comment-prefix to all Win32-only options in the config file
+#    and provided auto stripping of this prefix for the Win32 platform by make
+#
+# Revision 1.1.1.1  2001/05/15 13:59:00  oes
+# Initial import of version 2.9.3 source tree
+#
+#
+
+
+# define version (will be wired into the rpm.)
+VERSION_MAJOR = @VERSION_MAJOR@
+VERSION_MINOR = @VERSION_MINOR@
+VERSION_POINT = @VERSION_POINT@
+VERSION       = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_POINT)
+# will automatically be postfixed with -$(RPM_PACKAGEV) in the SPECfile
+RPM_VERSION   = $(VERSION)
+RPM_PACKAGEV  = 1
+
+# The version is currently specified in config.h, which is
+# written by "configure".
+#
+#VERSION_CFLAGS = -DVERSION_MAJOR=$(VERSION_MAJOR) \
+#                 -DVERSION_MINOR=$(VERSION_MINOR) \
+#                 -DVERSION_POINT=$(VERSION_POINT) \
+#                 -DVERSION="$(VERSION)"
+
+# Directories for "make install"
+DEST        = /etc/junkbuster
+SBIN_DEST   = @sbindir@
+MAN_DEST    = @mandir@
+
+# The flag "-mno-win32" can be used by Cygwin to emulate a un?x type install.
+# The flag "-mwindows -mno-cygwin" will cause Cygwin to use MingW32 for Win32 install.
+CYGWIN_FLAGS = @CYGWIN_FLAGS@
+
+# Need to define this in order to link PCRE statically under Win32
+# Also define under UNIX to use system PCRE headers.
+PCRE_WIN_FLAGS = @STATIC_PCRE_ONLY@-DSTATIC
+
+# Either/Or of these next two lines
+#DEBUG_CFLAGS = -g
+DEBUG_CFLAGS  = -O3
+
+# Solaris needs a special define:
+# FIXME: This is always commented out
+SOLARIS_FLAGS = @SOLARIS_ONLY@-D__EXTENSIONS__=1
+
+#  -DSTDC_HEADERS Now in config.h
+# Do we need  -DHAVE_STRING  ???
+CFLAGS = @CFLAGS@ @CPPFLAGS@ \
+         -D__MT__=1 -D__STDC__=1 $(SOLARIS_FLAGS) -DHAVE_STRING $(DEBUG_CFLAGS) \
+         -Ipcre $(CYGWIN_FLAGS) $(PCRE_WIN_FLAGS)
+
+PROGRAM = junkbuster@EXEEXT@
+CC      = gcc
+ECHO    = echo
+GZIP_PROG    = gzip
+INSTALL = cp -f
+LD      = gcc
+OBJEXT  = @OBJEXT@
+RM      = rm -f
+STRIP_PROG   = strip
+
+C_SRC  = actions.c encode.c errlog.c filters.c gateway.c jbsockets.c \
+         jcc.c killpopup.c list.c loadcfg.c loaders.c miscutil.c \
+         parsers.c showargs.c ssplit.c cgi.c
+         
+C_OBJS = $(C_SRC:.c=.$(OBJEXT))
+C_HDRS = $(C_SRC:.c=.h) project.h actionlist.h
+
+W32_SRC   = @WIN_ONLY@w32log.c w32rulesdlg.c w32taskbar.c win32.c
+W32_FILES = @WIN_ONLY@w32.res
+W32_OBJS  = @WIN_ONLY@$(W32_SRC:.c=.$(OBJEXT)) $(W32_FILES)
+W32_HDRS  = @WIN_ONLY@w32log.h w32res.h w32rulesdlg.h w32taskbar.h
+W32_LIB   = @WIN_ONLY@-lwsock32 -lcomctl32
+W32_INIS  = @WIN_ONLY@junkbstr.txt saclfile.txt sblock.txt scookie.txt  \
+            @WIN_ONLY@sforward.txt simage.txt spopup.txt strust.txt sregexp.txt
+
+PCRS_SRC     = @PCRS_ONLY@pcrs.c
+PCRS_OBJS    = $(PCRS_SRC:.c=.$(OBJEXT))
+PCRS_HDRS    = $(PCRS_SRC:.c=.h)
+
+PCRE_SRC     = @STATIC_PCRE_ONLY@pcre/get.c pcre/maketables.c pcre/study.c pcre/pcre.c
+PCRE_OBJS    = @STATIC_PCRE_ONLY@$(PCRE_SRC:.c=.$(OBJEXT))
+PCRE_HDRS    = @STATIC_PCRE_ONLY@pcre/config.h pcre/chartables.c pcre/internal.h pcre/pcre.h
+PCRE_LIB     = @LIBRARY_PCRE_ONLY@-lpcre
+
+# No REGEX:
+@NO_REGEX_ONLY@REGEX_SRC    =
+# Without PCRE:
+@GNU_REGEX_ONLY@REGEX_SRC    = gnu_regex.c
+# With PCRE:
+@PCRE_REGEX_ONLY@REGEX_SRC    = @STATIC_PCRE_ONLY@pcre/pcreposix.c
+
+REGEX_OBJS   = $(REGEX_SRC:.c=.$(OBJEXT))
+REGEX_HDRS   = $(REGEX_SRC:.c=.h)
+
+# Dependencies introduced by #include "project.h".
+PROJECT_H_DEPS = project.h $(REGEX_HDRS) $(PCRS_HDRS) @STATIC_PCRE_ONLY@pcre/pcre.h
+
+# Only need this on Solaris
+# FIXME: This is always commented out
+SOCKET_LIB   = @SOLARIS_ONLY@-lsocket -lnsl
+
+LIBS         = $(PCRE_LIB) $(W32_LIB) $(SOCKET_LIB)
+
+SRCS         = $(C_SRC)  $(W32_SRC)  $(PCRS_SRC)  $(PCRE_SRC)  $(REGEX_SRC)
+OBJS         = $(C_OBJS) $(W32_OBJS) $(PCRS_OBJS) $(PCRE_OBJS) $(REGEX_OBJS)
+HDRS         = $(C_HDRS) $(W32_HDRS) $(PCRS_HDRS) $(PCRE_OBJS) $(REGEX_HDRS)
+
+
+# -------------------------------------------------------------------------
+# Do not change anything below this line
+# And there should NOT be any targets above this line.
+# -------------------------------------------------------------------------
+LDFLAGS = $(DEBUG_CFLAGS) $(CYGWIN_FLAGS)
+
+
+all: $(PROGRAM)
+
+
+SUFFIX     = .txt:o
+.SUFFIXES  : .txt
+
+%.txt:
+       sed -e 's/$$/&\r/' < $< > $@
+
+inifiles: $(W32_INIS)
+
+junkbstr.txt: config
+       sed     -e 's!\(/etc/junkbuster\|.\)/blocklist!sblock.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/popup!spopup.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/cookiefile!scookie.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/forward!sforward.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/trust!strust.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/aclfile!sacl.txt!' \
+                       -e 's!\(/var/log/junkbuster\|.\)/jarfile!jar.log!' \
+                       -e 's!\(/var/log/junkbuster\|.\)/junkbuster\.log!junkbstr.log!' \
+                       -e 's!\(/etc/junkbuster\|.\)/imagelist!simage.txt!' \
+                       -e 's!\(/etc/junkbuster\|.\)/re_filterfile!sregexp.txt!' \
+                       -e 's!$$!&\r!' \
+                       -e 's!#Win32-only: !!' \
+       < $< > $@
+
+saclfile.txt: aclfile
+sblock.txt: blocklist
+scookie.txt: cookiefile
+sforward.txt: forward
+simage.txt: imagelist
+spopup.txt: popup
+strust.txt: trust
+sregexp.txt: re_filterfile
+
+
+# -------------------------------------------------------------------------
+# redhat distribution
+# -------------------------------------------------------------------------
+redhat-dist:
+       @make clobber
+# verify that i'm root needs to be done
+       rm -f ../ijbswa.tar.gz
+# verify all version strings, FLAGS, etc. in the spec file
+       cat junkbuster-rh.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-rh.spec
+       tar --exclude "CVS" --exclude "junkbuster-suse.spec" -cvzf ../ijbswa.tar.gz .
+# verify all files in their correct location needs to be done
+       cd .. && rpm -ta ijbswa.tar.gz
+
+# -------------------------------------------------------------------------
+# suse distribution
+# -------------------------------------------------------------------------
+suse-dist:
+       @make clobber
+# verify that i'm root needs to be done
+       rm -f ../ijbswa.tar.gz
+# verify all version strings, FLAGS, etc. in the spec file
+       cat junkbuster-suse.spec | sed 's/^Version:.*/Version: $(RPM_VERSION)/g' | sed 's/^Release:.*/Release: $(RPM_PACKAGEV)/g' > /tmp/abc && cp -f /tmp/abc junkbuster-suse.spec
+       tar --exclude "CVS" --exclude "junkbuster-rh.spec" -cvzf ../ijbswa.tar.gz .
+# verify all files in their correct location needs to be done
+       cd .. && rpm -ta ijbswa.tar.gz
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+win-dist:
+       $(ECHO) Not implemented.
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+tarball-dist:
+       @make clean
+       make $(PROGRAM) 
+#      remove all objects and create the tarball with the binary
+       cd .. && $(RM) ijb/a.out ijb/core ijb/*.$(OBJEXT) && tar --exclude "ijb/CVS" -cvzf ../ijb-distribution-$(VERSION).tar.gz ijb/
+       chmod a+r ../../ijb-distribution-$(VERSION).tar.gz
+       @$(ECHO) Tarball with binary created.
+
+# -------------------------------------------------------------------------
+#
+# -------------------------------------------------------------------------
+
+actions.@OBJEXT@:   actions.c   actions.h   config.h $(PROJECT_H_DEPS) errlog.h jcc.h list.h loaders.h miscutil.h actionlist.h
+encode.@OBJEXT@:    encode.c    encode.h    config.h
+errlog.@OBJEXT@:    errlog.c    errlog.h    config.h $(PROJECT_H_DEPS) @WIN_ONLY@w32log.h
+filters.@OBJEXT@:   filters.c   filters.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jbsockets.h jcc.h loadcfg.h parsers.h showargs.h ssplit.h @WIN_ONLY@win32.h cgi.h
+gateway.@OBJEXT@:   gateway.c   gateway.h   config.h $(PROJECT_H_DEPS) errlog.h jbsockets.h jcc.h loadcfg.h
+jbsockets.@OBJEXT@: jbsockets.c jbsockets.h config.h $(PROJECT_H_DEPS) filters.h
+jcc.@OBJEXT@:       jcc.c       jcc.h       config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h killpopup.h loadcfg.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h cgi.h
+killpopup.@OBJEXT@: killpopup.c killpopup.h config.h $(PROJECT_H_DEPS) jcc.h loadcfg.h
+list.@OBJEXT@:      list.c      list.h      config.h $(PROJECT_H_DEPS) list.h miscutil.h
+loadcfg.@OBJEXT@:   loadcfg.c   loadcfg.h   config.h $(PROJECT_H_DEPS) errlog.h filters.h gateway.h jbsockets.h jcc.h killpopup.h loaders.h miscutil.h parsers.h showargs.h @WIN_ONLY@w32log.h win32.h
+loaders.@OBJEXT@:   loaders.c   loaders.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h ssplit.h
+miscutil.@OBJEXT@:  miscutil.c  miscutil.h  config.h
+parsers.@OBJEXT@:   parsers.c   parsers.h   config.h $(PROJECT_H_DEPS) errlog.h encode.h filters.h jbsockets.h jcc.h loadcfg.h loaders.h miscutil.h showargs.h ssplit.h
+showargs.@OBJEXT@:  showargs.c  showargs.h  config.h $(PROJECT_H_DEPS) errlog.h encode.h gateway.h jcc.h loadcfg.h miscutil.h parsers.h
+ssplit.@OBJEXT@:    ssplit.c    ssplit.h    config.h miscutil.h
+cgi.@OBJEXT@:       cgi.c       cgi.h       config.h $(PROJECT_H_DEPS) list.h pcrs.h encode.h ssplit.h jcc.h filters.h actions.h errlog.h miscutil.h
+
+# GNU regex
+gnu_regex.@OBJEXT@: gnu_regex.c gnu_regex.h config.h
+
+# PCRS
+pcrs.@OBJEXT@: pcrs.c pcre/pcre.h pcrs.h
+
+# PCRE
+pcre/get.@OBJEXT@:        pcre/get.c        pcre/config.h pcre/internal.h pcre/pcre.h
+pcre/maketables.@OBJEXT@: pcre/maketables.c pcre/config.h pcre/internal.h pcre/pcre.h
+pcre/pcre.@OBJEXT@:       pcre/pcre.c       pcre/config.h pcre/internal.h pcre/pcre.h pcre/chartables.c 
+pcre/pcreposix.@OBJEXT@:  pcre/pcreposix.c  pcre/config.h pcre/internal.h pcre/pcre.h pcre/pcreposix.h
+pcre/study.@OBJEXT@:      pcre/study.c      pcre/config.h pcre/internal.h pcre/pcre.h
+
+# An auxiliary program makes the PCRE default character table source
+
+pcre/chartables.c:   pcre/dftables
+               pcre/dftables >pcre/chartables.c
+
+pcre/dftables:       pcre/dftables.c pcre/maketables.c pcre/pcre.h pcre/internal.h pcre/config.h
+               $(CC) -o pcre/dftables $(CFLAGS) pcre/dftables.c
+
+# Win32
+w32log.@OBJEXT@: w32log.c errlog.h config.h jcc.h loadcfg.h miscutil.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h w32rulesdlg.h w32taskbar.h win32.h
+w32rulesdlg.@OBJEXT@: w32rulesdlg.c config.h w32rulesdlg.h win32.h
+w32taskbar.@OBJEXT@: w32taskbar.c config.h w32log.h w32taskbar.h
+win32.@OBJEXT@: win32.c config.h jcc.h loadcfg.h pcre/pcre.h pcre/pcreposix.h pcrs.h project.h w32log.h win32.h
+
+w32.res: w32.rc w32res.h icons/denyrule.ico icons/ico00001.ico icons/ico00002.ico icons/ico00003.ico icons/ico00004.ico icons/ico00005.ico icons/ico00006.ico icons/ico00007.ico icons/ico00008.ico icons/icon1.ico icons/idle.ico icons/junkbust.ico config.h
+       windres -D__MINGW32__=0.2 -O coff -i $< -o $@
+
+## AmigaOS, GCC 2.95.1 (or lower, 2.95.3 does NOT work!)
+#ifeq ($(shell $(CC) $(CFLAGS) -dumpmachine), m68k-amigaos)
+#OBJS += amiga.o
+#CFLAGS += -D__AMIGAVERSION__=\"$(VERSION_MAJOR).$(VERSION_MINOR)$(VERSION_POINT)\" -D__AMIGADATE__=\"`date +%d.%m.%Y`\" -W -Wall -m68020 -Os -noixemul -fbaserel -msmall-code
+#LDFLAGS += -m68020 -noixemul -fbaserel
+#LIBS = -lm /gg/lib/libb/libm020/libnix/swapstack.o
+#amiga.o: amiga.c amiga.h config.h
+#endif
+#
+
+$(PROGRAM): $(OBJS) $(W32_FILES)
+       $(LD) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS)
+
+clean:
+       $(RM) a.out core $(OBJS) $(W32_FILES) $(W32_INIS)
+
+clobber: clean
+       $(RM) $(PROGRAM) *.pdb *.lib *.exp TAGS junkbuster.log
+
+tags: $(SRCS) $(HDRS)
+       etags $(SRCS) $(HDRS)
+
+install: all
+       $(STRIP_PROG) $(PROGRAM)
+       $(INSTALL) $(PROGRAM) $(SBIN_DEST)
+       $(INSTALL) README README.TOO README.WIN README.re_filter README.cygwin $(DEST)
+       $(INSTALL) aclfile blocklist config cookiefile forward imagelist \
+               popup re_filterfile trust $(DEST)
+       # FIXME: On SuSE, these are not found.  Where do they go?
+       $(ECHO) junkbuster.logrotate junkbuster.monthly junkbuster.weekly
+       $(GZIP_PROG) -c junkbuster.1 > $(MAN_DEST)/junkbuster.1.gz
+       $(INSTALL) junkbuster.init /sbin/init.d/junkbuster
+
+
+## Local Variables:
+## tab-width: 3
+## end:
diff --git a/README b/README
deleted file mode 100644 (file)
index 2c3fc2c..0000000
--- a/README
+++ /dev/null
@@ -1,181 +0,0 @@
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/README,v $
- *
- * Purpose     :  README file to give a short intro.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- *********************************************************************/
-
-This README is included with the development version of Privoxy,
-which will eventually become Privoxy v3.0 (and soon we hope!). See
-http://www.privoxy.org/. The current code level is BETA, and seems 
-stable to us :)
-
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy
-has application for both stand-alone systems and multi-user
-networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-
- IMPORTANT CHANGES
-------------------
-
-NEWS! As of 03/24/02, the name of this project has been changed 
-from ijbswa/Junkbuster to Privoxy. This is reflected in many of the 
-included files. 
-
-WARNING! If upgrading from earlier versions of this project via 
-RPM packages, the new package will delete any previously installed 
-'Junkbuster' packages.
-
-IMPORTANT! READ! Configuration Change as of 3 Apr 2002: The default
-listening port is now 8118 due to conflicts with port 8000 assignment.
-You will need to change your browser if upgrading!!! And maybe
-firewall, etc.
-
-
- INSTALL
---------
-
-For tarball, first unpack:
-
- tar xzvf privoxy-2.9.13-beta-src.tar.gz
- cd privoxy-2.9.13-beta
-
- autoheader
- autoconf
- ./configure   (--help to see options)
- gmake         (the make from gnu) 
- su 
- make -n install       (to see where all the files will go)
- make install          (to really install)
-
-Redhat and SuSE src and binary RPMs can be built with 'make
-redhat-dist' or 'make suse-dist' (run ./configure first) from unpacked
-sources. BSD will (probably?) require gmake (from http://gnu.org). See
-the user-manual for OS/2 build instructions.
-
-Privoxy is also available via anonymous CVS:
-
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current
-
-This will create a directory named 'current'. Then, 'cd current', and
-then build as above.
-
-
- RUN
-----
-
-privoxy [--help] [--version] [--no-daemon] [--pidfile PIDFILE] 
- [--user USER] [config_file]
-
-Or for RedHat: /etc/rc.d/init.d/privoxy start
-Or for SuSE:   /etc/rc.d/privoxy start
-
-See the man page or user-manual for a brief explanation of each.
-
-
- CONFIGURATION
---------------
-
-See: 'config', '*.action', and 'default.filter'. These are all well
-commented. Most of the magic is in '*.action', and there are several 
-of these included with varying degrees of aggressiveness. On Unix-like
-systems, these files are installed in /etc/privoxy.  On Windows, then wherever
-the executable itself is installed. There are many significant changes and
-advances since Junkbuster v2.0.x. The user-manual has a run down of
-configuration options, and examples: http://www.privoxy.org/user-manual/.
-
-Be sure to set your browser(s) for HTTP/HTTPS Proxy at <IP>:<Port>, or
-whatever you specify in the config file under 'listen-address'.
-DEFAULT is localhost:8118.
-
-The default.action file can be configured via the web interface accessed
-via http://p.p/, as well other options.
-
-
- DOCUMENTATION
---------------
-
-There is a growing amount of documentation in the 'doc' subdirectory,
-but it is not finished at this point. In particular, see the
-user-manual there, and developers should look at developer-manual.
-
-The most up to date source of information on the current development version,
-may still be either comments in the source code, or the included configuration
-files, which are all well commented. These are 'config', '*.action', and
-'default.filter' in the toplevel source directory.
-
-Some legacy Junkbuster documentation may also be included only to give an idea
-of what Privoxy can do under doc/obsolete/*. Much has changed since these docs
-were written, so beware.
-
-Included documentation may vary according to platform and packager.
-
-
- CONTACTING THE DEVELOPERS, BUG REPORTING AND FEATURE REQUESTS
---------------------------------------------------------------
-
-We value your feedback. However, to provide you with the best support,
-please note:
-   
- * Use the support forum to get help:
-   http://sourceforge.net/tracker/?group_id=11118&atid=211118
- * Submit bugs only thru our bug forum:
-   http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-   Make sure that the bug has not already been submitted. Please try
-   to verify that it is a Privoxy bug, and not a browser or site
-   bug first. If you are using your own custom configuration, please
-   try the stock configs to see if the problem is a configuration
-   related bug. And if not using the latest development snapshot,
-   please try the latest one. Or even better, CVS sources.
- * Submit feature requests only thru our feature request forum:
-   http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-     
-For any other issues, feel free to use the mailing lists:
-http://sourceforge.net/mail/?group_id=11118
-   
-Anyone interested in actively participating in development and related
-discussions can join the appropriate mailing list here:
-http://sourceforge.net/mail/?group_id=11118. Archives are available
-here too.
-
--------------------------------------------------------------------------
-ijbswa-developers@lists.sourceforge.net
-
-$Id: README,v 1.21 2002/03/26 22:29:54 swa Exp $
index bf746a6..bee43ab 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+#ifndef _CONFIG_H
+#define _CONFIG_H
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/acconfig.h,v $
@@ -11,7 +11,7 @@
  *                getting ludicrously long with feature defines.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: acconfig.h,v $
- *    Revision 1.21  2002/03/24 14:31:08  swa
- *    remove more crappy files. set RPM
- *    release version correctly.
- *
- *    Revision 1.20  2002/03/24 13:46:44  swa
- *    name change related issue.
- *
- *    Revision 1.19  2002/03/24 13:25:42  swa
- *    name change related issues
- *
- *    Revision 1.18  2002/03/08 16:40:28  oes
- *    Added FEATURE_NO_GIFS
- *
- *    Revision 1.17  2002/03/04 17:52:44  oes
- *    Deleted PID_FILE_PATH
- *
- *    Revision 1.16  2002/01/10 12:36:18  oes
- *    Moved HAVE_*_R to acconfig.h, where they belong.
- *
- *    Revision 1.15  2001/12/30 14:07:31  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.14  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.13  2001/10/07 15:30:41  oes
- *    Removed FEATURE_DENY_GZIP
- *
- *    Revision 1.12  2001/09/13 19:56:37  jongfoster
- *    Reverting to revision 1.10 - previous checking was majorly broken.
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 19:08:52  jongfoster
- *    Changing _CONFIG_H to CONFIG_H_INCLUDED.
- *    Also added protection against using a MinGW32 or CygWin version of
- *    config.h from within MS Visual C++
- *
- *    Revision 1.8  2001/07/29 17:09:17  jongfoster
- *    Major changes to build system in order to fix these bugs:
- *    - pthreads under Linux was broken - changed -lpthread to -pthread
- *    - Compiling in MinGW32 mode under CygWin now correctly detects
- *      which shared libraries are available
- *    - Solaris support (?) (Not tested under Solaris yet)
- *
- *    Revision 1.7  2001/07/25 22:53:59  jongfoster
- *    Will #error if pthreads is enabled under BeOs
- *
- *    Revision 1.6  2001/07/15 17:54:29  jongfoster
- *    Renaming #define STATIC to STATIC_PCRE
- *    Adding new #define FEATURE_PTHREAD that will be used to enable
- *    POSIX threads support.
- *
- *    Revision 1.5  2001/07/13 13:48:37  oes
- *     - (Fix:) Copied CODE_STATUS #define from config.h.in
- *     - split REGEX #define into REGEX_GNU and REGEX_PCRE
- *       and removed PCRE.
- *       (REGEX = REGEX_GNU || REGEX_PCRE per project.h)
- *     - Moved STATIC (for pcre) here from Makefile.in
- *     - Introduced STATIC_PCRS #define to allow for dynaimc linking with
- *       libpcrs
- *     - Removed PCRS #define, since pcrs is now needed for CGI anyway
- *
- *    Revision 1.4  2001/05/29 09:50:24  jongfoster
- *    Unified blocklist/imagelist/permissionslist.
- *    File format is still under discussion, but the internal changes
- *    are (mostly) done.
- *
- *    Also modified interceptor behaviour:
- *    - We now intercept all URLs beginning with one of the following
- *      prefixes (and *only* these prefixes):
- *        * http://i.j.b/
- *        * http://ijbswa.sf.net/config/
- *        * http://ijbswa.sourceforge.net/config/
- *    - New interceptors "home page" - go to http://i.j.b/ to see it.
- *    - Internal changes so that intercepted and fast redirect pages
- *      are not replaced with an image.
- *    - Interceptors now have the option to send a binary page direct
- *      to the client. (i.e. ijb-send-banner uses this)
- *    - Implemented show-url-info interceptor.  (Which is why I needed
- *      the above interceptors changes - a typical URL is
- *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
- *      The previous mechanism would not have intercepted that, and
- *      if it had been intercepted then it then it would have replaced
- *      it with an image.)
- *
  *    Revision 1.3  2001/05/26 01:26:34  jongfoster
  *    New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
  *    This #define cannot be set from ./configure - there's no point, it
  */
 #undef VERSION_POINT
 
-/*
- * Version number - RPM-release
- */
-#undef VERSION_RPM_PACKAGE
-
 /*
  * Version number, as a string
  */
 #undef VERSION
 
 /*
- * Status of the code: "alpha", "beta" or "stable".
+ * Regular expression matching for URLs.  (Highly recommended).  If this is 
+ * not defined then you can ony use prefix matching.
  */
-#undef CODE_STATUS
+#undef REGEX
 
 /*
- * Regular expression matching for URLs.  (Highly recommended).
- * If neither of these are defined then you can ony use prefix matching.
- * Don't bother to change this here! Use configure instead.
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
  */
-#undef REGEX_GNU
-#undef REGEX_PCRE
+#undef TOGGLE
 
-/* 
- * Should pcre be statically built in instead of linkling with libpcre?
- * (This is determined by configure depending on the availiability of
- * libpcre and user preferences). The name is ugly, but pcre needs it.
- * Don't bother to change this here! Use configure instead.
+/*
+ * Enables arbitrary content modification regexps
  */
-#undef STATIC_PCRE
+#undef PCRS
 
-/* 
- * Should pcrs be statically built in instead of linkling with libpcrs?
- * (This is determined by configure depending on the availiability of
- * libpcrs and user preferences).
- * Don't bother to change this here! Use configure instead.
+/*
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
  */
-#undef STATIC_PCRS
+#undef DENY_GZIP
 
 /*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * Enables statistics function.
  */
-#undef FEATURE_ACL
+#undef STATISTICS
 
 /*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
+ * Bypass filtering for 1 page only
  */
-#undef FEATURE_CGI_EDIT_ACTIONS
+#undef FORCE_LOAD
 
 /*
- * Allows the use of jar files to capture cookies.
+ * Locally redirect remote script-redirect URLs
  */
-#undef FEATURE_COOKIE_JAR
+#undef FAST_REDIRECTS
 
 /*
- * Locally redirect remote script-redirect URLs
+ * Split the show-proxy-args page into a page for each config file.
  */
-#undef FEATURE_FAST_REDIRECTS
+#undef SPLIT_PROXY_ARGS
 
 /*
- * Bypass filtering for 1 page only
+ * Kills JavaScript popups - window.open, onunload, etc.
  */
-#undef FEATURE_FORCE_LOAD
+#undef KILLPOPUPS
 
 /*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
  */
-#undef FEATURE_IMAGE_BLOCKING
+#undef WEBDAV
 
 /*
  * Detect image requests automatically for MSIE.  Will fall back to
  * other image-detection methods (i.e. "+image" permission) for other
  * browsers.
  *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
  *
  * It detects the following header pair as an image request:
  *
  * These limitations are due to IE making inconsistent choices
  * about which "Accept:" header to send.
  */
-#undef FEATURE_IMAGE_DETECT_MSIE
-
-/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#undef FEATURE_KILL_POPUPS
-
-/*
- * Use PNG instead of GIF for built-in images
- */
-#undef FEATURE_NO_GIFS
-
-/*
- * Use POSIX threads instead of native threads.
- */
-#undef FEATURE_PTHREAD
+#undef DETECT_MSIE_IMAGES
 
 /*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
  */
-#undef FEATURE_STATISTICS
+#undef IMAGE_BLOCKING
 
 /*
- * Allow Privoxy to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
  */
-#undef FEATURE_TOGGLE
+#undef ACL_FILES
 
 /*
  * Allows the use of trust files.
  */
-#undef FEATURE_TRUST
+#undef TRUST_FILES
 
 /*
- * Defined on Solaris only.  Makes the system libraries thread safe.
+ * Allows the use of jar files to capture cookies.
  */
-#undef _REENTRANT
+#undef JAR_FILES
 
 /*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
+ * Use PCRE rather than GNU Regex
  */
-#undef __EXTENSIONS__
+#undef PCRE
 
 /*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
- */
-#undef __MT__
-
-/* If the (nonstandard and thread-safe) function gethostbyname_r
- * is available, select which signature to use
+ * Define this to use the Windows GUI for editing the blocklist.
+ * FIXME: This feature is only partially implemented and does not work
+ * FIXME: This #define can never be set by ./configure.
  */
-#undef HAVE_GETHOSTBYNAME_R_6_ARGS
-#undef HAVE_GETHOSTBYNAME_R_5_ARGS
-#undef HAVE_GETHOSTBYNAME_R_3_ARGS
-
-/* If the (nonstandard and thread-safe) function gethostbyaddr_r
- * is available, select which signature to use
- */
-#undef HAVE_GETHOSTBYADDR_R_8_ARGS
-#undef HAVE_GETHOSTBYADDR_R_7_ARGS
-#undef HAVE_GETHOSTBYADDR_R_5_ARGS
-
-/* Define if you have gmtime_r and localtime_r with a signature
- * of (struct time *, struct tm *)
- */
-#undef HAVE_GMTIME_R
-#undef HAVE_LOCALTIME_R
+#undef WIN_GUI_EDIT
 
 @BOTTOM@
 
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-#ifndef __STDC__
-#define __STDC__ 1
-#endif /* ndef __STDC__ */
-
-/*
- * Need to set up this define only for the Pthreads library for
- * Win32, available from http://sources.redhat.com/pthreads-win32/
- */
-#if defined(FEATURE_PTHREAD) && defined(_WIN32)
-#define __CLEANUP_C
-#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
-
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-/*
- * It's too easy to accidentally use a Cygwin or MinGW32 version of config.h
- * under VC++, and it usually gives many wierd error messages.  Let's make
- * the error messages understandable, by bailing out now.
- */
-#ifdef _MSC_VER
-#error For MS VC++, please use config.h.win or config.h.win32threads.win.  You can usually do this by selecting the "Build", "Clean" menu option.
-#endif /* def _MSC_VER */
-
-#endif /* CONFIG_H_INCLUDED */
+#endif /* _CONFIG_H */
index c2ae6b4..beafdb5 100644 (file)
@@ -13,7 +13,7 @@
  *                    DEFINE_ACTION_ALIAS
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: actionlist.h,v $
- *    Revision 1.14  2002/03/24 16:32:08  jongfoster
- *    Removing logo option
- *
- *    Revision 1.13  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/12 01:42:49  oes
- *    Introduced modular filters
- *
- *    Revision 1.10  2002/03/08 18:19:14  jongfoster
- *    Adding +image-blocker{pattern} option to edit interface
- *
- *    Revision 1.9  2001/11/22 21:58:41  jongfoster
- *    Adding action +no-cookies-keep
- *
- *    Revision 1.8  2001/10/10 16:42:52  oes
- *    Fixed a bug, Added +limit-connect string action
- *
- *    Revision 1.7  2001/10/07 15:33:59  oes
- *    Introduced a +no-compression action
- *    Introduced a +downgrade action
- *
- *    Revision 1.6  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.5  2001/07/18 12:27:03  oes
- *    Changed deanimate-gifs to string action
- *
- *    Revision 1.4  2001/07/13 13:52:12  oes
- *     - Formatting
- *     - Introduced new action ACTION_DEANIMATE
- *
- *    Revision 1.3  2001/06/07 23:03:56  jongfoster
- *    Added standard comment at top of file.
- *
  *
  *********************************************************************/
 \f
 
-#if !(defined(DEFINE_ACTION_BOOL) && defined(DEFINE_ACTION_MULTI) && defined(DEFINE_ACTION_STRING))
-#error Please define lots of macros before including "actionlist.h".
-#endif /* !defined(all the DEFINE_ACTION_xxx macros) */
-
-#ifndef DEFINE_CGI_PARAM_RADIO
-#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default)
-#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val)
-#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val)
-#endif /* ndef DEFINE_CGI_PARAM_RADIO */
-
-DEFINE_ACTION_MULTI      ("add-header",      ACTION_MULTI_ADD_HEADER)
-DEFINE_ACTION_BOOL       ("block",           ACTION_BLOCK)
-DEFINE_ACTION_STRING     ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE)
-DEFINE_CGI_PARAM_RADIO   ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE,     "first", 0)
-DEFINE_CGI_PARAM_RADIO   ("deanimate-gifs",  ACTION_DEANIMATE,       ACTION_STRING_DEANIMATE,     "last",  1)
-DEFINE_ACTION_BOOL       ("downgrade",       ACTION_DOWNGRADE)
-DEFINE_ACTION_BOOL       ("fast-redirects",  ACTION_FAST_REDIRECTS)
-DEFINE_ACTION_MULTI      ("filter",          ACTION_MULTI_FILTER)
-DEFINE_ACTION_BOOL       ("hide-forwarded",  ACTION_HIDE_FORWARDED)
-DEFINE_ACTION_STRING     ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM)
-DEFINE_CGI_PARAM_RADIO   ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM,          "block", 1)
-DEFINE_CGI_PARAM_CUSTOM  ("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM,          "spam_me_senseless@sittingduck.xyz")
-DEFINE_ACTION_STRING     ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
-DEFINE_CGI_PARAM_RADIO   ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "forge", 1)
-DEFINE_CGI_PARAM_RADIO   ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "block", 0)
-DEFINE_CGI_PARAM_CUSTOM  ("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER,       "http://www.google.com/")
-DEFINE_ACTION_STRING     ("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT)
-DEFINE_CGI_PARAM_NO_RADIO("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT,    "Privoxy/3.0 (Anonymous)")
-DEFINE_ACTION_BOOL       ("image",           ACTION_IMAGE)
-DEFINE_ACTION_STRING     ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER)
-DEFINE_CGI_PARAM_RADIO   ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, "pattern", 1)
-DEFINE_CGI_PARAM_RADIO   ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, "blank", 0)
-DEFINE_CGI_PARAM_CUSTOM  ("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER, CGI_PREFIX "show-banner?type=pattern")
-DEFINE_ACTION_STRING     ("limit-connect",   ACTION_LIMIT_CONNECT,   ACTION_STRING_LIMIT_CONNECT)
-DEFINE_CGI_PARAM_NO_RADIO("limit-connect",   ACTION_LIMIT_CONNECT,   ACTION_STRING_LIMIT_CONNECT,  "443")
-DEFINE_ACTION_BOOL       ("no-compression",  ACTION_NO_COMPRESSION)
-DEFINE_ACTION_BOOL       ("no-cookies-keep", ACTION_NO_COOKIE_KEEP)
-DEFINE_ACTION_BOOL       ("no-cookies-read", ACTION_NO_COOKIE_READ)
-DEFINE_ACTION_BOOL       ("no-cookies-set",  ACTION_NO_COOKIE_SET)
-DEFINE_ACTION_BOOL       ("no-popups",       ACTION_NO_POPUPS)
-DEFINE_ACTION_BOOL       ("vanilla-wafer",   ACTION_VANILLA_WAFER)
-DEFINE_ACTION_MULTI      ("wafer",           ACTION_MULTI_WAFER)
+DEFINE_ACTION_MULTI ("add-header",                              ACTION_MULTI_ADD_HEADER)
+DEFINE_ACTION_BOOL  ("block",           ACTION_BLOCK)
+DEFINE_ACTION_BOOL  ("fast-redirects",  ACTION_FAST_REDIRECTS)
+DEFINE_ACTION_BOOL  ("filter",          ACTION_FILTER)
+DEFINE_ACTION_BOOL  ("hide-forwarded",  ACTION_HIDE_FORWARDED)
+DEFINE_ACTION_STRING("hide-from",       ACTION_HIDE_FROM,       ACTION_STRING_FROM)
+DEFINE_ACTION_STRING("hide-referer",    ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
+DEFINE_ACTION_STRING("hide-user-agent", ACTION_HIDE_USER_AGENT, ACTION_STRING_USER_AGENT)
+DEFINE_ACTION_BOOL  ("image",           ACTION_IMAGE)
+DEFINE_ACTION_STRING("image-blocker",   ACTION_IMAGE_BLOCKER,   ACTION_STRING_IMAGE_BLOCKER)
+DEFINE_ACTION_BOOL  ("no-cookies-read", ACTION_NO_COOKIE_READ)
+DEFINE_ACTION_BOOL  ("no-cookies-set",  ACTION_NO_COOKIE_SET)
+DEFINE_ACTION_BOOL  ("no-popups",       ACTION_NO_POPUPS)
+DEFINE_ACTION_BOOL  ("vanilla-wafer",   ACTION_VANILLA_WAFER)
+DEFINE_ACTION_MULTI ("wafer",                                   ACTION_MULTI_WAFER)
 #if DEFINE_ACTION_ALIAS
-DEFINE_ACTION_BOOL       ("no-popup",        ACTION_NO_POPUPS)
-DEFINE_ACTION_STRING     ("hide-referrer",   ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
+DEFINE_ACTION_BOOL  ("no-popup",        ACTION_NO_POPUPS)
+DEFINE_ACTION_STRING("hide-referrer",   ACTION_HIDE_REFERER,    ACTION_STRING_REFERER)
 #endif /* if DEFINE_ACTION_ALIAS */
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef DEFINE_CGI_PARAM_CUSTOM
-#undef DEFINE_CGI_PARAM_RADIO
-#undef DEFINE_CGI_PARAM_NO_RADIO
-
index e0f3fca..e4e5aaf 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,4 +1,4 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $";
+const char actions_rcs[] = "$Id: actions.c,v 1.7 2001/06/09 10:55:28 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.c,v $
@@ -7,13 +7,13 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
  *                Functions declared include: FIXME
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -33,88 +33,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: actions.c,v $
- *    Revision 1.25  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.24  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.23  2002/03/07 03:46:16  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.22  2002/01/21 00:27:02  jongfoster
- *    Allowing free_action(NULL).
- *    Moving the functions that #include actionlist.h to the end of the file,
- *    because the Visual C++ 97 debugger gets extremely confused if you try
- *    to debug any code that comes after them in the file.
- *
- *    Revision 1.21  2002/01/17 20:54:44  jongfoster
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.20  2001/11/22 21:56:49  jongfoster
- *    Making action_spec->flags into an unsigned long rather than just an
- *    unsigned int.
- *    Fixing a bug in the display of -add-header and -wafer
- *
- *    Revision 1.19  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.18  2001/11/07 00:06:06  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile.
- *
- *    Revision 1.17  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.16  2001/10/23 21:30:30  jongfoster
- *    Adding error-checking to selected functions.
- *
- *    Revision 1.15  2001/10/14 21:58:22  jongfoster
- *    Adding support for the CGI-based editor:
- *    - Exported get_actions()
- *    - Added new function free_alias_list()
- *    - Added support for {{settings}} and {{description}} blocks
- *      in the actions file.  They are currently ignored.
- *    - Added restriction to only one {{alias}} block which must appear
- *      first in the file, to simplify the editor's rewriting rules.
- *    - Note that load_actions_file() is no longer used by the CGI-based
- *      editor, but some of the other routines in this file are.
- *
- *    Revision 1.14  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.13  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.12  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.11  2001/09/14 00:17:32  jongfoster
- *    Tidying up memory allocation. New function init_action().
- *
- *    Revision 1.10  2001/09/10 10:14:34  oes
- *    Removing unused variable
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/06/29 13:19:52  oes
- *    Removed logentry from cancelled commit
- *
  *    Revision 1.7  2001/06/09 10:55:28  jongfoster
  *    Changing BUFSIZ ==> BUFFER_SIZE
  *
@@ -146,8 +64,6 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
 
 #include <stdio.h>
 #include <string.h>
-#include <assert.h>
-#include <stdlib.h>
 
 #include "project.h"
 #include "jcc.h"
@@ -156,14 +72,27 @@ const char actions_rcs[] = "$Id: actions.c,v 1.25 2002/03/24 13:25:43 swa Exp $"
 #include "miscutil.h"
 #include "errlog.h"
 #include "loaders.h"
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-#include "encode.h"
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#include "urlmatch.h"
 
 const char actions_h_rcs[] = ACTIONS_H_VERSION;
 
 
+/* Turn off everything except forwarding */
+/* This structure is used to hold user-defined aliases */
+struct action_alias
+{
+   const char * name;
+   struct action_spec action[1];
+   struct action_alias * next;
+};
+
+
+/*
+ * Must declare this in this file for the above structure.
+ */
+static int get_actions (char *line, 
+                        struct action_alias * alias_list,
+                        struct action_spec *cur_action);
+
 /*
  * We need the main list of options.
  *
@@ -178,10 +107,10 @@ const char actions_h_rcs[] = ACTIONS_H_VERSION;
 #define AV_ADD_STRING 1 /* +stropt{string} */
 #define AV_REM_STRING 2 /* -stropt */
 #define AV_ADD_MULTI  3 /* +multiopt{string} +multiopt{string2} */
-#define AV_REM_MULTI  4 /* -multiopt{string} -multiopt          */
+#define AV_REM_MULTI  4 /* -multiopt{string} -multiopt{*}       */
 
 /*
- * We need a structure to hold the name, flag changes,
+ * We need a structure to hold the name, flag changes, 
  * type, and string index.
  */
 struct action_name
@@ -237,14 +166,13 @@ static const struct action_name action_names[] =
  *          1  :  cur_action = Current actions, to modify.
  *          2  :  new_action = Action to add.
  *
- * Returns     :  JB_ERR_OK or JB_ERR_MEMORY
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err merge_actions (struct action_spec *dest,
-                      const struct action_spec *src)
+void merge_actions (struct action_spec *dest, 
+                    const struct action_spec *src)
 {
    int i;
-   jb_err err;
 
    dest->mask &= src->mask;
    dest->add  &= src->mask;
@@ -257,10 +185,6 @@ jb_err merge_actions (struct action_spec *dest,
       {
          freez(dest->string[i]);
          dest->string[i] = strdup(str);
-         if (NULL == dest->string[i])
-         {
-            return JB_ERR_MEMORY;
-         }
       }
    }
 
@@ -269,10 +193,10 @@ jb_err merge_actions (struct action_spec *dest,
       if (src->multi_remove_all[i])
       {
          /* Remove everything from dest */
-         list_remove_all(dest->multi_remove[i]);
+         destroy_list(dest->multi_remove[i]);
+         destroy_list(dest->multi_add[i]);
          dest->multi_remove_all[i] = 1;
-
-         err = list_duplicate(dest->multi_add[i], src->multi_add[i]);
+         list_duplicate(dest->multi_add[i], src->multi_add[i]);
       }
       else if (dest->multi_remove_all[i])
       {
@@ -281,23 +205,16 @@ jb_err merge_actions (struct action_spec *dest,
           * about what we add.
           */
          list_remove_list(dest->multi_add[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
+         list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
       }
       else
       {
          /* No "remove all"s to worry about. */
          list_remove_list(dest->multi_add[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]);
-         if (!err) err = list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
-      }
-
-      if (err)
-      {
-         return err;
+         list_append_list_unique(dest->multi_remove[i], src->multi_remove[i]);
+         list_append_list_unique(dest->multi_add[i], src->multi_add[i]);
       }
    }
-
-   return JB_ERR_OK;
 }
 
 
@@ -307,8 +224,6 @@ jb_err merge_actions (struct action_spec *dest,
  *
  * Description :  Copy an action_specs.
  *                Similar to "cur_action = new_action".
- *                Note that dest better not contain valid data
- *                - it's overwritten, not freed.
  *
  * Parameters  :
  *          1  :  dest = Destination of copy.
@@ -317,13 +232,10 @@ jb_err merge_actions (struct action_spec *dest,
  * Returns     :  N/A
  *
  *********************************************************************/
-jb_err copy_action (struct action_spec *dest,
-                    const struct action_spec *src)
+void copy_action (struct action_spec *dest, 
+                  const struct action_spec *src)
 {
    int i;
-   jb_err err = JB_ERR_OK;
-
-   memset(dest, '\0', sizeof(*dest));
 
    dest->mask = src->mask;
    dest->add  = src->add;
@@ -331,32 +243,15 @@ jb_err copy_action (struct action_spec *dest,
    for (i = 0; i < ACTION_STRING_COUNT; i++)
    {
       char * str = src->string[i];
-      if (str)
-      {
-         str = strdup(str);
-         if (!str)
-         {
-            return JB_ERR_MEMORY;
-         }
-         dest->string[i] = str;
-      }
+      dest->string[i] = (str ? strdup(str) : NULL);
    }
 
    for (i = 0; i < ACTION_MULTI_COUNT; i++)
    {
       dest->multi_remove_all[i] = src->multi_remove_all[i];
-      err = list_duplicate(dest->multi_remove[i], src->multi_remove[i]);
-      if (err)
-      {
-         return err;
-      }
-      err = list_duplicate(dest->multi_add[i],    src->multi_add[i]);
-      if (err)
-      {
-         return err;
-      }
+      list_duplicate(dest->multi_remove[i], src->multi_remove[i]);
+      list_duplicate(dest->multi_add[i],    src->multi_add[i]);
    }
-   return err;
 }
 
 
@@ -364,9 +259,7 @@ jb_err copy_action (struct action_spec *dest,
  *
  * Function    :  free_action
  *
- * Description :  Destroy an action_spec.  Frees memory used by it,
- *                except for the memory used by the struct action_spec
- *                itself.
+ * Description :  Free an action_specs.
  *
  * Parameters  :
  *          1  :  src = Source to free.
@@ -378,11 +271,6 @@ void free_action (struct action_spec *src)
 {
    int i;
 
-   if (src == NULL)
-   {
-      return;
-   }
-
    for (i = 0; i < ACTION_STRING_COUNT; i++)
    {
       freez(src->string[i]);
@@ -418,14 +306,14 @@ void free_action (struct action_spec *src)
  *                       we found an action.
  *          2  :  name = [out] Start of action name, null
  *                       terminated.  NULL on EOL
- *          3  :  value = [out] Start of action value, null
+ *          3  :  value = [out] Start of action value, null 
  *                        terminated.  NULL if none or EOL.
  *
- * Returns     :  JB_ERR_OK => Ok
- *                JB_ERR_PARSE => Mismatched {} (line was trashed anyway)
+ * Returns     :  0 => Ok
+ *                nonzero => Mismatched {} (line was trashed anyway)
  *
  *********************************************************************/
-jb_err get_action_token(char **line, char **name, char **value)
+int get_action_token(char **line, char **name, char **value)
 {
    char * str = *line;
    char ch;
@@ -449,19 +337,19 @@ jb_err get_action_token(char **line, char **name, char **value)
    if (*str == '{')
    {
       /* null name, just value is prohibited */
-      return JB_ERR_PARSE;
+      return 1;
    }
 
    *name = str;
 
    /* parse option */
-   while (((ch = *str) != '\0') &&
+   while (((ch = *str) != '\0') && 
           (ch != ' ') && (ch != '\t') && (ch != '{'))
    {
       if (ch == '}')
       {
-         /* error, '}' without '{' */
-         return JB_ERR_PARSE;
+         /* error */
+         return 1;
       }
       str++;
    }
@@ -480,7 +368,7 @@ jb_err get_action_token(char **line, char **name, char **value)
          /* More to parse next time. */
          *line = str + 1;
       }
-      return JB_ERR_OK;
+      return 0;
    }
 
    str++;
@@ -491,7 +379,7 @@ jb_err get_action_token(char **line, char **name, char **value)
    {
       /* error */
       *value = NULL;
-      return JB_ERR_PARSE;
+      return 1;
    }
 
    /* got value */
@@ -500,7 +388,7 @@ jb_err get_action_token(char **line, char **name, char **value)
 
    chomp(*value);
 
-   return JB_ERR_OK;
+   return 0;
 }
 
 
@@ -517,17 +405,15 @@ jb_err get_action_token(char **line, char **name, char **value)
  *          3  :  cur_action = Where to store the action.  Caller
  *                             allocates memory.
  *
- * Returns     :  JB_ERR_OK => Ok
- *                JB_ERR_PARSE => Parse error (line was trashed anyway)
- *                nonzero => Out of memory (line was trashed anyway)
+ * Returns     :  0 => Ok
+ *                nonzero => Error (line was trashed anyway)
  *
  *********************************************************************/
-jb_err get_actions(char *line,
-                   struct action_alias * alias_list,
-                   struct action_spec *cur_action)
+static int get_actions(char *line,
+                       struct action_alias * alias_list,
+                       struct action_spec *cur_action)
 {
-   jb_err err;
-   init_action(cur_action);
+   memset(cur_action, '\0', sizeof(*cur_action));
    cur_action->mask = ACTION_MASK_ALL;
 
    while (line)
@@ -535,16 +421,15 @@ jb_err get_actions(char *line,
       char * option = NULL;
       char * value = NULL;
 
-      err = get_action_token(&line, &option, &value);
-      if (err)
+      if (get_action_token(&line, &option, &value))
       {
-         return err;
+         return 1;
       }
 
       if (option)
       {
          /* handle option in 'option' */
-
+      
          /* Check for standard action name */
          const struct action_name * action = action_names;
 
@@ -570,15 +455,11 @@ jb_err get_actions(char *line,
 
                   if ((value == NULL) || (*value == '\0'))
                   {
-                     return JB_ERR_PARSE;
+                     return 1;
                   }
                   /* FIXME: should validate option string here */
                   freez (cur_action->string[action->index]);
                   cur_action->string[action->index] = strdup(value);
-                  if (NULL == cur_action->string[action->index])
-                  {
-                     return JB_ERR_MEMORY;
-                  }
                   break;
                }
             case AV_REM_STRING:
@@ -592,28 +473,24 @@ jb_err get_actions(char *line,
                {
                   /* append multi string. */
 
-                  struct list * remove_p = cur_action->multi_remove[action->index];
-                  struct list * add_p    = cur_action->multi_add[action->index];
+                  struct list * remove = cur_action->multi_remove[action->index];
+                  struct list * add    = cur_action->multi_add[action->index];
 
                   if ((value == NULL) || (*value == '\0'))
                   {
-                     return JB_ERR_PARSE;
+                     return 1;
                   }
 
-                  list_remove_item(remove_p, value);
-                  err = enlist_unique(add_p, value, 0);
-                  if (err)
-                  {
-                     return err;
-                  }
+                  list_remove_item(remove, value);
+                  enlist_unique(add, value, 0);
                   break;
                }
             case AV_REM_MULTI:
                {
                   /* remove multi string. */
 
-                  struct list * remove_p = cur_action->multi_remove[action->index];
-                  struct list * add_p    = cur_action->multi_add[action->index];
+                  struct list * remove = cur_action->multi_remove[action->index];
+                  struct list * add    = cur_action->multi_add[action->index];
 
                   if ( (value == NULL) || (*value == '\0')
                      || ((*value == '*') && (value[1] == '\0')) )
@@ -623,8 +500,8 @@ jb_err get_actions(char *line,
                       *
                       * Remove *ALL*.
                       */
-                     list_remove_all(remove_p);
-                     list_remove_all(add_p);
+                     destroy_list(remove);
+                     destroy_list(add);
                      cur_action->multi_remove_all[action->index] = 1;
                   }
                   else
@@ -634,27 +511,22 @@ jb_err get_actions(char *line,
                      if ( !cur_action->multi_remove_all[action->index] )
                      {
                         /* there isn't a catch-all in the remove list already */
-                        err = enlist_unique(remove_p, value, 0);
-                        if (err)
-                        {
-                           return err;
-                        }
+                        enlist_unique(remove, value, 0);
                      }
-                     list_remove_item(add_p, value);
+                     list_remove_item(add, value);
                   }
                   break;
                }
             default:
                /* Shouldn't get here unless there's memory corruption. */
-               assert(0);
-               return JB_ERR_PARSE;
+               return 1;
             }
          }
          else
          {
             /* try user aliases. */
             const struct action_alias * alias = alias_list;
-
+            
             while ( (alias != NULL) && (0 != strcmpic(alias->name, option)) )
             {
                alias = alias->next;
@@ -667,51 +539,187 @@ jb_err get_actions(char *line,
             else
             {
                /* Bad action name */
-               return JB_ERR_PARSE;
+               return 1;
             }
          }
       }
    }
 
-   return JB_ERR_OK;
+   return 0;
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_current_action
+ * Function    :  actions_to_text
  *
- * Description :  Zero out an action.
+ * Description :  Converts a actionsfile entry from numeric form
+ *                ("mask" and "add") to text.
  *
  * Parameters  :
- *          1  :  dest = An uninitialized current_action_spec.
+ *          1  :  mask = As from struct url_actions
+ *          2  :  add  = As from struct url_actions
  *
- * Returns     :  N/A
+ * Returns     :  A string.  Caller must free it.
  *
  *********************************************************************/
-void init_current_action (struct current_action_spec *dest)
+char * actions_to_text(struct action_spec *action)
 {
-   memset(dest, '\0', sizeof(*dest));
+   unsigned mask = action->mask;
+   unsigned add  = action->add;
+   char * result = strdup("");
+   struct list * lst;
 
-   dest->flags = ACTION_MOST_COMPATIBLE;
+   /* sanity - prevents "-feature +feature" */
+   mask |= add;
+
+
+#define DEFINE_ACTION_BOOL(__name, __bit)   \
+   if (!(mask & __bit))                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }                                        \
+   else if (add & __bit)                    \
+   {                                        \
+      result = strsav(result, " +" __name); \
+   }
+
+#define DEFINE_ACTION_STRING(__name, __bit, __index) \
+   if (!(mask & __bit))                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }                                        \
+   else if (add & __bit)                    \
+   {                                        \
+      result = strsav(result, " +" __name "{"); \
+      result = strsav(result, action->string[__index]); \
+      result = strsav(result, "}"); \
+   }
+
+#define DEFINE_ACTION_MULTI(__name, __index)         \
+   if (action->multi_remove_all[__index])            \
+   {                                                 \
+      result = strsav(result, " -" __name "{*}");    \
+   }                                                 \
+   else                                              \
+   {                                                 \
+      lst = action->multi_remove[__index]->next;     \
+      while (lst)                                    \
+      {                                              \
+         result = strsav(result, " -" __name "{");   \
+         result = strsav(result, lst->str);          \
+         result = strsav(result, "}");               \
+         lst = lst->next;                            \
+      }                                              \
+   }                                                 \
+   lst = action->multi_add[__index]->next;           \
+   while (lst)                                       \
+   {                                                 \
+      result = strsav(result, " +" __name "{");      \
+      result = strsav(result, lst->str);             \
+      result = strsav(result, "}");                  \
+      lst = lst->next;                               \
+   }
+
+#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
+
+#include "actionlist.h"
+
+#undef DEFINE_ACTION_MULTI
+#undef DEFINE_ACTION_STRING
+#undef DEFINE_ACTION_BOOL
+#undef DEFINE_ACTION_ALIAS
+
+   return result;
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_action
+ * Function    :  current_actions_to_text
+ *
+ * Description :  Converts a actionsfile entry to text.
+ *
+ * Parameters  :
+ *          1  :  action = Action
+ *
+ * Returns     :  A string.  Caller must free it.
+ *
+ *********************************************************************/
+char * current_action_to_text(struct current_action_spec *action)
+{
+   unsigned flags  = action->flags;
+   char * result = strdup("");
+   struct list * lst;
+
+#define DEFINE_ACTION_BOOL(__name, __bit)   \
+   if (flags & __bit)                       \
+   {                                        \
+      result = strsav(result, " +" __name); \
+   }                                        \
+   else                                     \
+   {                                        \
+      result = strsav(result, " -" __name); \
+   }
+
+#define DEFINE_ACTION_STRING(__name, __bit, __index)    \
+   if (flags & __bit)                                   \
+   {                                                    \
+      result = strsav(result, " +" __name "{");         \
+      result = strsav(result, action->string[__index]); \
+      result = strsav(result, "}");                     \
+   }                                                    \
+   else                                                 \
+   {                                                    \
+      result = strsav(result, " -" __name);             \
+   }
+
+#define DEFINE_ACTION_MULTI(__name, __index)            \
+   lst = action->multi[__index]->next;                  \
+   if (lst == NULL)                                     \
+   {                                                    \
+      result = strsav(result, " -" __name);             \
+   }                                                    \
+   else                                                 \
+   {                                                    \
+      while (lst)                                       \
+      {                                                 \
+         result = strsav(result, " +" __name "{");      \
+         result = strsav(result, lst->str);             \
+         result = strsav(result, "}");                  \
+         lst = lst->next;                               \
+      }                                                 \
+   }
+
+#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
+
+#include "actionlist.h"
+
+#undef DEFINE_ACTION_MULTI
+#undef DEFINE_ACTION_STRING
+#undef DEFINE_ACTION_BOOL
+#undef DEFINE_ACTION_ALIAS
+
+   return result;
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  init_current_action
  *
  * Description :  Zero out an action.
  *
  * Parameters  :
- *          1  :  dest = An uninitialized action_spec.
+ *          1  :  dest = An uninitialized current_action_spec.
  *
  * Returns     :  N/A
  *
  *********************************************************************/
-void init_action (struct action_spec *dest)
+void init_current_action (struct current_action_spec *dest)
 {
    memset(dest, '\0', sizeof(*dest));
+   dest->flags = ACTION_MOST_COMPATIBLE;
 }
 
 
@@ -725,7 +733,7 @@ void init_action (struct action_spec *dest)
  *                is that this one doesn't allocate memory for
  *                strings (so "src" better be in memory for at least
  *                as long as "dest" is, and you'd better free
- *                "dest" using "free_current_action").
+ *                "dest" using "current_free_action").
  *                Also, there is no  mask or remove lists in dest.
  *                (If we're applying it to a URL, we don't need them)
  *
@@ -733,15 +741,13 @@ void init_action (struct action_spec *dest)
  *          1  :  dest = Current actions, to modify.
  *          2  :  src = Action to add.
  *
- * Returns  0  :  no error
- *        !=0  :  error, probably JB_ERR_MEMORY.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err merge_current_action (struct current_action_spec *dest,
-                             const struct action_spec *src)
+void merge_current_action (struct current_action_spec *dest, 
+                           const struct action_spec *src)
 {
    int i;
-   jb_err err = JB_ERR_OK;
 
    dest->flags  &= src->mask;
    dest->flags  |= src->add;
@@ -751,13 +757,8 @@ jb_err merge_current_action (struct current_action_spec *dest,
       char * str = src->string[i];
       if (str)
       {
-         str = strdup(str);
-         if (!str)
-         {
-            return JB_ERR_MEMORY;
-         }
          freez(dest->string[i]);
-         dest->string[i] = str;
+         dest->string[i] = strdup(str);
       }
    }
 
@@ -765,24 +766,16 @@ jb_err merge_current_action (struct current_action_spec *dest,
    {
       if (src->multi_remove_all[i])
       {
-         /* Remove everything from dest, then add src->multi_add */
-         err = list_duplicate(dest->multi[i], src->multi_add[i]);
-         if (err)
-         {
-            return err;
-         }
+         /* Remove everything from dest */
+         destroy_list(dest->multi[i]);
+         list_duplicate(dest->multi[i], src->multi_add[i]);
       }
       else
       {
          list_remove_list(dest->multi[i], src->multi_remove[i]);
-         err = list_append_list_unique(dest->multi[i], src->multi_add[i]);
-         if (err)
-         {
-            return err;
-         }
+         list_append_list_unique(dest->multi[i], src->multi_add[i]);
       }
    }
-   return err;
 }
 
 
@@ -790,8 +783,7 @@ jb_err merge_current_action (struct current_action_spec *dest,
  *
  * Function    :  free_current_action
  *
- * Description :  Free memory used by a current_action_spec.
- *                Does not free the current_action_spec itself.
+ * Description :  Free a current_action_spec.
  *
  * Parameters  :
  *          1  :  src = Source to free.
@@ -817,33 +809,6 @@ void free_current_action (struct current_action_spec *src)
 }
 
 
-static struct file_list *current_actions_file  = NULL;
-
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_actions_file
- *
- * Description :  Unloads current actions file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_actions_file(void)
-{
-   if (current_actions_file)
-   {
-      current_actions_file->unloader = unload_actions_file;
-      current_actions_file = NULL;
-   }
-}
-#endif /* FEATURE_GRACEFUL_TERMINATION */
-
-
 /*********************************************************************
  *
  * Function    :  unload_actions_file
@@ -864,8 +829,7 @@ void unload_actions_file(void *file_data)
    while (cur != NULL)
    {
       next = cur->next;
-      free_url_spec(cur->url);
-      free_action(cur->action);
+      free_url(cur->url);
       freez(cur);
       cur = next;
    }
@@ -873,32 +837,6 @@ void unload_actions_file(void *file_data)
 }
 
 
-/*********************************************************************
- *
- * Function    :  free_alias_list
- *
- * Description :  Free memory used by a list of aliases.
- *
- * Parameters  :
- *          1  :  alias_list = Linked list to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_alias_list(struct action_alias *alias_list)
-{
-   while (alias_list != NULL)
-   {
-      struct action_alias * next = alias_list->next;
-      alias_list->next = NULL;
-      freez(alias_list->name);
-      free_action(alias_list->action);
-      free(alias_list);
-      alias_list = next;
-   }
-}
-
-
 /*********************************************************************
  *
  * Function    :  load_actions_file
@@ -914,29 +852,22 @@ void free_alias_list(struct action_alias *alias_list)
  *********************************************************************/
 int load_actions_file(struct client_state *csp)
 {
-
-   /*
-    * Parser mode.
-    * Note: Keep these in the order they occur in the file, they are
-    * sometimes tested with <=
-    */
-#define MODE_START_OF_FILE 1
-#define MODE_SETTINGS      2
-#define MODE_DESCRIPTION   3
-#define MODE_ALIAS         4
-#define MODE_ACTIONS       5
-
-   int mode = MODE_START_OF_FILE;
+   static struct file_list *current_actions_file  = NULL;
 
    FILE *fp;
+
    struct url_actions *last_perm;
    struct url_actions *perm;
    char  buf[BUFFER_SIZE];
    struct file_list *fs;
-   struct action_spec * cur_action = NULL;
-   int cur_action_used = 0;
+#define MODE_START_OF_FILE 1
+#define MODE_ACTIONS       2
+#define MODE_ALIAS         3
+   int mode = MODE_START_OF_FILE;
+   struct action_spec cur_action[1];
    struct action_alias * alias_list = NULL;
-   unsigned long linenum = 0;
+
+   memset(cur_action, '\0', sizeof(*cur_action));
 
    if (!check_file_changed(current_actions_file, csp->config->actions_file, &fs))
    {
@@ -969,7 +900,7 @@ int load_actions_file(struct client_state *csp)
       return 1; /* never get here */
    }
 
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
    {
       if (*buf == '{')
       {
@@ -984,9 +915,9 @@ int load_actions_file(struct client_state *csp)
             {
                /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s", 
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
 
@@ -998,87 +929,25 @@ int load_actions_file(struct client_state *csp)
             {
                /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): {{ }}",
-                  csp->config->actions_file, linenum);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: {{ }}",
+                  csp->config->actions_file);
                return 1; /* never get here */
             }
 
-            /*
-             * An actionsfile can optionally contain the following blocks.
-             * They *MUST* be in this order, to simplify processing:
-             *
-             * {{settings}}
-             * name=value...
-             *
-             * {{description}}
-             * ...free text, format TBD, but no line may start with a '{'...
-             *
-             * {{alias}}
-             * name=actions...
-             *
-             * The actual actions must be *after* these special blocks.
-             * None of these special blocks may be repeated.
-             *
-             */
-            if (0 == strcmpic(start, "settings"))
-            {
-               /* it's a {{settings}} block */
-               if (mode >= MODE_SETTINGS)
-               {
-                  /* {{settings}} must be first thing in file and must only
-                   * appear once.
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{settings}} must only appear once, and it must be before anything else.",
-                     csp->config->actions_file, linenum);
-               }
-               mode = MODE_SETTINGS;
-            }
-            else if (0 == strcmpic(start, "description"))
-            {
-               /* it's a {{description}} block */
-               if (mode >= MODE_DESCRIPTION)
-               {
-                  /* {{description}} is a singleton and only {{settings}} may proceed it
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{description}} must only appear once, and only a {{settings}} block may be above it.",
-                     csp->config->actions_file, linenum);
-               }
-               mode = MODE_DESCRIPTION;
-            }
-            else if (0 == strcmpic(start, "alias"))
+            if (0 == strcmpic(start, "alias"))
             {
                /* it's an {{alias}} block */
-               if (mode >= MODE_ALIAS)
-               {
-                  /* {{alias}} must be first thing in file, possibly after
-                   * {{settings}} and {{description}}
-                   *
-                   * {{alias}} must only appear once.
-                   *
-                   * Note that these are new restrictions introduced in
-                   * v2.9.10 in order to make actionsfile editing simpler.
-                   * (Otherwise, reordering actionsfile entries without
-                   * completely rewriting the file becomes non-trivial)
-                   */
-                  fclose(fp);
-                  log_error(LOG_LEVEL_FATAL,
-                     "can't load actions file '%s': line %lu: {{alias}} must only appear once, and it must be before all actions.",
-                     csp->config->actions_file, linenum);
-               }
+
                mode = MODE_ALIAS;
             }
             else
             {
                /* invalid {{something}} block */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): {{%s}}",
-                  csp->config->actions_file, linenum, start);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: {{%s}}",
+                  csp->config->actions_file, start);
                return 1; /* never get here */
             }
          }
@@ -1093,26 +962,7 @@ int load_actions_file(struct client_state *csp)
             mode    = MODE_ACTIONS;
 
             /* free old action */
-            if (cur_action)
-            {
-               if (!cur_action_used)
-               {
-                  free_action(cur_action);
-                  free(cur_action);
-               }
-               cur_action = NULL;
-            }
-            cur_action_used = 0;
-            cur_action = (struct action_spec *)zalloc(sizeof(*cur_action));
-            if (cur_action == NULL)
-            {
-               fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': out of memory",
-                  csp->config->actions_file);
-               return 1; /* never get here */
-            }
-            init_action(cur_action);
+            free_action(cur_action);
 
             /* trim { */
             strcpy(actions_buf, buf + 1);
@@ -1121,11 +971,11 @@ int load_actions_file(struct client_state *csp)
             end = actions_buf + strlen(actions_buf) - 1;
             if (*end != '}')
             {
-               /* No closing } */
+               /* too short */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
             *end = '\0';
@@ -1133,48 +983,42 @@ int load_actions_file(struct client_state *csp)
             /* trim any whitespace immediately inside {} */
             chomp(actions_buf);
 
+            if (*actions_buf == '\0')
+            {
+               /* too short */
+               fclose(fp);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
+               return 1; /* never get here */
+            }
+
             if (get_actions(actions_buf, alias_list, cur_action))
             {
                /* error */
                fclose(fp);
-               log_error(LOG_LEVEL_FATAL,
-                  "can't load actions file '%s': invalid line (%lu): %s",
-                  csp->config->actions_file, linenum, buf);
+               log_error(LOG_LEVEL_FATAL, 
+                  "can't load actions file '%s': invalid line: %s",
+                  csp->config->actions_file, buf);
                return 1; /* never get here */
             }
          }
       }
-      else if (mode == MODE_SETTINGS)
-      {
-         /*
-          * Part of the {{settings}} block.
-          * Ignore for now, but we may want to read & check permissions
-          * when we go multi-user.
-          */
-      }
-      else if (mode == MODE_DESCRIPTION)
-      {
-         /*
-          * Part of the {{description}} block.
-          * Ignore for now.
-          */
-      }
       else if (mode == MODE_ALIAS)
       {
-         /*
-          * define an alias
-          */
+         /* define an alias */
          char  actions_buf[BUFFER_SIZE];
          struct action_alias * new_alias;
+         int more = 1;
 
          char * start = strchr(buf, '=');
          char * end = start;
 
          if ((start == NULL) || (start == buf))
          {
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1207,9 +1051,9 @@ int load_actions_file(struct client_state *csp)
          }
          if (*start == '\0')
          {
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1221,12 +1065,12 @@ int load_actions_file(struct client_state *csp)
          {
             /* error */
             fclose(fp);
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': invalid alias line (%lu): %s = %s",
-               csp->config->actions_file, linenum, buf, start);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': invalid alias line: %s = %s",
+               csp->config->actions_file, buf, start);
             return 1; /* never get here */
          }
-
+         
          /* add to list */
          new_alias->next = alias_list;
          alias_list = new_alias;
@@ -1252,9 +1096,9 @@ int load_actions_file(struct client_state *csp)
          if (create_url_spec(perm->url, buf))
          {
             fclose(fp);
-            log_error(LOG_LEVEL_FATAL,
-               "can't load actions file '%s': line %lu: cannot create URL pattern from: %s",
-               csp->config->actions_file, linenum, buf);
+            log_error(LOG_LEVEL_FATAL, 
+               "can't load actions file '%s': cannot create URL pattern from: %s",
+               csp->config->actions_file, buf);
             return 1; /* never get here */
          }
 
@@ -1266,16 +1110,16 @@ int load_actions_file(struct client_state *csp)
       {
          /* oops - please have a {} line as 1st line in file. */
          fclose(fp);
-         log_error(LOG_LEVEL_FATAL,
-            "can't load actions file '%s': first needed line (%lu) is invalid: %s",
-            csp->config->actions_file, linenum, buf);
+         log_error(LOG_LEVEL_FATAL, 
+            "can't load actions file '%s': first line is invalid: %s",
+            csp->config->actions_file, buf);
          return 1; /* never get here */
       }
       else
       {
          /* How did we get here? This is impossible! */
          fclose(fp);
-         log_error(LOG_LEVEL_FATAL,
+         log_error(LOG_LEVEL_FATAL, 
             "can't load actions file '%s': INTERNAL ERROR - mode = %d",
             csp->config->actions_file, mode);
          return 1; /* never get here */
@@ -1283,10 +1127,24 @@ int load_actions_file(struct client_state *csp)
    }
 
    fclose(fp);
-
+   
    free_action(cur_action);
 
-   free_alias_list(alias_list);
+   while (alias_list != NULL)
+   {
+      struct action_alias * next = alias_list->next;
+      freez((char *)alias_list->name);
+      free_action(alias_list->action);
+      free(alias_list);
+      alias_list = next;
+   }
+
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
 
    /* the old one is now obsolete */
    if (current_actions_file)
@@ -1306,290 +1164,3 @@ int load_actions_file(struct client_state *csp)
    return(0);
 
 }
-
-
-/*********************************************************************
- *
- * Function    :  actions_to_text
- *
- * Description :  Converts a actionsfile entry from numeric form
- *                ("mask" and "add") to text.
- *
- * Parameters  :
- *          1  :  mask = As from struct url_actions
- *          2  :  add  = As from struct url_actions
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * actions_to_text(struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
-   struct list_entry * lst;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(__name, __bit)    \
-   if (!(mask & __bit))                      \
-   {                                         \
-      string_append(&result, " -" __name);   \
-   }                                         \
-   else if (add & __bit)                     \
-   {                                         \
-      string_append(&result, " +" __name);   \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index)   \
-   if (!(mask & __bit))                                \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }                                                   \
-   else if (add & __bit)                               \
-   {                                                   \
-      string_append(&result, " +" __name "{");         \
-      string_append(&result, action->string[__index]); \
-      string_append(&result, "}");                     \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)         \
-   if (action->multi_remove_all[__index])            \
-   {                                                 \
-      string_append(&result, " -" __name);           \
-   }                                                 \
-   else                                              \
-   {                                                 \
-      lst = action->multi_remove[__index]->first;    \
-      while (lst)                                    \
-      {                                              \
-         string_append(&result, " -" __name "{");    \
-         string_append(&result, lst->str);           \
-         string_append(&result, "}");                \
-         lst = lst->next;                            \
-      }                                              \
-   }                                                 \
-   lst = action->multi_add[__index]->first;          \
-   while (lst)                                       \
-   {                                                 \
-      string_append(&result, " +" __name "{");       \
-      string_append(&result, lst->str);              \
-      string_append(&result, "}");                   \
-      lst = lst->next;                               \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   return result;
-}
-
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-/*********************************************************************
- *
- * Function    :  actions_to_html
- *
- * Description :  Converts a actionsfile entry from numeric form
- *                ("mask" and "add") to a <br>-seperated HTML string.
- *
- * Parameters  :
- *          1  :  mask = As from struct url_actions
- *          2  :  add  = As from struct url_actions
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * actions_to_html(struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   char * result = strdup("");
-   char * enc_str;
-   struct list_entry * lst;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(__name, __bit)       \
-   if (!(mask & __bit))                         \
-   {                                            \
-      string_append(&result, "\n<br>-" __name); \
-   }                                            \
-   else if (add & __bit)                        \
-   {                                            \
-      string_append(&result, "\n<br>+" __name); \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index) \
-   if (!(mask & __bit))                              \
-   {                                                 \
-      string_append(&result, "\n<br>-" __name);      \
-   }                                                 \
-   else if (add & __bit)                             \
-   {                                                 \
-      string_append(&result, "\n<br>+" __name "{");  \
-      if (NULL == result)                            \
-      {                                              \
-         return NULL;                                \
-      }                                              \
-      enc_str = html_encode(action->string[__index]);\
-      if (NULL == enc_str)                           \
-      {                                              \
-         free(result);                               \
-         return NULL;                                \
-      }                                              \
-      string_append(&result, enc_str);               \
-      free(enc_str);                                 \
-      string_append(&result, "}");                   \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)          \
-   if (action->multi_remove_all[__index])             \
-   {                                                  \
-      string_append(&result, "\n<br>-" __name);       \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      lst = action->multi_remove[__index]->first;     \
-      while (lst)                                     \
-      {                                               \
-         string_append(&result, "\n<br>-" __name "{");\
-         if (NULL == result)                          \
-         {                                            \
-            return NULL;                              \
-         }                                            \
-         enc_str = html_encode(lst->str);             \
-         if (NULL == enc_str)                         \
-         {                                            \
-            free(result);                             \
-            return NULL;                              \
-         }                                            \
-         string_append(&result, enc_str);             \
-         free(enc_str);                               \
-         string_append(&result, "}");                 \
-         lst = lst->next;                             \
-      }                                               \
-   }                                                  \
-   lst = action->multi_add[__index]->first;           \
-   while (lst)                                        \
-   {                                                  \
-      string_append(&result, "\n<br>+" __name "{");   \
-      if (NULL == result)                             \
-      {                                               \
-         return NULL;                                 \
-      }                                               \
-      enc_str = html_encode(lst->str);                \
-      if (NULL == enc_str)                            \
-      {                                               \
-         free(result);                                \
-         return NULL;                                 \
-      }                                               \
-      string_append(&result, enc_str);                \
-      free(enc_str);                                  \
-      string_append(&result, "}");                    \
-      lst = lst->next;                                \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   /* trim leading <br> */
-   if (result && *result)
-   {
-      char * s = result;
-      result = strdup(result + 5);
-      free(s);
-   }
-
-   return result;
-}
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/*********************************************************************
- *
- * Function    :  current_actions_to_text
- *
- * Description :  Converts a actionsfile entry to text.
- *
- * Parameters  :
- *          1  :  action = Action
- *
- * Returns     :  A string.  Caller must free it.
- *                NULL on out-of-memory error.
- *
- *********************************************************************/
-char * current_action_to_text(struct current_action_spec *action)
-{
-   unsigned long flags  = action->flags;
-   char * result = strdup("");
-   struct list_entry * lst;
-
-#define DEFINE_ACTION_BOOL(__name, __bit)  \
-   if (flags & __bit)                      \
-   {                                       \
-      string_append(&result, " +" __name); \
-   }                                       \
-   else                                    \
-   {                                       \
-      string_append(&result, " -" __name); \
-   }
-
-#define DEFINE_ACTION_STRING(__name, __bit, __index)   \
-   if (flags & __bit)                                  \
-   {                                                   \
-      string_append(&result, " +" __name "{");         \
-      string_append(&result, action->string[__index]); \
-      string_append(&result, "}");                     \
-   }                                                   \
-   else                                                \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }
-
-#define DEFINE_ACTION_MULTI(__name, __index)           \
-   lst = action->multi[__index]->first;                \
-   if (lst == NULL)                                    \
-   {                                                   \
-      string_append(&result, " -" __name);             \
-   }                                                   \
-   else                                                \
-   {                                                   \
-      while (lst)                                      \
-      {                                                \
-         string_append(&result, " +" __name "{");      \
-         string_append(&result, lst->str);             \
-         string_append(&result, "}");                  \
-         lst = lst->next;                              \
-      }                                                \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-
-   return result;
-}
index 04434e2..d71d8c3 100644 (file)
--- a/actions.h
+++ b/actions.h
@@ -1,6 +1,6 @@
-#ifndef ACTIONS_H_INCLUDED
-#define ACTIONS_H_INCLUDED
-#define ACTIONS_H_VERSION "$Id: actions.h,v 1.8 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ACTIONS_H
+#define _ACTIONS_H
+#define ACTIONS_H_VERSION "$Id: actions.h,v ??? $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/actions.h,v $
@@ -9,7 +9,7 @@
  *                Functions declared include: FIXME
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: actions.h,v $
- *    Revision 1.8  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.7  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.6  2001/10/23 21:30:30  jongfoster
- *    Adding error-checking to selected functions.
- *
- *    Revision 1.5  2001/10/14 21:58:22  jongfoster
- *    Adding support for the CGI-based editor:
- *    - Exported get_actions()
- *    - Added new function free_alias_list()
- *    - Added support for {{settings}} and {{description}} blocks
- *      in the actions file.  They are currently ignored.
- *    - Added restriction to only one {{alias}} block which must appear
- *      first in the file, to simplify the editor's rewriting rules.
- *    - Note that load_actions_file() is no longer used by the CGI-based
- *      editor, but some of the other routines in this file are.
- *
- *    Revision 1.4  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.3  2001/09/14 00:17:32  jongfoster
- *    Tidying up memory allocation. New function init_action().
- *
- *    Revision 1.2  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.1  2001/05/31 21:16:46  jongfoster
- *    Moved functions to process the action list into this new file.
- *
  *
  *********************************************************************/
 \f
@@ -84,51 +44,23 @@ extern "C" {
 #endif
 
 
-struct action_spec;
-struct current_action_spec;
-struct client_state;
-
-
-
-/* This structure is used to hold user-defined aliases */
-struct action_alias
-{
-   const char * name;
-   struct action_spec action[1];
-   struct action_alias * next;
-};
-
-
-extern jb_err get_actions (char *line, 
-                           struct action_alias * alias_list,
-                           struct action_spec *cur_action);
-extern void free_alias_list(struct action_alias *alias_list);
-
-extern void init_action(struct action_spec *dest);
-extern void free_action(struct action_spec *src);
-extern jb_err merge_actions (struct action_spec *dest, 
-                             const struct action_spec *src);
-extern jb_err copy_action (struct action_spec *dest, 
+extern void merge_actions (struct action_spec *dest, 
                            const struct action_spec *src);
+extern void copy_action (struct action_spec *dest, 
+                         const struct action_spec *src);
+extern void free_action (struct action_spec *src);
 extern char * actions_to_text     (struct action_spec *action);
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-extern char * actions_to_html     (struct action_spec *action);
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
 
 extern void init_current_action     (struct current_action_spec *dest);
-extern void free_current_action     (struct current_action_spec *src);
-extern jb_err merge_current_action  (struct current_action_spec *dest, 
+extern void merge_current_action    (struct current_action_spec *dest, 
                                      const struct action_spec *src);
+extern void free_current_action     (struct current_action_spec *src);
 extern char * current_action_to_text(struct current_action_spec *action);
 
-extern jb_err get_action_token(char **line, char **name, char **value);
+extern int get_action_token(char **line, char **name, char **value);
 extern void unload_actions_file(void *file_data);
 extern int load_actions_file(struct client_state *csp);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-void unload_current_actions_file(void);
-#endif
-
 
 /* Revision control strings from this header and associated .c file */
 extern const char actions_rcs[];
@@ -138,7 +70,7 @@ extern const char actions_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ACTIONS_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
 
 /*
   Local Variables:
old mode 100644 (file)
new mode 100755 (executable)
similarity index 75%
rename from default.action
rename to actionsfile
index b2c85ef..83b541d
@@ -1,43 +1,10 @@
-######################################################################
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/basic.action,v $
-# 
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $
+#############################################################################
+# Sample actions file for the Internet Junkbuster 2.9.x
 #
-#  Purpose     :  Default actions file, see
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES
+# For information, see http://ijbswa.sourceforge.net/
 #
-#  Copyright   :  Written by and Copyright
-#                 Privoxy team. http://www.privoxy.org/
+# $Id: actionsfile,v 1.1 2001/06/29 13:17:24 oes Exp $
 #
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-# We value your feedback. However, to provide you with the best support,
-# please note:
-#  
-#  * Use the support forum to get help:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118
-#  * Submit bugs only thru our bug forum:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-#    Make sure that the bug has not already been submitted. Please try
-#    to verify that it is a Junkbuster bug, and not a browser or site
-#    bug first. If you are using your own custom configuration, please
-#    try the stock configs to see if the problem is a configuration
-#    related bug. And if not using the latest development snapshot,
-#    please try the latest one. Or even better, CVS sources.
-#  * Submit feature requests only thru our feature request forum:
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-#      
-# For any other issues, feel free to use the mailing lists:
-# http://sourceforge.net/mail/?group_id=11118
-#    
-# Anyone interested in actively participating in development and related
-# discussions can join the appropriate mailing list here:
-# http://sourceforge.net/mail/?group_id=11118. Archives are available
-# here too.
-# 
 #############################################################################
 # Syntax
 #############################################################################
@@ -65,7 +32,7 @@
 #   is a domain-only pattern and will match any request to www.yahoo.com
 # 
 # www.example.com/
-#   means exactly the same (but is slightly less efficient)
+#   means exactly the same
 # 
 # www.example.com/index.html
 #   matches only the document /index.html on www.example.com
 # details.
 # 
 # Please note that matching in the path is CASE INSENSITIVE by default, but
-# you can switch to case sensitive by starting the pattern with the "(?-i)"
-# switch:
+# you can switch to case sensitive at any point in the pattern by using
+# the "(?-i)" switch:
 # 
 # www.example.com/(?-i)PaTtErN.*
 #   will match only documents whose path starts with PaTtErN in exactly this
 #   capitalization.
-#
-# Partially case-sensetive and partially case-insensitive patterns are
-# possible, but the rules about splitting them up are extremely complex
-# - see the PCRE documentation for more information.
 # 
 #############################################################################
 # Action Syntax
 # +block
 #    Block this URL
 #
-# +deanimate-gifs{last}
-# +deanimate-gifs{first}
-#    Deanimate all animated GIF images, i.e. reduce them to their last
-#    frame. This will also shrink the images considerably. (In bytes,
-#    not pixels!) 
-#    If the option "first" is given, the first frame of the animation
-#    is used as the replacement. If "last" is given, the last frame of
-#    the animation is used instead, which propably makes more sense for
-#    most banner animations, but also has the risk of not showing the
-#    entire last frame (if it is only a delta to an earlier frame).
-#
-# +downgrade
-#    Downgrade HTTP/1.1 client requests to HTTP/1.0 and downgrade the
-#    responses as well. Use this action for servers that use HTTP/1.1
-#    protocol features that Junkbuster currently can't handle yet.
-#
 # +fast-redirects
 #    Many sites, like yahoo.com, don't just link to other sites.
 #    Instead, they will link to some script on their own server,
 #    request and send a local redirect back to your browser without
 #    contacting the remote site.
 #
-# +filter{name}
-#    Filter the website through one or more regular expression filters.
-#    Repeat for multiple filters.
-#   
-#    Filters predefined in the supplied re_filterfile include:
-#
-#     html-annoyances:  Get rid of particularly annoying HTML abuse
-#     js-annoyances:    Get rid of particularly annoying JavaScript abuse
-#     no-poups:         Kill all popups in JS and HTML
-#     frameset-borders: Give frames a border
-#     webbugs:          Squish WebBugs (1x1 invisible GIFs used for user tracking)
-#     no-refresh:       Automatic refresh sucks on auto-dialup lines
-#     fun:              Text replacements  for subversive browsing fun!
-#     nimda:            Remove (virus) Nimda code.
-#     banners-by-size:  Kill banners by size
-#     crude-parental:   Kill all web pages that contain the words "sex" or "warez"
-#
+# +filter
+#    Filter the website through the re_filterfile
+#    FIXME: The syntax should be +filter{filename}
 #
 # +hide-forwarded
 #    Block any existing X-Forwarded-for header, and do not add a new one.
 #    in which case a "blocked" image can be sent rather than a HTML page.
 #    See +image-blocker{} for the control over what is actually sent.
 #
+# +image-blocker{logo}
 # +image-blocker{blank}
-# +image-blocker{pattern}
-# +image-blocker{<URL>} with <url> being any valid image URL
+# +image-blocker{http://i.j.b/send-banner}
 #    Decides what to do with URLs that end up tagged with {+block +image}.
-#    There are 4 options:
-#      * "-image-blocker" will send a HTML "blocked" page, usually
-#        resulting in a "broken image" icon.
-#      * "+image-blocker{blank}" will send a 1x1 transparent image
-#      * "+image-blocker{pattern}" will send a 4x4 grey/white pattern
-#        which is less intrusive than the logo but easier to recognize
-#        than the transparent one.
-#      * "+image-blocker{<URL>}" will send a HTTP temporary redirect
-#        to the specified image URL.
-#
-#
-# +limit-connect{portlist}
-#   The CONNECT methods exists in HTTP to allow access to secure websites
-#   (https:// URLs) through proxies. It works very simply: The proxy
-#   connects to the server on the specified port, and then short-circuits
-#   its connections to the cliant and to the remote proxy.
-#   This can be a big security hole, since CONNECT-enabled proxies can
-#   be abused as TCP relays very easily.
-#   By default, i.e. in the absence of a +limit-connect action, Junkbuster
-#   will only allow CONNECT requests to port 443, which is the standard port
-#   for https.
-#   If you want to allow CONNECT for more ports than that, or want to forbid
-#   CONNECT altogether, you can specify a comma separated list of ports and port
-#   ranges (the latter using dashes, with the minimum defaulting to 0 and max to 65K):
-#
-#   +limit-connect{443} # This is the default and need no be specified.
-#   +limit-connect{80,443} # Ports 80 and 443 are OK.
-#   +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100, and above 500 are OK.
-#
-# +no-compression
-#    Prevent the website from compressing the data. Some websites do
-#    that, which is a problem for junkbuster, since +filter, +no-popup
-#    and +gif-deanimate will not work on compressed data. Will slow down
-#    connections to those websites, though.
-#
-# +no-cookies-keep
-#    If the website sets cookies, make sure they are erased when you exit
-#    and restart your web browser.  This makes profiling cookies useless,
-#    but won't break sites which require cookies so that you can log in
-#    or for transactions.
+#    There are 4 options.  "-image-blocker" will send a HTML "blocked" page,
+#    usually resulting in a "broken image" icon.  "+image-blocker{logo}"
+#    will send a "JunkBuster" image.  "+image-blocker{blank}" will send
+#    a 1x1 transparent GIF.  And finally, "+image-blocker{http://xyz.com}"
+#    will send a HTTP temporary redirect to the specified image - this 
+#    has the advantage of the icon being beeing cached by the browser,
+#    which will speed up the display.  
 #
 # +no-cookies-read
 #    Prevent the website from reading cookies
 # Useful aliases
 +no-cookies = +no-cookies-set +no-cookies-read
 -no-cookies = -no-cookies-set -no-cookies-read
+fragile     = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups
+shop        = -no-cookies -filter -fast-redirects
 +imageblock = +block +image
 
-# Fragile sites should have the minimum changes
-fragile     = -block -deanimate-gifs -fast-redirects -filter -hide-referer -no-cookies -no-popups
-
-# Shops should be allowed to set persistent cookies
-shop        = -filter -no-cookies -no-cookies-keep
-
-# Your favourite blend of filters:
-#
-myfilters   = +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
-              +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-
+#For people who don't like to type too much:  ;-)
+c0 = +no-cookies
+c1 = -no-cookies
+c2 = -no-cookies-set +no-cookies-read
+c3 = +no-cookies-set -no-cookies-read
 #... etc.  Customize to your heart's content.
 
 #############################################################################
 # Defaults
 #############################################################################
 {\
--add-header \
 -block \
--deanimate-gifs \
--downgrade \
 +fast-redirects \
-myfilters \
-+no-compression \
-+no-cookies-keep \
++filter \
 +hide-forwarded \
 +hide-from{block} \
 +hide-referer{forge} \
 -hide-user-agent \
 -image \
-+image-blocker{http://config.privoxy.org/send-banner} \
-+no-cookies-keep \
--no-cookies-read \
--no-cookies-set \
++image-blocker{http://i.j.b/send-banner} \
++no-cookies-read \
++no-cookies-set \
 +no-popups \
--vanilla-wafer \
--wafer \
++vanilla-wafer \
 }
 / # Match all URLs
 
-
 #############################################################################
 # A useful site for testing - shows all headers:
 # http://privacy.net/analyze/
 #############################################################################
-{+add-header{X-Privacy: Yes please} \
+{+add-header{X-Privacy: Yes please} #-add-header{*} \
 +add-header{X-User-Tracking: No thanks!} -filter}
 privacy.net
 
-
 #############################################################################
-# Test for new GIF deanimation feature.
-# Just try http://www.oesterhelt.org/deanimate-demo with and without it.
+# Permissions list
 #############################################################################
-{+deanimate-gifs{last}}
-www.oesterhelt.org/deanimate-demo
 
-
-#############################################################################
 # Sites that need cookies
-#
-# FIXME: Now cookies are allowed by default, do any of these sites
-# need persistent cookies?
-#############################################################################
+{-no-cookies}
+.javasoft.com
+.sun.com
+.yahoo.com
+.msdn.microsoft.com
 
-#{-no-cookies}
-#.javasoft.com
-#.sun.com
-#.yahoo.com
-#.msdn.microsoft.com
-#.sourceforge.net
-#.sf.net
-#www.nexgo.de
-#.myrealbox.com
-#mail.uni.de
-#e-tools.freenet.de
-#office.freenet.de
+# Alternative way of saying the same thing
+{-no-cookies-set -no-cookies-read}
+.sourceforge.net
+.sf.net
 
-#############################################################################
 # These sites are very complex and require
 # minimal interference.
-#############################################################################
 {fragile}
 .office.microsoft.com
 .windowsupdate.microsoft.com
-.deutsche-bank-24.de
 
-#############################################################################
 # Shopping sites - still want to block ads.
-#############################################################################
 {shop}
 .quietpc.com
 .worldpay.com   # for quietpc.com
 .jungle.com
 .scan.co.uk
 
-#############################################################################
 # These shops require pop-ups
-#############################################################################
 {shop -no-popups}
 .dabs.com
 .overclockers.co.uk
 
-#############################################################################
-# Sometimes fast-redirects catches things by mistake
-#############################################################################
 {-fast-redirects}
 www.ukc.ac.uk/cgi-bin/wac\.cgi\?
 login.yahoo.com
-edit.europe.yahoo.com
-.google.com
-.altavista.com/.*(like|url|link):http
-.altavista.com/trans.*urltext=http
-.speedfind.de
-.nytimes.com
 
-#############################################################################
 # Please don't re_filter code!
-#############################################################################
 {-filter}
-.sourceforge.net
-
+.cvs.sourceforge.net
 
 #############################################################################
 # Imagelist:
@@ -517,18 +373,13 @@ www.carbuyer.com/cgi-carbuyer/getimage.cgi
 *.fxweb.com/v2-trackrun\.cgi
 195.63.104.61
 195.63.104.222
-213.165.64.3[4-9]
-213.165.64.4[0-4]
+213.165.64.3[89]
+213.165.64.4[1-4]
 194.221.183.22[1-7]
-a196.g.akamai.net/7/196/2670/000[1-3]/images\.gmx\.net/.*images/.*/.*/
-/cgi-bin/ivw/CP/
+a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/
+/cgi-bin/ivw/CP/CGI
 151.189.8.213/Adimg
 151.189.8.193/Media
-.smartclicks.com/.*/smart(img|banner|host|bar|site)
-.linkexchange.com/.*/showl(ogo|e)
-MoneyBanner.de
-pixel.intares.net/cgi-bin/janus
-ar.atwola.com # This serves all ads for CNN and AOL
 
 #############################################################################
 # Blocklist:
@@ -544,48 +395,49 @@ ar.atwola.com # This serves all ads for CNN and AOL
 ###/*.*/(sponsor|banner)s?[0-9]?/
 ###/*.*/.*banner([-_]?[a-z0-9]+)?\.(gif|jpg)
 
-/?.*/_?(plain|live)?ads?(-banners)?/
-/?.*/abanners/
-/?.*/ad(sdna_image|gifs?)/
-/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-/?.*/adbanners/
-/?.*/ad_banner/
-/?.*/adserver
-/?.*/adstream\.cgi
-/?.*/adv((er)?ts?|ertis(ing|ements?))?/
-/?.*/anzei(gen)?/?
-/?.*/ban[-_]cgi/
-/?.*/banner_?ads/
-/?.*/banner_?anzeigen
-/?.*/bannerimage/
-/?.*/banners?/
-/?.*/banners?\.cgi/
-/?.*/cgi-bin/centralad/getimage
-/?.*/images/addver\.gif
-/?.*/images/advert\.gif
-/?.*/images/marketing/.*\.(gif|jpe?g)
-/?.*/place-ads
-/?.*/popupads/
-/?.*/promobar.*
-/?.*/publicite/
-/?.*/randomads/.*\.(gif|jpe?g)
-/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g)
-/?.*/siteads/
-/?.*/sponsor.*\.gif
-/?.*/sponsors?[0-9]?/
-/?.*/ucbandeimg/
-/?.*/werb\..*
-/?.*/werbebanner/
-/?.*/werbung/.*\.(gif|jpe?g)
-/?.*/adv\.   # www.telegraaf.nl
-/?.*/advert[0-9]+\.jpg
-/?.*bann\.gif
-/?.*/ads/
+/.*/_?(plain|live)?ads?(-banners)?/
+/.*/abanners/
+/.*/ad(sdna_image|gifs?)/
+/.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
+/.*/adbanners/
+/.*/adserver
+/.*/adstream\.cgi
+/.*/adv((er)?ts?|ertis(ing|ements?))?/
+/.*/anzei(gen)?/?
+/.*/ban[-_]cgi/
+/.*/banner_?ads/
+/.*/banner_?anzeigen
+/.*/bannerimage/
+/.*/banners?/
+/.*/banners?\.cgi/
+/.*/cgi-bin/centralad/getimage
+/.*/images/addver\.gif
+/.*/images/advert\.gif
+/.*/images/marketing/.*\.(gif|jpe?g)
+/.*/place-ads
+/.*/popupads/
+/.*/promobar.*
+/.*/publicite/
+/.*/randomads/.*\.(gif|jpe?g)
+/.*/reklama/.*\.(gif|jpe?g)
+/.*/reklame/.*\.(gif|jpe?g)
+/.*/reklaam/.*\.(gif|jpe?g)
+/.*/siteads/
+/.*/sponsor.*\.gif
+/.*/sponsors?[0-9]?/
+/.*/ucbandeimg/
+/.*/werb\..*
+/.*/werbebanner/
+/.*/werbung/.*\.(gif|jpe?g)
+/.*/adv\.   # www.telegraaf.nl
+/.*/advert[0-9]+\.jpg
+/.*bann\.gif
 /Media/Images/Adds/
 /_banner/
 /ad_images/
 /adgenius/
 /adimages/
+/.*/ads/
 /viewad/
 /adserve/
 /adverts/
@@ -624,24 +476,24 @@ ar.atwola.com # This serves all ads for CNN and AOL
 /worldnet/ad\.cgi
 /zhp/auktion/img/
 /cgi-bin/nph-adclick.exe/
-/?.*/Image/BannerAdvertising/
-/?.*/ad-bin/
-/?.*/adlib/server\.cgi
-/?.*/gsa_bs/gsa_bs.cmdl
+/.*/Image/BannerAdvertising/
+/.*/ad-bin/
+/.*/adlib/server\.cgi
+/.*/gsa_bs/gsa_bs.cmdl
 /autoads/
 /anz/pics/
 
 # for our finnish friends, by Kai Puolamaki <Kai.Puolamaki@iki.fi>
-/?.*/mainos/*.*/.*\.gif
-/?.*/mainos/*.*/.*\.jpe?g
+/.*/mainos/*.*/.*\.gif
+/.*/mainos/*.*/.*\.jpe?g
 
 # more from a finnish friend Petri Haapio <pha@iki.fi>
 cgi.tietovalta.fi
 .keltaisetsivut.fi/web/img/\.*gif
 .haku.net/pics/pana\.*gif
 .www.fi/guvat/\.*gif
-/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))
-/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))
+/.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))
+/.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))
 
 # and even more from a finnish friend Hannu Napari <Hannu.Napari@hut.fi>
 194.251.243.50/cgi-bin/banner
@@ -652,21 +504,21 @@ www.iltalehti.fi/ilmkuvat
 www.mtv3.fi/mainoskuvat
 
 # <jwz@jwz.org>
-/?.*/adfinity
-/?.*/[?]adserv
-/?.*/bizgrphx/
-/?.*/smallad2\.gif
-/?.*/ana2ad\.gif
-/?.*/adimg/
-/?.*/.*counter\.pl
-/?.*/spin_html/
-/?.*/images/topics/topicgimp\.gif
+/.*/adfinity
+/.*/[?]adserv
+/.*/bizgrphx/
+/.*/smallad2\.gif
+/.*/ana2ad\.gif
+/.*/adimg/
+/.*/.*counter\.pl
+/.*/spin_html/
+/.*/images/topics/topicgimp\.gif
 .discovery.com/.*banner_id
-/?.*/.*bannr\.gif
+/.*/.*bannr\.gif
 .cruel.com/images/
 .idrink.com/frm_bottom.htm
-/?.*/.*pb_ihtml\.gif
-/?.*/ph-ad.*\.focalink\.com
+/.*/.*pb_ihtml\.gif
+/.*/ph-ad.*\.focalink\.com
 /cgi-bin/adjuggler
 
 /we_ba/ # hausfrauenseite.de *bwhahahaaaaa*
@@ -699,38 +551,38 @@ www.mtv3.fi/mainoskuvat
 /.*s_msn\.gif
 /.*addchannel\.gif
 /.*adddesktop\.gif
-/?.*/ns4\.gif
-/?.*/v3sban\.gif
-/?.*/?FPCreated\.gif
-/?.*/opera35\.gif
-/?.*/opera13\.gif
-/?.*/opera_b\.gif
-/?.*/ie_horiz\.gif
-/?.*/ie_logo\.gif
+/.*/ns4\.gif
+/.*/v3sban\.gif
+/.*/?FPCreated\.gif
+/.*/opera35\.gif
+/.*/opera13\.gif
+/.*/opera_b\.gif
+/.*/ie_horiz\.gif
+/.*/ie_logo\.gif
 
 # ... and even more!
-/?.*/favicon\.ico
+/.*/favicon\.ico
 
 # generally useless information and promo stuff (commented out)
 #/.*/(counter|getpcbutton|BuiltByNOF|netscape|hotmail|vcr(rated)?|rsaci(rated)?|freeloader|cache_now(_anim)?|apache_pb|now_(anim_)?button|ie_?(buttonlogo|static?|.*ani.*)?)\.(gif|jpe?g)
 
-/?.*/images/na/us/brand/
-/?.*/advantage\.(gif|jpg)
-/?.*/advanbar\.(gif|jpg)
-/?.*/advanbtn\.(gif|jpg)
-/?.*/biznetsmall\.(gif|jpg)
-/?.*/utopiad\.(gif|jpg)
-/?.*/epipo\.(gif|jpg)
-/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)
-/?.*/bnlogo.(gif|jpg)
-/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)
+/.*/images/na/us/brand/
+/.*/advantage\.(gif|jpg)
+/.*/advanbar\.(gif|jpg)
+/.*/advanbtn\.(gif|jpg)
+/.*/biznetsmall\.(gif|jpg)
+/.*/utopiad\.(gif|jpg)
+/.*/epipo\.(gif|jpg)
+/.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)
+/.*/bnlogo.(gif|jpg)
+/.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)
 
 /p/d/publicid
 
 
 # for the dutch folks by a dutch friend gertjan@west.nl
-/?.*/Advertenties/
-/?.*/Adverteerders/
+/.*/Advertenties/
+/.*/Adverteerders/
 .netdirect.nl/nd_servlet/___
 
 # --------------------------------------------------------------------------
@@ -1039,8 +891,8 @@ www.forbes.com/tool/images/frontend/
 www.zserver.com
 www.spinbox.com
 .pathfinder.com/shopping/marketplace/images/
-/?.*/adbanner*
-/?.*/adgraphic*
+/.*/adbanner*
+/.*/adgraphic*
 static.wired.com/images
 .perso.estat.com/cgi-bin/perso/
 #dinoadserver1.roka.net
@@ -1086,11 +938,11 @@ home.talkcity.com/homepopup.html.*
 # Banners from Freeserve
 #banner.freeservers.com/cgi-bin/fs_adbar # fixed by above regexp
 # And those nasty va-popups !
-/?.*/?va_banner.html
+/.*/?va_banner.html
 # And an all-around hit against advert*.jpg
-/?.*/advert[0-9]+\.jpg
+/.*/advert[0-9]+\.jpg
 # And yet another Internet Explorer gif ...
-/?.*/ie_horiz\.gif
+/.*/ie_horiz\.gif
 # Some uninteresting buttons I think...
 .mircx.com/images/buttons/
 services.mircx.com/.*\.gif
@@ -1309,10 +1161,6 @@ www.linux-magazin.de/banner
 # The Register ads - oh, and all images in Register stories (sigh).
 www.theregister.co.uk/media/
 
-# Used on http://www.theregister.co.uk/
-# Sample advert URL:
-# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467
-.webconnect.net
 
 # Dilbert:
 www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif
@@ -1326,11 +1174,11 @@ www.stattrack.com/stats/
 #Now they're Yahoo GeoCities, their junk is in a different place.
 ##geo.yahoo.com/serv
 ##visit.geocities.com/visit.gif
-.yimg.com/?.*/www.geocities.com/js_source
+.yimg.com/.*/www.geocities.com/js_source
 #http://us.toto.geo.yahoo.com/toto?s=76001086
 .geo.yahoo.com
 .visit.geocities.com
-.yimg.com/?.*/www.geocities.com/
+.yimg.com/.*/www.geocities.com/
 
 #http://counter16.bravenet.com/counter.php
 counter*.
@@ -1366,7 +1214,7 @@ logout.gmx.net
 logout.tvspielfilm.de
 gmx.tvspielfilm.de
 www.freenet.de/customerindex\.html
-/?.*/phpAds
+/.*/phpAds
 .fxweb.com/v2-trackrun\.cgi
 rtldating.peopleunited.de
 .advertising.com
@@ -1378,21 +1226,19 @@ fourohfour.nbci.com/Members404Error.php3
 .adlink.de
 www.fair-ist-mehr.de/cgi-bin/bt.pl
 .linkexchange.
-/?.*/adpage.asp
+/.*/adpage.asp
 /ADS
 .net-on.net
 rstrip.namezero.com
 62.26.220.2
 .doubleclick.net
-.adserver.yahoo.com
 
 #############################################################################
 {-block}
 #############################################################################
-include.ebay.com
+
 cpan.valueclick.com
 www.userfriendly.org/images/banners/banner_dp_heart\.gif
-advogato.org
 
 #Why were these in the Waldherr blockfile?
 #www.hitbox.com
@@ -1497,8 +1343,10 @@ www.iez-auktion.de
 
 
 # Jon's addition: MSDN
+
 .msdn.microsoft.com
 
+
 #js
 .adbusters.com
 .freemail*.web.de/online/ordner/anzeigen
@@ -1506,8 +1354,4 @@ foggy.sda.t-online.de
 .us.i1.yimg.com/us.yimg.com/i/pim/ad2.gif
 www.nexgo.de/.*/bg_banner.jpg
 
-# .*ads. matches prdownloads.sourceforge.net and many other download sites
-# The fix is:
-.*downloads.
-
 # End of file
diff --git a/advanced.action b/advanced.action
deleted file mode 100644 (file)
index 0285503..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/advanced.action,v $\r
-# \r
-#  $Id: advanced.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  Most agressive actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-\r
-######################################################################\r
-# Imagelist:\r
-######################################################################\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
diff --git a/amiga.c b/amiga.c
index 493a00e..789fd08 100644 (file)
--- a/amiga.c
+++ b/amiga.c
@@ -1,4 +1,4 @@
-const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
+const char amiga_rcs[] = "$Id: amiga.c,v 1.1.1.1 2001/05/15 13:58:46 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/amiga.c,v $
@@ -6,7 +6,7 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
  * Purpose     :  Amiga-specific declarations.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
@@ -28,48 +28,6 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
  *
  * Revisions   :
  *    $Log: amiga.c,v $
- *    Revision 1.8  2002/03/25 19:32:15  joergs
- *    Name in version string changed from junkbuster to Privoxy.
- *
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.5  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.4  2001/10/07 15:35:13  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.3  2001/09/12 22:54:51  joergs
- *    Stacksize of main thread increased.
- *
- *    Revision 1.2  2001/05/23 00:13:58  joergs
- *    AmigaOS support fixed.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:46  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -88,8 +46,8 @@ const char amiga_rcs[] = "$Id: amiga.c,v 1.8 2002/03/25 19:32:15 joergs Exp $";
 
 const char amiga_h_rcs[] = AMIGA_H_VERSION;
 
-unsigned long __stack = 100*1024;
-static char ver[] = "$VER: Privoxy " __AMIGAVERSION__ " (" __AMIGADATE__ ")";
+unsigned long __stack = 20*1024;
+static char ver[] = "$VER: junkbuster " __AMIGAVERSION__ " (" __AMIGADATE__ ")";
 struct Task *main_task = NULL;
 int childs = 0;
 
@@ -109,32 +67,29 @@ __saveds ULONG server_thread(void)
    {
       SetErrnoPtr(&(UserData.eno),sizeof(int));
       local_csp->cfd=ObtainSocket(local_csp->cfd, AF_INET, SOCK_STREAM, 0);
-      if(JB_INVALID_SOCKET!=local_csp->cfd)
+      if(-1!=local_csp->cfd)
       {
          Signal(main_task,SIGF_SINGLE);
          serve((struct client_state *) local_csp);
       } else {
-         local_csp->flags &= ~CSP_FLAG_ACTIVE;
+         local_csp->active = 0;
          Signal(main_task,SIGF_SINGLE);
       }
       CloseLibrary(SocketBase);
    } else {
-      local_csp->flags &= ~CSP_FLAG_ACTIVE;
+      local_csp->active = 0;
       Signal(main_task,SIGF_SINGLE);
    }
    childs--;
    return 0;
 }
 
-static BPTR olddir;
-
 void amiga_exit(void)
 {
    if(SocketBase)
    {
       CloseLibrary(SocketBase);
    }
-   CurrentDir(olddir);
 }
 
 static struct SignalSemaphore memsem;
@@ -162,13 +117,12 @@ void InitAmiga(void)
    InitSemaphore(&memsem);
    memsemptr = &memsem;
 
-   olddir=CurrentDir(GetProgramDir());
    atexit(amiga_exit);
 }
 
 #ifdef __GNUC__
 #ifdef libnix
-/* multithreadingsafe libnix replacements */
+/* multitaskingsafe libnix replacements */
 static void *memPool=NULL;
 
 void *malloc (size_t s)
@@ -277,7 +231,7 @@ ADD2EXIT(__memCleanUp,-50);
 #error No libnix and no ixemul!?
 #endif /* libnix */
 #else
-#error Only GCC is supported, multithreading safe malloc/free required.
+#error Only GCC is supported, multitasking safe malloc/free required.
 #endif /* __GNUC__ */
 
 #endif /* def AMIGA */
diff --git a/amiga.h b/amiga.h
index 580dc32..5393304 100644 (file)
--- a/amiga.h
+++ b/amiga.h
@@ -1,7 +1,7 @@
 #ifdef AMIGA
-#ifndef AMIGA_H_INCLUDED
-#define AMIGA_H_INCLUDED
-#define AMIGA_H_VERSION "$Id: amiga.h,v 1.8 2002/03/24 13:25:43 swa Exp $"
+#ifndef _AMIGA_H
+#define _AMIGA_H
+#define AMIGA_H_VERSION "$Id: amiga.h,v 1.3 2001/05/25 21:53:27 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/amiga.h,v $
@@ -9,7 +9,7 @@
  * Purpose     :  Amiga-specific declarations.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *
  * Revisions   :
  *    $Log: amiga.h,v $
- *    Revision 1.8  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.7  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.6  2001/10/13 12:46:08  joergs
- *    Added #undef EINTR to avoid warnings
- *
- *    Revision 1.5  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.4  2001/05/29 20:05:06  joergs
- *    Fixed exit() macro not exiting if called before InitAmiga()
- *    (junkbuster --help and --version).
- *
  *    Revision 1.3  2001/05/25 21:53:27  jongfoster
  *    Fixing indentation
  *
@@ -70,7 +53,6 @@
 #undef __NOLIBBASE__
 
 #define __CONSTLIBBASEDECL__ const
-#define DEVICES_TIMER_H
 #include <proto/exec.h>
 #include <exec/tasks.h>
 #include <proto/dos.h>
@@ -116,8 +98,7 @@ __saveds ULONG server_thread(void);
    }                                                        \
 }
 
-#undef EINTR
 #define EINTR 0
 
-#endif /* ndef AMIGA_H_INCLUDED */
+#endif /* ndef _AMIGA_H */
 #endif /* def AMIGA */
diff --git a/basic.action b/basic.action
deleted file mode 100644 (file)
index 567f6b9..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/basic.action,v $\r
-# \r
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  Very basic actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-{{alias}}\r
-+imageblock = +block +image\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-{\\r
-+deanimate-gifs{last} \\r
-+image-blocker{trans} \\r
-+hide-referer{forge} \\r
-+no-cookies-keep \\r
--filter \\r
-}\r
-/ # Match all URLs\r
-\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-{+image}\r
-#############################################################################\r
-/.*\.gif\r
-/.*\.jpe?g\r
-/.*\.png\r
-\r
-#############################################################################\r
-{+imageblock}\r
-#############################################################################\r
-.ad.doubleclick.net\r
-.adforce.imgis.com\r
-.focalink.com\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-{+block}\r
-#############################################################################\r
-\r
-# generic hosts (probably most effective)\r
-ad*.\r
-.*ads.\r
-banner.\r
-\r
-/.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))\r
-/.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])\r
-/.*/(ng)?adclient\.cgi\r
-/.*/(plain|live|rotate)[-_.]?ads?/\r
-/.*/(sponsor)s?[0-9]?/\r
-/?.*/_?(plain|live)?ads?(-banners)?/\r
-/?.*/abanners/\r
-/?.*/ad(sdna_image|gifs?)/\r
-/?.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)\r
-/?.*/adbanners/\r
-/?.*/adserver\r
-/?.*/adstream\.cgi\r
-/?.*/adv((er)?ts?|ertis(ing|ements?))?/\r
-/?.*/anzei(gen)?/?\r
-/?.*/ban[-_]cgi/\r
-/?.*/banner_?ads/\r
-/?.*/banner_?anzeigen\r
-/?.*/bannerimage/\r
-/?.*/banners?/\r
-/?.*/banners?\.cgi/\r
-/?.*/cgi-bin/centralad/getimage\r
-/?.*/images/addver\.gif\r
-/?.*/images/advert\.gif\r
-/?.*/images/marketing/.*\.(gif|jpe?g)\r
-/?.*/place-ads\r
-/?.*/popupads/\r
-/?.*/promobar.*\r
-/?.*/publicite/\r
-/?.*/randomads/.*\.(gif|jpe?g)\r
-/?.*/rekla(ma|me|am)/.*\.(gif|jpe?g)\r
-/?.*/siteads/\r
-/?.*/sponsor.*\.gif\r
-/?.*/sponsors?[0-9]?/\r
-/?.*/ucbandeimg/\r
-/?.*/werb\..*\r
-/?.*/werbebanner/\r
-/?.*/werbung/.*\.(gif|jpe?g)\r
-/?.*/adv\.   # www.telegraaf.nl\r
-/?.*/advert[0-9]+\.jpg\r
-/?.*bann\.gif\r
-/?.*/ads/\r
-/_banner/\r
-/ad_images/\r
-/adgenius/\r
-/adimages/\r
-/viewad/\r
-/adserve/\r
-/adverts/\r
-/annonser?/\r
-/bando/\r
-/bannerad/\r
-/bannerfarm/\r
-/bin/getimage.cgi/...\?AD\r
-/bin/nph-oma.count/ct/default.shtml\r
-/bin/nph-oma.count/ix/default.html\r
-/cgi-bin/getimage.cgi/....\?GROUP=\r
-/cgi-bin/nph-load\r
-/cgi-bin/webad.dll/ad\r
-/cwmail/acc\.gif\r
-/cwmail/amzn-bm1\.gif\r
-/db_area/banrgifs/\r
-/gif/teasere/\r
-/grafikk/annonse/\r
-/graphics/defaultAd/\r
-/grf/annonif\r
-/htmlad/\r
-/image\.ng/AdType\r
-/image\.ng/transactionID\r
-/images/.*/.*_anim\.gif # alvin brattli\r
-/ip_img/.*\.(gif|jpe?g)\r
-/marketpl*/\r
-/minibanners/\r
-/netscapeworld/nw-ad/\r
-/promotions/houseads/\r
-/rotads/ \r
-/rotateads/\r
-/rotations/ \r
-/torget/jobline/.*\.gif\r
-/viewad/\r
-/werbung/\r
-/worldnet/ad\.cgi\r
-/zhp/auktion/img/\r
-/cgi-bin/nph-adclick.exe/\r
-/?.*/Image/BannerAdvertising/\r
-/?.*/ad-bin/\r
-/?.*/adlib/server\.cgi\r
-/?.*/gsa_bs/gsa_bs.cmdl\r
-/autoads/\r
-/anz/pics/\r
-# for our finnish friends, by Kai Puolamaki <Kai.Puolamaki@iki.fi>\r
-/?.*/mainos/*.*/.*\.gif\r
-/?.*/mainos/*.*/.*\.jpe?g\r
-# more from a finnish friend Petri Haapio <pha@iki.fi>\r
-/?.*/(.*[-_.].*)?maino(kset|nta|s).*(/|\.(gif|html?|jpe?g|png))\r
-/?.*/(ilm(oitus)?|kampanja)(hallinta|kuvat?)(/|\.(gif|html?|jpe?g|png))\r
-# <jwz@jwz.org>\r
-/?.*/adfinity\r
-/?.*/[?]adserv\r
-/?.*/bizgrphx/\r
-/?.*/smallad2\.gif\r
-/?.*/ana2ad\.gif\r
-/?.*/adimg/\r
-/?.*/.*counter\.pl\r
-/?.*/spin_html/\r
-/?.*/images/topics/topicgimp\.gif\r
-.discovery.com/.*banner_id\r
-/?.*/.*bannr\.gif\r
-.cruel.com/images/\r
-.idrink.com/frm_bottom.htm\r
-/?.*/.*pb_ihtml\.gif\r
-/?.*/ph-ad.*\.focalink\.com\r
-/cgi-bin/adjuggler\r
-\r
-# ms sucks !\r
-/.*(ms)?backoff(ice)?.*\.(gif|jpe?g)\r
-/.*(/ie4|/ie3|msie|sqlbans|powrbybo|activex|backoffice|explorer|netnow|getpoint|ntbutton|hmlink).*\.(gif|jpe?g)\r
-/.*activex.*(gif|jpe?g)\r
-/.*explorer?.(gif|jpe?g)\r
-/.*freeie\.(gif|jpe?g)\r
-/.*/ie_?(buttonlogo|static?|anim.*)?\.(gif|jpe?g)\r
-/.*ie_sm\.(gif|jpe?g)\r
-/.*msie(30)?\.(gif|jpe?g)\r
-/.*msnlogo\.(gif|jpe?g)\r
-/.*office97_ad1\.(gif|jpe?g)\r
-/.*pbbobansm\.(gif|jpe?g)\r
-/.*powrbybo\.(gif|jpe?g)\r
-/.*sqlbans\.(gif|jpe?g)\r
-/.*exc_ms\.gif\r
-/.*ie4get_animated\.gif\r
-/.*ie4_animated\.gif\r
-/.*n_iemap\.gif\r
-/.*ieget\.gif\r
-/.*logo_msnhm_*\r
-/.*mcsp2\.gif\r
-/.*msn2\.gif\r
-/.*add_active\.gif\r
-/.*n_msnmap\.gif\r
-/.*Ad00\.gif\r
-/.*s_msn\.gif\r
-/.*addchannel\.gif\r
-/.*adddesktop\.gif\r
-/?.*/ns4\.gif\r
-/?.*/v3sban\.gif\r
-/?.*/?FPCreated\.gif\r
-/?.*/opera35\.gif\r
-/?.*/opera13\.gif\r
-/?.*/opera_b\.gif\r
-/?.*/ie_horiz\.gif\r
-/?.*/ie_logo\.gif\r
-# ... and even more!\r
-/?.*/favicon\.ico\r
-\r
-/?.*/images/na/us/brand/\r
-/?.*/advantage\.(gif|jpg)\r
-/?.*/advanbar\.(gif|jpg)\r
-/?.*/advanbtn\.(gif|jpg)\r
-/?.*/biznetsmall\.(gif|jpg)\r
-/?.*/utopiad\.(gif|jpg)\r
-/?.*/epipo\.(gif|jpg)\r
-/?.*/amazon([a-zA-Z0-9]+)\.(gif|jpg)\r
-/?.*/bnlogo.(gif|jpg)\r
-/?.*/buynow([a-zA-Z0-9]+)\.(gif|jpg)\r
-\r
-# for the dutch folks by a dutch friend gertjan@west.nl\r
-/?.*/Advertenties/\r
-/?.*/Adverteerders/\r
-.netdirect.nl/nd_servlet/___\r
-\r
-.admaximize.com\r
-.imgis.com\r
-\r
-# wayne@staff.msen.com\r
-a*.*.*.yimg.com/([0-9]*|\/)*us.yimg.com/*\r
-\r
-####################################################\r
-# Jon's addition:\r
-#\r
-# The Register ads - oh, and all images in Register stories (sigh).\r
-www.theregister.co.uk/media/\r
-\r
-# Used on http://www.theregister.co.uk/\r
-# Sample advert URL:\r
-# http://secure.webconnect.net/cgi-bin/webconnecthome.dll?F467\r
-.webconnect.net\r
-\r
-# Dilbert:\r
-www.dilbert.com/comics/dilbert/images/.*_140x800.*\.gif\r
-\r
-# stattrack.com\r
-# Uses URL: http://www.stattrack.com/cgi-bin/stats/image.cgi\r
-/cgi-bin/stats/\r
-# And loads JavaScript from http://www.stattrack.com/stats/code\r
-www.stattrack.com/stats/\r
-\r
-#Now they're Yahoo GeoCities, their junk is in a different place.\r
-##geo.yahoo.com/serv\r
-##visit.geocities.com/visit.gif\r
-.yimg.com/?.*/www.geocities.com/js_source\r
-#http://us.toto.geo.yahoo.com/toto?s=76001086\r
-.geo.yahoo.com\r
-.visit.geocities.com\r
-.yimg.com/?.*/www.geocities.com/\r
-\r
-.exitexchange.com\r
-\r
-#SourceForge ads.\r
-sfads.osdn.com\r
-\r
-#This site traps the browser\r
-.webhideout.com\r
-\r
-#privacy.net runs ads\r
-.a.consumer.net\r
-\r
-#Lindsay.Marshall@newcastle.ac.uk suggested these, to kill Opera adverts:\r
-www.qksrv.net\r
-mirror.qkimg.net\r
-\r
-#js\r
-dinoadserver*.roka.net\r
-logout.gmx.net\r
-logout.tvspielfilm.de\r
-gmx.tvspielfilm.de\r
-www.freenet.de/customerindex\.html\r
-/?.*/phpAds\r
-.fxweb.com/v2-trackrun\.cgi\r
-rtldating.peopleunited.de\r
-.advertising.com\r
-www.zdnet.com/fcgi-bin/\r
-service.bfast.com/bfast/serve\r
-199.172.144.25\r
-fourohfour.nbci.com/Members404Error.php3\r
-.adtech.de\r
-.adlink.de\r
-www.fair-ist-mehr.de/cgi-bin/bt.pl\r
-.linkexchange.\r
-/?.*/adpage.asp\r
-/ADS\r
-.net-on.net\r
-rstrip.namezero.com\r
-62.26.220.2\r
-.doubleclick.net\r
-.adserver.yahoo.com\r
-\r
-#############################################################################\r
-{-block}\r
-#############################################################################\r
-.admin.\r
-.edu\r
-.ac.uk    # English Universities too! - Jon\r
-.uni-*.de # What about Germany? --oes\r
-# my banking stuff => no ads.\r
-.comdirekt.de\r
-.comdirect.de\r
-.teledata.de\r
-# Jon's addition: MSDN\r
-.msdn.microsoft.com\r
-# .*ads. matches prdownloads.sourceforge.net and many other download sites\r
-# The fix is:\r
-.*downloads.\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
diff --git a/cgi.c b/cgi.c
index a569441..55935c2 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,18 +1,16 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.8 2001/06/29 13:21:46 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.c,v $
  *
  * Purpose     :  Declares functions to intercept request, generate
  *                html or gif answers, and to compose HTTP resonses.
- *                This only contains the framework functions, the
- *                actual handler functions are declared elsewhere.
  *                
  *                Functions declared include:
  * 
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -38,218 +36,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
  *
  * Revisions   :
  *    $Log: cgi.c,v $
- *    Revision 1.56  2002/03/24 17:50:46  jongfoster
- *    Fixing compile error if actions file editor disabled
- *
- *    Revision 1.55  2002/03/24 16:55:06  oes
- *    Making GIF checkerboard transparent
- *
- *    Revision 1.54  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.53  2002/03/24 16:06:00  oes
- *    Correct transparency for checkerboard PNG. Thanks, Magnus!
- *
- *    Revision 1.52  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.51  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.50  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.49  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.48  2002/03/08 17:47:07  jongfoster
- *    Adding comments
- *
- *    Revision 1.47  2002/03/08 16:41:33  oes
- *    Added GIF images again
- *
- *    Revision 1.46  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.45  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.44  2002/03/05 22:43:45  david__schmidt
- *    - Better error reporting on OS/2
- *    - Fix double-slash comment (oops)
- *
- *    Revision 1.43  2002/03/05 21:33:45  david__schmidt
- *    - Re-enable OS/2 building after new parms were added
- *    - Fix false out of memory report when resolving CGI templates when no IP
- *      address is available of failed attempt (a la no such domain)
- *
- *    Revision 1.42  2002/01/21 00:33:20  jongfoster
- *    Replacing strsav() with the safer string_append() or string_join().
- *    Adding map_block_keep() to save a few bytes in the edit-actions-list HTML.
- *    Adding missing html_encode() to error message generators.
- *    Adding edit-actions-section-swap and many "shortcuts" to the list of CGIs.
- *
- *    Revision 1.41  2002/01/17 20:56:22  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.40  2002/01/09 14:26:46  oes
- *    Added support for thread-safe gmtime_r call.
- *
- *    Revision 1.39  2001/11/16 00:48:13  jongfoster
- *    Fixing a compiler warning
- *
- *    Revision 1.38  2001/11/13 00:31:21  jongfoster
- *    - Adding new CGIs for use by non-JavaScript browsers:
- *        edit-actions-url-form
- *        edit-actions-add-url-form
- *        edit-actions-remove-url-form
- *    - Fixing make_menu()'s HTML generation - it now quotes the href parameter.
- *    - Fixing || bug.
- *
- *    Revision 1.37  2001/11/01 14:28:47  david__schmidt
- *    Show enablement/disablement status in almost all templates.
- *    There is a little trickiness here: apparent recursive resolution of
- *    @if-enabled-then@ caused the toggle template to show status out-of-phase with
- *    the actual enablement status.  So a similar construct,
- *    @if-enabled-display-then@, is used to resolve the status display on non-'toggle'
- *    templates.
- *
- *    Revision 1.36  2001/10/26 17:33:27  oes
- *    marginal bugfix
- *
- *    Revision 1.35  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.34  2001/10/18 22:22:09  david__schmidt
- *    Only show "Local support" on templates conditionally:
- *      - if either 'admin-address' or 'proxy-info-url' are uncommented in config
- *      - if not, no Local support section appears
- *
- *    Revision 1.33  2001/10/14 22:28:41  jongfoster
- *    Fixing stupid typo.
- *
- *    Revision 1.32  2001/10/14 22:20:18  jongfoster
- *    - Changes to CGI dispatching method to match CGI names exactly,
- *      rather than doing a prefix match.
- *    - No longer need to count the length of the CGI handler names by hand.
- *    - Adding new handler for 404 error when disptching a CGI, if none of
- *      the handlers match.
- *    - Adding new handlers for CGI actionsfile editor.
- *
- *    Revision 1.31  2001/10/10 10:56:39  oes
- *    Failiure to load template now fatal. Before, the user got a hard-to-understand assertion failure from cgi.c
- *
- *    Revision 1.30  2001/10/02 15:30:57  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.29  2001/09/20 15:47:44  steudten
- *
- *    Fix BUG: Modify int size to size_t size in fill_template()
- *     - removes big trouble on machines where sizeof(int) != sizeof(size_t).
- *
- *    Revision 1.28  2001/09/19 18:00:37  oes
- *     - Deletef time() FIXME (Can't fail under Linux either, if
- *       the argument is guaranteed to be in out address space,
- *       which it is.)
- *     - Fixed comments
- *     - Pointer notation cosmetics
- *     - Fixed a minor bug in template_fill(): Failiure of
- *       pcrs_execute() now secure.
- *
- *    Revision 1.27  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *    Revision 1.26  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *    Revision 1.25  2001/09/16 15:02:35  jongfoster
- *    Adding i.j.b/robots.txt.
- *    Inlining add_stats() since it's only ever called from one place.
- *
- *    Revision 1.24  2001/09/16 11:38:01  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.23  2001/09/16 11:16:05  jongfoster
- *    Better error handling in dispatch_cgi() and parse_cgi_parameters()
- *
- *    Revision 1.22  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.21  2001/09/13 23:53:03  jongfoster
- *    Support for both static and dynamically generated CGI pages.
- *    Correctly setting Last-Modified: and Expires: HTTP headers.
- *
- *    Revision 1.20  2001/09/13 23:40:36  jongfoster
- *    (Cosmetic only) Indentation correction
- *
- *    Revision 1.19  2001/09/13 23:31:25  jongfoster
- *    Moving image data to cgi.c rather than cgi.h.
- *
- *    Revision 1.18  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.17  2001/08/05 15:57:38  oes
- *    Adapted finish_http_response to new list_to_text
- *
- *    Revision 1.16  2001/08/01 21:33:18  jongfoster
- *    Changes to fill_template() that reduce memory usage without having
- *    an impact on performance.  I also renamed some variables so as not
- *    to clash with the C++ keywords "new" and "template".
- *
- *    Revision 1.15  2001/08/01 21:19:22  jongfoster
- *    Moving file version information to a separate CGI page.
- *
- *    Revision 1.14  2001/08/01 00:19:03  jongfoster
- *    New function: map_conditional() for an if-then-else syntax.
- *    Changing to use new version of show_defines()
- *
- *    Revision 1.13  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.12  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.11  2001/07/18 17:24:37  oes
- *    Changed to conform to new pcrs interface
- *
- *    Revision 1.10  2001/07/13 13:53:13  oes
- *    Removed all #ifdef PCRS and related code
- *
- *    Revision 1.9  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.8  2001/06/29 13:21:46  oes
  *    - Cosmetics: renamed and reordered functions, variables,
  *      texts, improved comments  etc
@@ -332,7 +118,6 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
 #include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
-#include <assert.h>
 
 #ifdef _WIN32
 #define snprintf _snprintf
@@ -341,198 +126,45 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.56 2002/03/24 17:50:46 jongfoster Exp $";
 #include "project.h"
 #include "cgi.h"
 #include "list.h"
+#include "pcrs.h"
 #include "encode.h"
 #include "ssplit.h"
+#include "jcc.h"
+#include "filters.h"
+#include "actions.h"
 #include "errlog.h"
 #include "miscutil.h"
-#include "cgisimple.h"
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-#include "cgiedit.h"
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#include "loadcfg.h"
-/* loadcfg.h is for g_bToggleIJB only */
+#include "showargs.h"
 
 const char cgi_h_rcs[] = CGI_H_VERSION;
 
-static const struct cgi_dispatcher cgi_dispatchers[] = {
-   { "",
-         cgi_default,
-         "Privoxy main page" },
-#ifdef FEATURE_GRACEFUL_TERMINATION
-   { "die", 
-         cgi_die,  
-         "<b>Shut down</b> - <font color=red size='+1'>Do not deploy this build in a production environment, this is a one click Denial Of Service attack!!!</font>" }, 
-#endif
+const struct cgi_dispatcher cgi_dispatcher[] = {
    { "show-status", 
-         cgi_show_status,  
-         "Show information about the current configuration" }, 
-   { "show-version", 
-         cgi_show_version,  
-         "Show the source code version numbers" }, 
-   { "show-request", 
-         cgi_show_request,  
-         "Show the client's request headers." }, 
+         11, cgi_show_status,  
+         "Show information about the version and configuration" }, 
    { "show-url-info",
-         cgi_show_url_info, 
+         13, cgi_show_url_info, 
          "Show which actions apply to a URL and why"  },
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   { "toggle",
-         cgi_toggle, 
-         "Toggle Privoxy on or off" },
-   { "edit-actions",
-         cgi_edit_actions, 
-         "Edit the actions list" },
-
-   
-   { "eaa", /* Shortcut for edit-actions-add-url-form */
-         cgi_edit_actions_add_url_form, 
-         NULL },
-   { "eau", /* Shortcut for edit-actions-url-form */
-         cgi_edit_actions_url_form, 
-         NULL },
-   { "ear", /* Shortcut for edit-actions-remove-url-form */
-         cgi_edit_actions_remove_url_form, 
-         NULL },
-   { "eas", /* Shortcut for edit-actions-for-url */
-         cgi_edit_actions_for_url, 
-         NULL },
-   { "easa", /* Shortcut for edit-actions-section-add */
-         cgi_edit_actions_section_add, 
-         NULL },
-   { "easr", /* Shortcut for edit-actions-section-remove */
-         cgi_edit_actions_section_remove, 
-         NULL },
-   { "eass", /* Shortcut for edit-actions-section-swap */
-         cgi_edit_actions_section_swap, 
-         NULL },
-   { "edit-actions-for-url",
-         cgi_edit_actions_for_url, 
-         NULL /* Edit the actions for (a) specified URL(s) */ },
-   { "edit-actions-list",
-         cgi_edit_actions_list, 
-         NULL /* Edit the actions list */ },
-   { "edit-actions-submit",
-         cgi_edit_actions_submit, 
-         NULL /* Change the actions for (a) specified URL(s) */ },
-   { "edit-actions-url",
-         cgi_edit_actions_url, 
-         NULL /* Change a URL pattern in the actionsfile */ },
-   { "edit-actions-url-form",
-         cgi_edit_actions_url_form, 
-         NULL /* Form to change a URL pattern in the actionsfile */ },
-   { "edit-actions-add-url",
-         cgi_edit_actions_add_url, 
-         NULL /* Add a URL pattern to the actionsfile */ },
-   { "edit-actions-add-url-form",
-         cgi_edit_actions_add_url_form, 
-         NULL /* Form to add a URL pattern to the actionsfile */ },
-   { "edit-actions-remove-url",
-         cgi_edit_actions_remove_url, 
-         NULL /* Remove a URL pattern from the actionsfile */ },
-   { "edit-actions-remove-url-form",
-         cgi_edit_actions_remove_url_form, 
-         NULL /* Form to remove a URL pattern from the actionsfile */ },
-   { "edit-actions-section-add",
-         cgi_edit_actions_section_add, 
-         NULL /* Remove a section from the actionsfile */ },
-   { "edit-actions-section-remove",
-         cgi_edit_actions_section_remove, 
-         NULL /* Remove a section from the actionsfile */ },
-   { "edit-actions-section-swap",
-         cgi_edit_actions_section_swap, 
-         NULL /* Swap two sections in the actionsfile */ },
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-   { "robots.txt", 
-         cgi_robots_txt,  
-         NULL /* Sends a robots.txt file to tell robots to go away. */ }, 
    { "send-banner",
-         cgi_send_banner, 
-         NULL /* Send a built-in image */ },
-   { "t",
-         cgi_transparent_image, 
-         NULL /* Send a transparent image (short name) */ },
-   { NULL, /* NULL Indicates end of list and default page */
-         cgi_error_404,
-         NULL /* Unknown CGI page */ }
+         11, cgi_send_banner, 
+         "HIDE Send the transparent or \"Junkbuster\" gif" },
+   { "",
+         0, cgi_default,
+         "Junkbuster main page" },
+   { NULL, 0, NULL, NULL }
 };
 
 
-/*
- * Bulit-in images for ad replacement
- *
- * Hint: You can encode your own images like this:
- * cat your-image | perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o", unpack("C", $c)); }'
- */
-
-#ifdef FEATURE_NO_GIFS
-
-/*
- * Checkerboard pattern, as a PNG.
- */
-const char image_pattern_data[] =
-   "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104"
-   "\122\000\000\000\004\000\000\000\004\010\002\000\000\000\046"
-   "\223\011\051\000\000\000\006\142\113\107\104\000\310\000\310"
-   "\000\310\052\045\225\037\000\000\000\032\111\104\101\124\170"
-   "\332\143\070\161\342\304\377\377\377\041\044\003\234\165\342"
-   "\304\011\006\234\062\000\125\200\052\251\125\174\360\223\000"
-   "\000\000\000\111\105\116\104\256\102\140\202";
-
-/*
- * 1x1 transparant PNG.
- */
-const char image_blank_data[] =
- "\211\120\116\107\015\012\032\012\000\000\000\015\111\110\104\122"
- "\000\000\000\004\000\000\000\004\010\006\000\000\000\251\361\236"
- "\176\000\000\000\007\164\111\115\105\007\322\003\013\020\073\070"
- "\013\025\036\203\000\000\000\011\160\110\131\163\000\000\013\022"
- "\000\000\013\022\001\322\335\176\374\000\000\000\004\147\101\115"
- "\101\000\000\261\217\013\374\141\005\000\000\000\033\111\104\101"
- "\124\170\332\143\070\161\342\304\207\377\377\377\347\302\150\006"
- "\144\016\210\146\040\250\002\000\042\305\065\221\270\027\131\110"
- "\000\000\000\000\111\105\116\104\256\102\140\202";
-#else
-
-/*
- * Checkerboard pattern, as a GIF.
- */
-const char image_pattern_data[] =
-   "\107\111\106\070\071\141\004\000\004\000\200\000\000\310\310"
-   "\310\377\377\377\041\376\016\111\040\167\141\163\040\141\040"
-   "\142\141\156\156\145\162\000\041\371\004\001\012\000\001\000"
-   "\054\000\000\000\000\004\000\004\000\000\002\005\104\174\147"
-   "\270\005\000\073";
-
-/*
- * 1x1 transparant GIF.
- */
-const char image_blank_data[] =
-   "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000"
-   "\000!\371\004\001\000\000\000\000,\000\000\000\000\001"
-   "\000\001\000\000\002\002D\001\000;";
-#endif
-
-const size_t image_pattern_length = sizeof(image_pattern_data) - 1;
-const size_t image_blank_length   = sizeof(image_blank_data) - 1;
-
-
-static struct http_response cgi_error_memory_response[1];
-
-static struct http_response *dispatch_known_cgi(struct client_state * csp,
-                                                const char * path);
-static struct map *parse_cgi_parameters(char *argstring);
-
-
 /*********************************************************************
  * 
  * Function    :  dispatch_cgi
  *
- * Description :  Checks if a request URL has either the magical
- *                hostname CGI_SITE_1_HOST (usully http://i.j.b/) or
- *                matches CGI_SITE_2_HOST CGI_SITE_2_PATH (usually
- *                http://ijbswa.sourceforge.net/config). If so, it passes
- *                the (rest of the) path onto dispatch_known_cgi, which
- *                calls the relevant CGI handler function.
+ * Description :  Checks if a request URL has either the magical hostname
+ *                i.j.b or matches HOME_PAGE_URL/config/. If so, it parses
+ *                the (rest of the) path as a cgi name plus query string,
+ *                prepares a map that maps CGI parameter names to their values,
+ *                initializes the http_response struct, and calls the 
+ *                relevant CGI handler function.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
@@ -542,47 +174,31 @@ static struct map *parse_cgi_parameters(char *argstring);
  *********************************************************************/
 struct http_response *dispatch_cgi(struct client_state *csp)
 {
-   const char *host = csp->http->host;
-   const char *path = csp->http->path;
+   char *argstring = NULL;
+   const struct cgi_dispatcher *d;
+   struct map *param_list;
+   struct http_response *rsp;
 
    /*
     * Should we intercept ?
     */
 
-   /* Note: "example.com" and "example.com." are equivalent hostnames. */
-
-   /* Either the host matches CGI_SITE_1_HOST ..*/
-   if (   ( (0 == strcmpic(host, CGI_SITE_1_HOST))
-         || (0 == strcmpic(host, CGI_SITE_1_HOST ".")))
-       && (path[0] == '/') )
+   /* Either the host matches CGI_PREFIX_HOST ..*/
+   if (0 == strcmpic(csp->http->host, CGI_PREFIX_HOST))
    {
-      /* ..then the path will all be for us.  Remove leading '/' */
-      path++;
+      /* ..then the path will all be for us */
+      argstring = csp->http->path;
    }
-   /* Or it's the host part CGI_SITE_2_HOST, and the path CGI_SITE_2_PATH */
-   else if ( ( (0 == strcmpic(host, CGI_SITE_2_HOST ))
-            || (0 == strcmpic(host, CGI_SITE_2_HOST ".")) )
-          && (0 == strncmpic(path, CGI_SITE_2_PATH, strlen(CGI_SITE_2_PATH))) )
+   /* Or it's the host part HOME_PAGE_URL, and the path /config ? */
+   else if (   (0 == strcmpic(csp->http->host, HOME_PAGE_URL + 7 ))
+            && (0 == strncmpic(csp->http->path,"/config", 7))
+            && ((csp->http->path[7] == '/') || (csp->http->path[7] == '\0')))
    {
-      /* take everything following CGI_SITE_2_PATH */
-      path += strlen(CGI_SITE_2_PATH);
-      if (*path == '/')
-      {
-         /* skip the forward slash after CGI_SITE_2_PATH */
-         path++;
-      }
-      else if (*path != '\0')
-      {
-         /*
-          * wierdness: URL is /configXXX, where XXX is some string
-          * Do *NOT* intercept.
-          */
-         return NULL;
-      }
+      /* then it's everything following "/config" */
+      argstring = csp->http->path + 7;
    }
    else
    {
-      /* Not a CGI */
       return NULL;
    }
 
@@ -590,74 +206,16 @@ struct http_response *dispatch_cgi(struct client_state *csp)
     * This is a CGI call.
     */
 
-   return dispatch_known_cgi(csp, path);
-}
-
-
-/*********************************************************************
- * 
- * Function    :  dispatch_known_cgi
- *
- * Description :  Processes a CGI once dispatch_cgi has determined that
- *                it matches one of the magic prefixes. Parses the path
- *                as a cgi name plus query string, prepares a map that
- *                maps CGI parameter names to their values, initializes
- *                the http_response struct, and calls the relevant CGI
- *                handler function.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  path = Path of CGI, with the CGI prefix removed.
- *                       Should not have a leading "/".
- *
- * Returns     :  http_response, or NULL on handler failure or out of
- *                memory.
- *
- *********************************************************************/
-static struct http_response *dispatch_known_cgi(struct client_state * csp,
-                                                const char * path)
-{
-   const struct cgi_dispatcher *d;
-   struct map *param_list;
-   struct http_response *rsp;
-   char *query_args_start;
-   char *path_copy;
-   jb_err err;
-
-   if (NULL == (path_copy = strdup(path)))
-   {
-      return cgi_error_memory();
-   }
-
-   query_args_start = path_copy;
-   while (*query_args_start && *query_args_start != '?')
-   {
-      query_args_start++;
-   }
-   if (*query_args_start == '?')
+   /* Get mem for response or fail*/
+   if (NULL == ( rsp = zalloc(sizeof(*rsp))))
    {
-      *query_args_start++ = '\0';
+      return NULL;
    }
 
-   if (NULL == (param_list = parse_cgi_parameters(query_args_start)))
+   /* Remove leading slash */
+   if (*argstring == '/')
    {
-      free(path_copy);
-      return cgi_error_memory();
-   }
-
-
-   /*
-    * At this point:
-    * path_copy        = CGI call name
-    * param_list       = CGI params, as map
-    */
-
-   /* Get mem for response or fail*/
-   if (NULL == (rsp = alloc_http_response()))
-   {
-      free(path_copy);
-      free_map(param_list);
-      return cgi_error_memory();
+      argstring++;
    }
 
    log_error(LOG_LEVEL_GPC, "%s%s cgi call", csp->http->hostport, csp->http->path);
@@ -665,32 +223,25 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
                             csp->ip_addr_str, csp->http->cmd); 
 
    /* Find and start the right CGI function*/
-   d = cgi_dispatchers;
-   for (;;)
+   for (d = cgi_dispatcher; d->handler; d++)
    {
-      if ((d->name == NULL) || (strcmp(path_copy, d->name) == 0))
+      if (strncmp(argstring, d->name, d->name_length) == 0)
       {
-         err = (d->handler)(csp, rsp, param_list);
-         free(path_copy);
-         free_map(param_list);
-         if (err == JB_ERR_CGI_PARAMS)
-         {
-            err = cgi_error_bad_param(csp, rsp);
-         }
-         if (!err)
-         {
-            /* It worked */
-            return finish_http_response(rsp);
-         }
-         else
+         param_list = parse_cgi_parameters(argstring + d->name_length);
+         if ((d->handler)(csp, rsp, param_list))
          {
-            /* Error in handler, probably out-of-memory */
-            free_http_response(rsp);
-            return cgi_error_memory();
+            freez(rsp);
          }
+
+         free_map(param_list);
+         return(finish_http_response(rsp));
       }
-      d++;
    }
+
+   /* Can't get here, since cgi_default will match all requests */
+   freez(rsp);
+   return(NULL);
+
 }
 
 
@@ -702,361 +253,521 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
  *                pairs and store them in a struct map list.
  *
  * Parameters  :
- *          1  :  string = string to be parsed.  Will be trashed.
+ *          1  :  string = string to be parsed 
  *
- * Returns     :  pointer to param list, or NULL if out of memory.
+ * Returns     :  poniter to param list, or NULL if failiure
  *
  *********************************************************************/
-static struct map *parse_cgi_parameters(char *argstring)
+struct map *parse_cgi_parameters(char *argstring)
 {
-   char *p;
+   char *tmp, *p;
    char *vector[BUFFER_SIZE];
    int pairs, i;
-   struct map *cgi_params;
+   struct map *cgi_params = NULL;
 
-   if (NULL == (cgi_params = new_map()))
-   {
-      return NULL;
-   }
+   if(*argstring == '?') argstring++;
+   tmp = strdup(argstring);
 
-   pairs = ssplit(argstring, "&", vector, SZ(vector), 1, 1);
+   pairs = ssplit(tmp, "&", vector, SZ(vector), 1, 1);
 
    for (i = 0; i < pairs; i++)
    {
       if ((NULL != (p = strchr(vector[i], '='))) && (*(p+1) != '\0'))
       {
          *p = '\0';
-         if (map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0))
-         {
-            free_map(cgi_params);
-            return NULL;
-         }
+         cgi_params = map(cgi_params, url_decode(vector[i]), 0, url_decode(++p), 0);
       }
    }
 
-   return cgi_params;
+   free(tmp);
+   return(cgi_params);
 
 }
 
 
 /*********************************************************************
  *
- * Function    :  error_response
- *
- * Description :  returns an http_response that explains the reason
- *                why a request failed.
+ * Function    :  cgi_default
  *
+ * Description :  CGI function that is called if no action was given.
+ *                Lists menu of available unhidden CGIs.
+ *               
  * Parameters  :
- *           :  csp = Current client state (buffers, headers, etc...)
- *          2  :  templatename = Which template should be used for the answer
- *          3  :  sys_err = system error number
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * Returns     :  A http_response.  If we run out of memory, this
- *                will be cgi_error_memory().
+ * Returns     :  0
  *
  *********************************************************************/
-struct http_response *error_response(struct client_state *csp,
-                                     const char *templatename,
-                                     int sys_err)
+int cgi_default(struct client_state *csp, struct http_response *rsp,
+                struct map *parameters)
 {
-   jb_err err;
-   struct http_response *rsp;
-   struct map * exports = default_exports(csp, NULL);
-   if (exports == NULL)
-   {
-      return cgi_error_memory();
-   }
-
-   if (NULL == (rsp = alloc_http_response()))
-   {
-      free_map(exports);
-      return cgi_error_memory();
-   }
+   char *p, *tmp = NULL;
+   struct map *exports = default_exports(csp, "");
 
-   err = map(exports, "host", 1, html_encode(csp->http->host), 0);
-   if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0);
-   if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0);
-   if (!err) err = map(exports, "error", 1, html_encode_and_free_original(safe_strerror(sys_err)), 0);
-   if (!err)
+   /* If there were other parameters, export a dump as "cgi-parameters" */
+   if(parameters)
    {
-     err = map(exports, "host-ip", 1, html_encode(csp->http->host_ip_addr_str), 0);
-     if (err)
-     {
-       /* Some failures, like "404 no such domain", don't have an IP address. */
-       err = map(exports, "host-ip", 1, html_encode(csp->http->host), 0);
-     }
+      p = dump_map(parameters);
+      tmp = strsav(tmp, "<p>What made you think this cgi takes parameters?\n"
+                        "Anyway, here they are, in case you're interested:</p>\n");
+      tmp = strsav(tmp, p);
+      exports = map(exports, "cgi-parameters", 1, tmp, 0);
+      free(p);
    }
-
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
-
-   if (!strcmp(templatename, "no-such-domain"))
-   {
-      rsp->status = strdup("404 No such domain");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-   }
-   else if (!strcmp(templatename, "connect-failed"))
+   else
    {
-      rsp->status = strdup("503 Connect failed");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      exports = map(exports, "cgi-parameters", 1, "", 1);
    }
 
-   err = template_fill_for_cgi(csp, templatename, exports, rsp);
-   if (err)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+   rsp->body = fill_template(csp, "default", exports);
+   free_map(exports);
+   return(0);
 
-   return finish_http_response(rsp);
 }
 
 
 /*********************************************************************
  *
- * Function    :  cgi_init_error_messages
+ * Function    :  cgi_send_banner
+ *
+ * Description :  CGI function that returns a banner. 
  *
- * Description :  Call at the start of the program to initialize
- *                the error message used by cgi_error_memory().
+ * Parameters  :
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * Parameters  :  N/A
+ * CGI Parameters :
+ *           type : Selects the type of banner between "trans" and "jb".
+ *                  Defaults to "jb" if absent or != "trans".
  *
- * Returns     :  N/A
+ * Returns     :  0
  *
  *********************************************************************/
-void cgi_init_error_messages(void)
+int cgi_send_banner(struct client_state *csp, struct http_response *rsp,
+                    struct map *parameters)
 {
-   memset(cgi_error_memory_response, '\0', sizeof(*cgi_error_memory_response));
-   cgi_error_memory_response->head =
-      "HTTP/1.0 500 Internal Privoxy Error\r\n"
-      "Content-Type: text/html\r\n"
-      "\r\n";
-   cgi_error_memory_response->body =
-      "<html>\r\n"
-      "<head><title>500 Internal Privoxy Error</title></head>\r\n"
-      "<body>\r\n"
-      "<h1>500 Internal Privoxy Error</h1>\r\n"
-      "<p>Privoxy <b>ran out of memory</b> while processing your request.</p>\r\n"
-      "<p>Please contact your proxy administrator, or try again later</p>\r\n"
-      "</body>\r\n"
-      "</html>\r\n";
-
-   cgi_error_memory_response->head_length =
-      strlen(cgi_error_memory_response->head);
-   cgi_error_memory_response->content_length =
-      strlen(cgi_error_memory_response->body);
-}
+   if(strcmp(lookup(parameters, "type"), "trans"))
+   {
+      rsp->body = bindup(JBGIF, sizeof(JBGIF));
+      rsp->content_length = sizeof(JBGIF);
+   }
+   else
+   {
+      rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF));
+      rsp->content_length = sizeof(BLANKGIF);
+   }   
 
+   enlist(rsp->headers, "Content-Type: image/gif");
 
-/*********************************************************************
- *
- * Function    :  cgi_error_memory
- *
- * Description :  Called if a CGI function runs out of memory.
- *                Returns a statically-allocated error response.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  template_name = Name of template that could not
- *                                be loaded.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-struct http_response *cgi_error_memory(void)
-{
-   /* assert that it's been initialized. */
-   assert(cgi_error_memory_response->head);
+   return(0);
 
-   return cgi_error_memory_response;
 }
 
 
 /*********************************************************************
  *
- * Function    :  cgi_error_no_template
+ * Function    :  cgi_show_status
  *
- * Description :  Almost-CGI function that is called if a templae
- *                cannot be loaded.  Note this is not a true CGI,
- *                it takes a template name rather than a map of 
- *                parameters.
+ * Description :  CGI function that returns a a web page describing the
+ *                current status of IJB.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  template_name = Name of template that could not
- *                                be loaded.
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * CGI Parameters :
+ *           type : Selects the type of banner between "trans" and "jb".
+ *                  Defaults to "jb" if absent or != "trans".
+ *
+ * Returns     :  0
  *
  *********************************************************************/
-jb_err cgi_error_no_template(struct client_state *csp,
-                             struct http_response *rsp,
-                             const char *template_name)
+int cgi_show_status(struct client_state *csp, struct http_response *rsp,
+                    struct map *parameters)
 {
-   static const char status[] =
-      "500 Internal Privoxy Error";
-   static const char body_prefix[] =
-      "<html>\r\n"
-      "<head><title>500 Internal Privoxy Error</title></head>\r\n"
-      "<body>\r\n"
-      "<h1>500 Internal Privoxy Error</h1>\r\n"
-      "<p>Privoxy encountered an error while processing your request:</p>\r\n"
-      "<p><b>Could not load template file <code>";
-   static const char body_suffix[] =
-      "</code></b></p>\r\n"
-      "<p>Please contact your proxy administrator.</p>\r\n"
-      "<p>If you are the proxy administrator, please put the required file "
-      "in the <code><i>(confdir)</i>/templates</code> directory.  The "
-      "location of the <code><i>(confdir)</i></code> directory "
-      "is specified in the main Privoxy <code>config</code> "
-      "file.  (It's typically the Privoxy install directory"
-#ifndef _WIN32
-      ", or <code>/etc/privoxy/</code>"
-#endif /* ndef _WIN32 */
-      ").</p>\r\n"
-      "</body>\r\n"
-      "</html>\r\n";
-
-   assert(csp);
-   assert(rsp);
-   assert(template_name);
-
-   /* Reset rsp, if needed */
-   freez(rsp->status);
-   freez(rsp->head);
-   freez(rsp->body);
-   rsp->content_length = 0;
-   rsp->head_length = 0;
-   rsp->is_static = 0;
-
-   rsp->body = malloc(strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1);
-   if (rsp->body == NULL)
+   char *s = NULL;
+   int i;
+   struct map *exports = default_exports(csp, "show-status");
+
+#ifdef SPLIT_PROXY_ARGS
+   FILE * fp;
+   char buf[BUFFER_SIZE];
+   char * p;
+   const char * filename = NULL;
+   char * file_description = NULL;
+
+
+   p = lookup(parameters, "file");
+   switch (*p)
+   {
+   case 'p':
+      if (csp->actions_list)
+      {
+         filename = csp->actions_list->filename;
+         file_description = "Actions List";
+      }
+      break;
+
+#ifdef PCRS
+   case 'r':
+      if (csp->rlist)
+      {
+         filename = csp->rlist->filename;
+         file_description = "Regex Filter List";
+      }
+      break;
+#endif /* def PCRS */
+
+#ifdef TRUST_FILES
+   case 't':
+      if (csp->tlist)
+      {
+         filename = csp->tlist->filename;
+         file_description = "Trust List";
+      }
+      break;
+#endif /* def TRUST_FILES */
+   }
+
+   if (NULL != filename)
    {
-      return JB_ERR_MEMORY;
+      exports = map(exports, "file-description", 1, file_description, 1);
+      exports = map(exports, "filepath", 1, html_encode(filename), 0);
+
+      if ((fp = fopen(filename, "r")) == NULL)
+      {
+         exports = map(exports, "content", 1, "<h1>ERROR OPENING FILE!</h1>", 1);
+      }
+      else
+      {
+         while (fgets(buf, sizeof(buf), fp))
+         {
+            p = html_encode(buf);
+            if (p)
+            {
+               s = strsav(s, p);
+               freez(p);
+               s = strsav(s, "<br>");
+            }
+         }
+         fclose(fp);
+         exports = map(exports, "contents", 1, s, 0);
+      }
+      rsp->body = fill_template(csp, "show-status-file", exports);
+      free_map(exports);
+      return(0);
+
    }
-   strcpy(rsp->body, body_prefix);
-   strcat(rsp->body, template_name);
-   strcat(rsp->body, body_suffix);
 
-   rsp->status = strdup(status);
-   if (rsp->body == NULL)
+#endif /* def SPLIT_PROXY_ARGS */
+
+   exports = map(exports, "redirect-url", 1, REDIRECT_URL, 1);
+   
+   s = NULL;
+   for (i=0; i < Argc; i++)
    {
-      return JB_ERR_MEMORY;
+      s = strsav(s, Argv[i]);
+      s = strsav(s, " ");
    }
+   exports = map(exports, "invocation", 1, s, 0);
 
-   return JB_ERR_OK;
-}
+   exports = map(exports, "options", 1, csp->config->proxy_args, 1);
+   s =   show_rcs();
+   exports = map(exports, "sourceversions", 1, s, 0);  
+   s =   show_defines();
+   exports = map(exports, "defines", 1, s, 0); 
 
+#ifdef STATISTICS
+   exports = add_stats(exports);
+#else
+   exports = map_block_killer(exports, "statistics");
+#endif /* ndef STATISTICS */
 
-/*********************************************************************
+#ifdef SPLIT_PROXY_ARGS
+
+   exports = map_block_killer(exports, "no-split-args");
+
+   if (csp->actions_list)
+   {
+      exports = map(exports, "actions-filename", 1,  csp->actions_list->filename, 1);
+   }
+   else
+   {
+      exports = map(exports, "actions-filename", 1, "None specified", 1);
+   }
+
+#ifdef PCRS
+   if (csp->rlist)
+   {
+      exports = map(exports, "re-filter-filename", 1,  csp->rlist->filename, 1);
+   }
+   else
+   {
+      exports = map(exports, "re-filter-filename", 1, "None specified", 1);
+   }
+#else
+   exports = map_block_killer(exports, "pcrs-support");
+#endif /* ndef PCRS */
+
+#ifdef TRUST_FILES
+   if (csp->tlist)
+   {
+      exports = map(exports, "trust-filename", 1,  csp->tlist->filename, 1);
+   }
+   else
+   {
+       exports = map(exports, "trust-filename", 1, "None specified", 1);
+   }
+#else
+   exports = map_block_killer(exports, "trust-support");
+#endif /* ndef TRUST_FILES */
+
+#else /* ifndef SPLIT_PROXY_ARGS */
+   exports = map_block_killer(exports, "split-args");
+
+   if (csp->clist)
+   {
+      map(exports, "clist", 1, csp->clist->proxy_args , 1);
+   }
+
+#ifdef PCRS
+   if (csp->rlist)
+   {
+      map(exports, "rlist", 1, csp->rlist->proxy_args , 1);
+   }
+#endif /* def PCRS */
+
+#ifdef TRUST_FILES
+    if (csp->tlist)
+   {
+      map(exports, "tlist", 1, csp->tlist->proxy_args , 1);
+   }
+#endif /* def TRUST_FILES */
+
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+   rsp->body = fill_template(csp, "show-status", exports);
+   free_map(exports);
+   return(0);
+
+}
+
+ /*********************************************************************
  *
- * Function    :  cgi_error_bad_param
+ * Function    :  cgi_show_url_info
+ *
+ * Description :  CGI function that determines and shows which actions
+ *                junkbuster will perform for a given url, and which
+ *                matches starting from the defaults have lead to that.
  *
- * Description :  CGI function that is called if the parameters
- *                (query string) for a CGI were wrong.
- *               
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           2 :  rsp = http_response data structure for output
+ *           3 :  parameters = map of cgi parameters
  *
- * CGI Parameters : none
+ * CGI Parameters :
+ *            url : The url whose actions are to be determined.
+ *                  If url is unset, the url-given conditional will be
+ *                  set, so that all but the form can be suppressed in
+ *                  the template.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  0
  *
  *********************************************************************/
-jb_err cgi_error_bad_param(struct client_state *csp,
-                           struct http_response *rsp)
+int cgi_show_url_info(struct client_state *csp, struct http_response *rsp,
+                      struct map *parameters)
 {
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
+   struct map *exports = default_exports(csp, "show-url-info");
+   char *url_param, *host = NULL;
 
-   if (NULL == (exports = default_exports(csp, NULL)))
+   if (NULL == (url_param = strdup(lookup(parameters, "url"))) || *url_param == '\0')
    {
-      return JB_ERR_MEMORY;
+      exports = map_block_killer(exports, "url-given");
+      exports = map(exports, "url", 1, "", 1);
+   }
+   else
+   {
+      char *matches = NULL;
+      char *path;
+      char *s;
+      int port = 80;
+      int hits = 0;
+      struct file_list *fl;
+      struct url_actions *b;
+      struct url_spec url[1];
+      struct current_action_spec action[1];
+      
+      host = url_param;
+      host += (strncmp(url_param, "http://", 7)) ? 0 : 7;
+
+      exports = map(exports, "url", 1, host, 1);
+      exports = map(exports, "url-html", 1, html_encode(host), 0);
+
+      init_current_action(action);
+
+      s = current_action_to_text(action);
+      exports = map(exports, "default", 1, s , 0);
+
+      if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
+      {
+         exports = map(exports, "matches", 1, "none" , 1);
+         exports = map(exports, "final", 1, lookup(exports, "default"), 1);
+
+         freez(url_param);
+         free_current_action(action);
+
+         rsp->body = fill_template(csp, "show-url-info", exports);
+         free_map(exports);
+
+         return 0;
+      }
+
+      s = strchr(host, '/');
+      if (s != NULL)
+      {
+         path = strdup(s);
+         *s = '\0';
+      }
+      else
+      {
+         path = strdup("");
+      }
+      s = strchr(host, ':');
+      if (s != NULL)
+      {
+         *s++ = '\0';
+         port = atoi(s);
+         s = NULL;
+      }
+
+      *url = dsplit(host);
+
+      /* if splitting the domain fails, punt */
+      if (url->dbuf == NULL)
+      {
+         exports = map(exports, "matches", 1, "none" , 1);
+         exports = map(exports, "final", 1, lookup(exports, "default"), 1);
+
+         freez(url_param);
+         freez(path);
+         free_current_action(action);
+
+         rsp->body = fill_template(csp, "show-url-info", exports);
+         free_map(exports);
+
+         return 0;
+      }
+
+      for (b = b->next; NULL != b; b = b->next)
+      {
+         if ((b->url->port == 0) || (b->url->port == port))
+         {
+            if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+            {
+               if ((b->url->path == NULL) ||
+#ifdef REGEX
+                  (regexec(b->url->preg, path, 0, NULL, 0) == 0)
+#else
+                  (strncmp(b->url->path, path, b->url->pathlen) == 0)
+#endif
+               )
+               {
+                  s = actions_to_text(b->action);
+                  matches = strsav(matches, "<b>{");
+                  matches = strsav(matches, s);
+                  matches = strsav(matches, " }</b><br>\n<code>");
+                  matches = strsav(matches, b->url->spec);
+                  matches = strsav(matches, "</code><br>\n<br>\n");
+                  freez(s);
+
+                  merge_current_action(action, b->action);
+                  hits++;
+               }
+            }
+         }
+      }
+
+      if (hits)
+      {
+         exports = map(exports, "matches", 1, matches , 0);
+      }
+      else
+      {
+         exports = map(exports, "matches", 1, "none", 1);
+      }
+      matches = NULL;
+
+      freez(url->dbuf);
+      freez(url->dvec);
+
+      freez(url_param);
+      freez(path);
+
+      s = current_action_to_text(action);
+      exports = map(exports, "final", 1, s, 0);
+      s = NULL;
+
+      free_current_action(action);
    }
 
-   return template_fill_for_cgi(csp, "cgi-error-bad-param", exports, rsp);
+   rsp->body = fill_template(csp, "show-url-info", exports);
+   free_map(exports);
+   return 0;
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  get_http_time
+ * Function    :  error_response
  *
- * Description :  Get the time in a format suitable for use in a
- *                HTTP header - e.g.:
- *                "Sun, 06 Nov 1994 08:49:37 GMT"
+ * Description :  returns an http_response that explains the reason
+ *                why a request failed.
  *
- * Parameters  :  
- *          1  :  time_offset = Time returned will be current time
- *                              plus this number of seconds.
- *          2  :  buf = Destination for result.  Must be long enough
- *                      to hold 29 characters plus a trailing zero.
+ * Parameters  :
+ *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          2  :  template = Which template should be used for the answer
+ *          3  :  errno = system error number
  *
- * Returns     :  N/A
+ * Returns     :  NULL if no memory, else http_response
  *
  *********************************************************************/
-void get_http_time(int time_offset, char *buf)
+struct http_response *error_response(struct client_state *csp, const char *template, int err)
 {
-   static const char day_names[7][4] =
-      { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
-   static const char month_names[12][4] =
-      { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-   struct tm *t;
-   time_t current_time;
-
-   assert(buf);
-
-   time(&current_time); /* get current time */
-
-   current_time += time_offset;
+   struct http_response *rsp;
+   struct map *exports = default_exports(csp, NULL);
 
-   /* get and save the gmt */
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-#ifdef HAVE_GMTIME_R
-      struct tm dummy;
-      t = gmtime_r(&current_time, &dummy);
-#else
-      t = gmtime(&current_time);
-#endif
-   }
+      return NULL;
+   }  
+
+      exports = map(exports, "host-html", 1, html_encode(csp->http->host), 0);
+      exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+      exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+      exports = map(exports, "path", 1, csp->http->path, 1);
+      exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
+      exports = map(exports, "error", 1, safe_strerror(err), 0);
+      exports = map(exports, "host-ip", 1, csp->http->host_ip_addr_str, 1);
 
-   /* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */
-   snprintf(buf, 30,
-      "%s, %02d %s %4d %02d:%02d:%02d GMT",
-      day_names[t->tm_wday],
-      t->tm_mday,
-      month_names[t->tm_mon],
-      t->tm_year + 1900,
-      t->tm_hour,
-      t->tm_min,
-      t->tm_sec
-      );
+      rsp->body = fill_template(csp, template, exports);
+      free_map(exports);
+      
+      if (!strcmp(template, "no-such-domain"))
+      {
+         rsp->status = strdup("404 No such domain"); 
+      }
+      else if (!strcmp(template, "connect-failed"))
+      {
+         rsp->status = strdup("503 Connect failed");
+      }
 
+      return(finish_http_response(rsp));
 }
 
 
@@ -1070,28 +781,18 @@ void get_http_time(int time_offset, char *buf)
  * Parameters  :
  *          1  :  rsp = pointer to http_response to be processed
  *
- * Returns     :  A http_response, usually the rsp parameter.
- *                On error, free()s rsp and returns cgi_error_memory()
+ * Returns     :  http_response, or NULL on failiure
  *
  *********************************************************************/
 struct http_response *finish_http_response(struct http_response *rsp)
 {
    char buf[BUFFER_SIZE];
-   jb_err err;
-
-   /* Special case - do NOT change this statically allocated response,
-    * which is ready for output anyway.
-    */
-   if (rsp == cgi_error_memory_response)
-   {
-      return rsp;
-   }
 
    /* 
     * Fill in the HTTP Status
     */
    sprintf(buf, "HTTP/1.0 %s", rsp->status ? rsp->status : "200 OK");
-   err = enlist_first(rsp->headers, buf);
+   enlist_first(rsp->headers, buf);
 
    /* 
     * Set the Content-Length
@@ -1100,95 +801,32 @@ struct http_response *finish_http_response(struct http_response *rsp)
    {
       rsp->content_length = rsp->body ? strlen(rsp->body) : 0;
    }
-   if (!err)
-   {
-      sprintf(buf, "Content-Length: %d", rsp->content_length);
-      err = enlist(rsp->headers, buf);
-   }
+   sprintf(buf, "Content-Length: %d", rsp->content_length);
+   enlist(rsp->headers, buf);
 
    /* 
-    * Fill in the default headers:
-    *
-    * Content-Type: default to text/html if not already specified.
-    * Date: set to current date/time.
-    * Last-Modified: set to date/time the page was last changed.
-    * Expires: set to date/time page next needs reloading.
-    * Cache-Control: set to "no-cache" if applicable.
-    * 
-    * See http://www.w3.org/Protocols/rfc2068/rfc2068
+    * Fill in the default headers FIXME: Are these correct? sequence OK? check rfc!
     */
-   if (!err) err = enlist_unique(rsp->headers, "Content-Type: text/html", 13);
-
-   if (rsp->is_static)
-   {
-      /*
-       * Set Expires to about 10 min into the future so it'll get reloaded
-       * occasionally, e.g. if Privoxy gets upgraded.
-       */
-
-      if (!err)
-      {
-         get_http_time(0, buf);
-         err = enlist_unique_header(rsp->headers, "Date", buf);
-      }
-
-      /* Some date in the past. */
-      if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Sat, 17 Jun 2000 12:00:00 GMT");
-
-      if (!err)
-      {
-         get_http_time(10 * 60, buf); /* 10 * 60sec = 10 minutes */
-         err = enlist_unique_header(rsp->headers, "Expires", buf);
-      }
-   }
-   else
-   {
-      /*
-       * Compliant browsers should not cache this due to the "Cache-Control"
-       * setting.  However, to be certain, we also set both "Last-Modified"
-       * and "Expires" to the current time.
-       */
-      if (!err) err = enlist_unique_header(rsp->headers, "Cache-Control", "no-cache");
-
-      get_http_time(0, buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Date", buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", buf);
-      if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf);
-   }
-
+   enlist_unique(rsp->headers, "Last-Modified: Thu Jul 31, 1997 07:42:22 pm GMT", 14);
+   enlist_unique(rsp->headers, "Expires:       Thu Jul 31, 1997 07:42:22 pm GMT", 8);
+   enlist_unique(rsp->headers, "Content-Type: text/html", 13);
+   enlist(rsp->headers, "");
+  
 
    /* 
     * Write the head
     */
-   if (err || (NULL == (rsp->head = list_to_text(rsp->headers))))
+   if (NULL == (rsp->head = list_to_text(rsp->headers)))
    {
       free_http_response(rsp);
-      return cgi_error_memory();
+      return(NULL);
    }
    rsp->head_length = strlen(rsp->head);
 
-   return rsp;
+   return(rsp);
 
 }
-
-
-/*********************************************************************
- *
- * Function    :  alloc_http_response
- *
- * Description :  Allocates a new http_response structure.
- *
- * Parameters  :  N/A
- *
- * Returns     :  pointer to a new http_response, or NULL.
- *
- *********************************************************************/
-struct http_response *alloc_http_response(void)
-{
-   return (struct http_response *) zalloc(sizeof(struct http_response));
-
-}
-
+  
 
 /*********************************************************************
  *
@@ -1205,16 +843,13 @@ struct http_response *alloc_http_response(void)
  *********************************************************************/
 void free_http_response(struct http_response *rsp)
 {
-   /*
-    * Must special case cgi_error_memory_response, which is never freed.
-    */
-   if (rsp && (rsp != cgi_error_memory_response))
+   if(rsp)
    {
       freez(rsp->status);
       freez(rsp->head);
       freez(rsp->body);
       destroy_list(rsp->headers);
-      free(rsp);
+      freez(rsp);
    }
 
 }
@@ -1222,254 +857,99 @@ void free_http_response(struct http_response *rsp)
 
 /*********************************************************************
  *
- * Function    :  template_load
+ * Function    :  fill_template
  *
  * Description :  CGI support function that loads a given HTML
- *                template from the confdir, ignoring comment
- *                lines. 
+ *                template from the confdir, and fills it in
+ *                by replacing @name@ with value using pcrs,
+ *                for each item in the output map.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  template_ptr = Destination for pointer to loaded
- *                               template text.
- *          3  :  template = name of the HTML template to be used
+ *           1 :  csp = Current client state (buffers, headers, etc...)
+ *           3 :  template = name of the HTML template to be used
+ *           2 :  exports = map with fill in symbol -> name pairs
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *                JB_ERR_FILE if the template file cannot be read
+ * Returns     :  char * with filled out form, or NULL if failiure
  *
  *********************************************************************/
-jb_err template_load(struct client_state *csp, char ** template_ptr, 
-                     const char *templatename)
+char *fill_template(struct client_state *csp, const char *template, struct map *exports)
 {
-   char *templates_dir_path;
-   char *full_path;
-   char *file_buffer;
-   FILE *fp;
+   struct map *m;
+   pcrs_job *job, *joblist = NULL;
    char buf[BUFFER_SIZE];
+   char *new, *old = NULL;
+   int size;
+   FILE *fp;
 
-   assert(csp);
-   assert(template_ptr);
-   assert(templatename);
-
-   *template_ptr = NULL;
 
    /*
     * Open template file or fail
     */
+   snprintf(buf, BUFFER_SIZE, "%s/templates/%s", csp->config->confdir, template);
 
-   templates_dir_path = make_path(csp->config->confdir, "templates");
-   if (templates_dir_path == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   full_path = make_path(templates_dir_path, templatename);
-   free(templates_dir_path);
-   if (full_path == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   file_buffer = strdup("");
-   if (file_buffer == NULL)
+   if(NULL == (fp = fopen(buf, "r")))
    {
-      free(full_path);
-      return JB_ERR_MEMORY;
-   }
-
-   if (NULL == (fp = fopen(full_path, "r")))
-   {
-      log_error(LOG_LEVEL_ERROR, "Cannot open template file %s: %E", full_path);
-      free(full_path);
-      free(file_buffer);
-      return JB_ERR_FILE;
+      log_error(LOG_LEVEL_ERROR, "error loading template %s: %E", buf);
+      return NULL;
    }
-   free(full_path);
+   
 
    /* 
-    * Read the file, ignoring comments.
-    *
-    * FIXME: The comment handling could break with lines >BUFFER_SIZE long.
-    *        This is unlikely in practise.
+    * Assemble pcrs joblist from exports map
     */
-   while (fgets(buf, BUFFER_SIZE, fp))
+   for (m = exports; m; m = m->next)
    {
-      /* skip lines starting with '#' */
-      if(*buf == '#')
+      int error;
+
+      /* Enclose name in @@ */
+      snprintf(buf, BUFFER_SIZE, "@%s@", m->name);
+
+      /* Make and chain in job */
+      if ( NULL == (job = (pcrs_make_job(buf, m->value, "sigTU", &error))) ) 
       {
-         continue;
+         log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error);
       }
-
-      if (string_append(&file_buffer, buf))
+      else
       {
-         fclose(fp);
-         return JB_ERR_MEMORY;
+         job->next = joblist;
+         joblist = job;
       }
    }
-   fclose(fp);
-
-   *template_ptr = file_buffer;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  template_fill
- *
- * Description :  CGI support function that fills in a pre-loaded
- *                HTML template by replacing @name@ with value using
- *                pcrs, for each item in the output map.
- *
- *                Note that a leading '$' charachter in the export map's
- *                values will be stripped and toggle on backreference
- *                interpretation.
- *
- * Parameters  :
- *          1  :  template_ptr = IN: Template to be filled out.
- *                                   Will be free()d.
- *                               OUT: Filled out template.
- *                                    Caller must free().
- *          2  :  exports = map with fill in symbol -> name pairs
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err template_fill(char **template_ptr, const struct map *exports)
-{
-   struct map_entry *m;
-   pcrs_job *job;
-   char buf[BUFFER_SIZE];
-   char *tmp_out_buffer;
-   char *file_buffer;
-   size_t  size;
-   int error;
-   const char *flags;
-
-   assert(template_ptr);
-   assert(*template_ptr);
-   assert(exports);
 
-   file_buffer = *template_ptr;
-   size = strlen(file_buffer) + 1;
 
    /* 
-    * Assemble pcrs joblist from exports map
+    * Read the file, ignoring comments
     */
-   for (m = exports->first; m != NULL; m = m->next)
+   while (fgets(buf, BUFFER_SIZE, fp))
    {
-      if (*m->name == '$')
-      {
-         /*
-          * First character of name is '$', so remove this flag
-          * character and allow backreferences ($1 etc) in the
-          * "replace with" text.
-          */
-         snprintf(buf, BUFFER_SIZE, "%s", m->name + 1);
-         flags = "sigU";
-      }
-      else
-      {
-         /*
-          * Treat the "replace with" text as a literal string - 
-          * no quoting needed, no backreferences allowed.
-          * ("Trivial" ['T'] flag).
-          */
-         flags = "sigTU";
-
-         /* Enclose name in @@ */
-         snprintf(buf, BUFFER_SIZE, "@%s@", m->name);
-      }
+      /* skip lines starting with '#' */
+      if(*buf == '#') continue;
+   
+      old = strsav(old, buf);
+   }
+   fclose(fp);
 
 
-      log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags);
+   /*
+    * Execute the jobs
+    */
+   size = strlen(old) + 1;
+   new = old;
 
-      /* Make and run job. */
-      job = pcrs_compile(buf, m->value, flags,  &error);
-      if (job == NULL) 
-      {
-         if (error == PCRS_ERR_NOMEM)
-         {
-            free(file_buffer);
-            *template_ptr = NULL;
-            return JB_ERR_MEMORY;
-         }
-         else
-         {
-            log_error(LOG_LEVEL_ERROR, "Error compiling template fill job %s: %d", m->name, error);
-            /* Hope it wasn't important and silently ignore the invalid job */
-         }
-      }
-      else
-      {
-         pcrs_execute(job, file_buffer, size, &tmp_out_buffer, &size);
-         free(file_buffer);
-         pcrs_free_job(job);
-         if (NULL == tmp_out_buffer)
-         {
-            *template_ptr = NULL;
-            return JB_ERR_MEMORY;
-         }
-         file_buffer = tmp_out_buffer;
-      }
+   for (job = joblist; NULL != job; job = job->next)
+   {
+      pcrs_execute(job, old, size, &new, &size);
+      if (old != buf) free(old);
+      old = new;
    }
 
+
    /*
-    * Return
+    * Free the jobs & return
     */
-   *template_ptr = file_buffer;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  template_fill_for_cgi
- *
- * Description :  CGI support function that loads a HTML template
- *                and fills it in.  Handles file-not-found errors
- *                by sending a HTML error message.  For convenience,
- *                this function also frees the passed "exports" map.
- *
- * Parameters  :
- *          1  :  csp = Client state
- *          2  :  templatename = name of the HTML template to be used
- *          3  :  exports = map with fill in symbol -> name pairs.
- *                          Will be freed by this function.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err template_fill_for_cgi(struct client_state *csp,
-                             const char *templatename,
-                             struct map *exports,
-                             struct http_response *rsp)
-{
-   jb_err err;
-   
-   assert(csp);
-   assert(templatename);
-   assert(exports);
-   assert(rsp);
+   pcrs_free_joblist(joblist);
+   return(new);
 
-   err = template_load(csp, &rsp->body, templatename);
-   if (err == JB_ERR_FILE)
-   {
-      free_map(exports);
-      return cgi_error_no_template(csp, rsp, templatename);
-   }
-   else if (err)
-   {
-      free_map(exports);
-      return err; /* JB_ERR_MEMORY */
-   }
-   err = template_fill(&rsp->body, exports);
-   free_map(exports);
-   return err;
 }
 
 
@@ -1483,75 +963,43 @@ jb_err template_fill_for_cgi(struct client_state *csp,
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *          2  :  caller = name of CGI who calls us and which should
- *                         be excluded from the generated menu. May be
- *                         NULL.
- * Returns     :  NULL if no memory, else a new map.  Caller frees.
+ *                         be excluded from the generated menu.
+ * Returns     :  NULL if no memory, else map
  *
  *********************************************************************/
-struct map *default_exports(const struct client_state *csp, const char *caller)
+struct map *default_exports(struct client_state *csp, char *caller)
 {
+   struct map *exports = NULL;
    char buf[20];
-   jb_err err;
-   struct map * exports;
-   int local_help_exists = 0;
-
-   assert(csp);
-
-   exports = new_map();
-   if (exports == NULL)
-   {
-      return NULL;
-   }
 
-   err = map(exports, "version", 1, html_encode(VERSION), 0);
-   if (!err) err = map(exports, "my-ip-address", 1, html_encode(csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown"), 0);
-   if (!err) err = map(exports, "my-hostname",   1, html_encode(csp->my_hostname ? csp->my_hostname : "unknown"), 0);
-   if (!err) err = map(exports, "homepage",      1, html_encode(HOME_PAGE_URL), 0);
-   if (!err) err = map(exports, "default-cgi",   1, html_encode(CGI_PREFIX), 0);
-   if (!err) err = map(exports, "menu",          1, make_menu(caller), 0);
-   if (!err) err = map(exports, "code-status",   1, CODE_STATUS, 1);
-   if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB);
+   exports = map(exports, "version", 1, VERSION, 1);
+   exports = map(exports, "my-ip-address", 1, csp->my_ip_addr_str ? csp->my_ip_addr_str : "unknown", 1);
+   exports = map(exports, "my-hostname", 1, csp->my_hostname ? csp->my_hostname : "unknown", 1);
+   exports = map(exports, "admin-address", 1, csp->config->admin_address ? csp->config->admin_address : "fill@me.in.please", 1);
+   exports = map(exports, "homepage", 1, HOME_PAGE_URL, 1);
+   exports = map(exports, "default-cgi", 1, HOME_PAGE_URL "/config", 1);
+   exports = map(exports, "menu", 1, make_menu(caller), 0);
+   exports = map(exports, "code-status", 1, CODE_STATUS, 1);
 
    snprintf(buf, 20, "%d", csp->config->hport);
-   if (!err) err = map(exports, "my-port", 1, buf, 1);
+   exports = map(exports, "my-port", 1, buf, 1);
 
    if(!strcmp(CODE_STATUS, "stable"))
    {
-      if (!err) err = map_block_killer(exports, "unstable");
+      exports = map_block_killer(exports, "unstable");
    }
 
-   if (csp->config->admin_address != NULL)
+   if(csp->config->proxy_info_url != NULL)
    {
-      if (!err) err = map(exports, "admin-address", 1, html_encode(csp->config->admin_address), 0);
-      local_help_exists = 1;
+      exports = map(exports, "proxy-info-url", 1, csp->config->proxy_info_url, 1);
    }
    else
    {
-      if (!err) err = map_block_killer(exports, "have-adminaddr-info");
-   }
+      exports = map_block_killer(exports, "have-proxy-info");
+   }   
 
-   if (csp->config->proxy_info_url != NULL)
-   {
-      if (!err) err = map(exports, "proxy-info-url", 1, html_encode(csp->config->proxy_info_url), 0);
-      local_help_exists = 1;
-   }
-   else
-   {
-      if (!err) err = map_block_killer(exports, "have-proxy-info");
-   }
-
-   if (local_help_exists == 0)
-   {
-      if (!err) err = map_block_killer(exports, "have-help-info");
-   }
+   return(exports);
 
-   if (err)
-   {
-      free_map(exports);
-      return NULL;
-   }
-
-   return exports;
 }
 
 
@@ -1569,184 +1017,145 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
  *          1  :  exports = map to extend
  *          2  :  name = name of conditional block
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  extended map
  *
  *********************************************************************/
-jb_err map_block_killer(struct map *exports, const char *name)
+struct map *map_block_killer(struct map *exports, char *name)
 {
    char buf[1000]; /* Will do, since the names are hardwired */
 
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 490);
-
    snprintf(buf, 1000, "if-%s-start.*if-%s-end", name, name);
-   return map(exports, buf, 1, "", 1);
+   exports = map(exports, buf, 1, "", 1);
+
+   return(exports);
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  map_block_keep
+ * Function    :  make_menu
  *
- * Description :  Convenience function.  Removes the markers used
- *                by map-block-killer, to save a few bytes.
- *                i.e. removes "@if-<name>-start@" and "@if-<name>-end@"
+ * Description :  Returns an HTML-formatted menu of the available 
+ *                unhidden CGIs, excluding the one given in <self>.
  *
- * Parameters  :  
- *          1  :  exports = map to extend
- *          2  :  name = name of conditional block
+ * Parameters  :  self = name of CGI to leave out, can be NULL
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  menu string
  *
  *********************************************************************/
-jb_err map_block_keep(struct map *exports, const char *name)
+char *make_menu(const char *self)
 {
-   jb_err err;
-   char buf[500]; /* Will do, since the names are hardwired */
-
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 490);
+   const struct cgi_dispatcher *d;
+   char buf[BUFFER_SIZE], *tmp = NULL;
 
-   snprintf(buf, 500, "if-%s-start", name);
-   err = map(exports, buf, 1, "", 1);
+   if (self == NULL) self = "NO-SUCH-CGI!";
 
-   if (err)
+   /* List available unhidden CGI's and export as "other-cgis" */
+   for (d = cgi_dispatcher; d->handler; d++)
    {
-      return err;
+      if (strncmp(d->description, "HIDE", 4) && strcmp(d->name, self))
+      {
+         snprintf(buf, BUFFER_SIZE, "<li><a href=%s/config/%s>%s</a></li>\n",
+              HOME_PAGE_URL, d->name, d->description);
+         tmp = strsav(tmp, buf);
+      }
    }
+   return(tmp);
 
-   snprintf(buf, 500, "if-%s-end", name);
-   return map(exports, buf, 1, "", 1);
 }
 
 
 /*********************************************************************
  *
- * Function    :  map_conditional
- *
- * Description :  Convenience function.
- *                Adds an "if-then-else" for the conditional HTML-template
- *                block <name>, i.e. a substitution of the form:
- *                @if-<name>-then@
- *                   True text
- *                @else-not-<name>@
- *                   False text
- *                @endif-<name>@
+ * Function    :  dump_map
  *
- *                The control structure and one of the alternatives
- *                will be hidden.
+ * Description :  HTML-dump a map for debugging
  *
- * Parameters  :  
- *          1  :  exports = map to extend
- *          2  :  name = name of conditional block
- *          3  :  choose_first = nonzero for first, zero for second.
+ * Parameters  :
+ *          1  :  map = map to dump
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
+ * Returns     :  string with HTML
  *
  *********************************************************************/
-jb_err map_conditional(struct map *exports, const char *name, int choose_first)
+char *dump_map(struct map *map)
 {
-   char buf[1000]; /* Will do, since the names are hardwired */
-   jb_err err;
+   struct map *p = map;
+   char *ret = NULL;
 
-   assert(exports);
-   assert(name);
-   assert(strlen(name) < 480);
+   ret = strsav(ret, "<table>\n");
 
-   snprintf(buf, 1000, (choose_first
-      ? "else-not-%s@.*@endif-%s"
-      : "if-%s-then@.*@else-not-%s"),
-      name, name);
-
-   err = map(exports, buf, 1, "", 1);
-   if (err)
+   while (p)
    {
-      return err;
+      ret = strsav(ret, "<tr><td><b>");
+      ret = strsav(ret, p->name);
+      ret = strsav(ret, "</b></td><td>");
+      ret = strsav(ret, p->value);
+      ret = strsav(ret, "</td></tr>\n");
+      p = p->next;
    }
 
-   snprintf(buf, 1000, (choose_first ? "if-%s-then" : "endif-%s"), name);
-   return map(exports, buf, 1, "", 1);
+   ret = strsav(ret, "</table>\n");
+   return(ret);
+
 }
 
 
+#ifdef STATISTICS
 /*********************************************************************
  *
- * Function    :  make_menu
+ * Function    :  add_stats
  *
- * Description :  Returns an HTML-formatted menu of the available 
- *                unhidden CGIs, excluding the one given in <self>.
+ * Description :  Add the blocking statistics to a given map.
  *
- * Parameters  :  self = name of CGI to leave out, can be NULL
+ * Parameters  :
+ *          1  :  exports = map to write to.
  *
- * Returns     :  menu string, or NULL on out-of-memory error.
+ * Returns     :  pointer to extended map
  *
  *********************************************************************/
-char *make_menu(const char *self)
+struct map *add_stats(struct map *exports)
 {
-   const struct cgi_dispatcher *d;
-   char *result = strdup("");
+   float perc_rej;   /* Percentage of http requests rejected */
+   char buf[1000];
+   int local_urls_read     = urls_read;
+   int local_urls_rejected = urls_rejected;
 
-   if (self == NULL)
-   {
-      self = "NO-SUCH-CGI!";
-   }
+   /*
+    * Need to alter the stats not to include the fetch of this
+    * page.
+    *
+    * Can't do following thread safely! doh!
+    *
+    * urls_read--;
+    * urls_rejected--; * This will be incremented subsequently *
+    */
 
-   /* List available unhidden CGI's and export as "other-cgis" */
-   for (d = cgi_dispatchers; d->name; d++)
+   if (local_urls_read == 0)
    {
-      if (d->description && strcmp(d->name, self))
-      {
-         string_append(&result, "<li><a href=\"" CGI_PREFIX);
-         string_append(&result, d->name);
-         string_append(&result, "\">");
-         string_append(&result, d->description);
-         string_append(&result, "</a></li>\n");
-      }
+      exports = map_block_killer(exports, "have-stats");
    }
+   else
+   {
+      exports = map_block_killer(exports, "have-no-stats");
 
-   return result;
-}
-
+      perc_rej = (float)local_urls_rejected * 100.0F /
+            (float)local_urls_read;
 
-/*********************************************************************
- *
- * Function    :  dump_map
- *
- * Description :  HTML-dump a map for debugging
- *
- * Parameters  :
- *          1  :  the_map = map to dump
- *
- * Returns     :  string with HTML
- *
- *********************************************************************/
-char *dump_map(const struct map *the_map)
-{
-   struct map_entry *cur_entry;
-   char *ret = strdup("");
+      sprintf(buf, "%d", local_urls_read);
+      exports = map(exports, "requests-received", 1, buf, 1);
 
-   string_append(&ret, "<table>\n");
+      sprintf(buf, "%d", local_urls_rejected);
+      exports = map(exports, "requests-blocked", 1, buf, 1);
 
-   for (cur_entry = the_map->first;
-        (cur_entry != NULL) && (ret != NULL);
-        cur_entry = cur_entry->next)
-   {
-      string_append(&ret, "<tr><td><b>");
-      string_join  (&ret, html_encode(cur_entry->name));
-      string_append(&ret, "</b></td><td>");
-      string_join  (&ret, html_encode(cur_entry->value));
-      string_append(&ret, "</td></tr>\n");
+      sprintf(buf, "%6.2f", perc_rej);
+      exports = map(exports, "percent-blocked", 1, buf, 1);
    }
 
-   string_append(&ret, "</table>\n");
-   return ret;
-}
+   return(exports);
 
+}
+#endif /* def STATISTICS */
 
 /*
   Local Variables:
diff --git a/cgi.h b/cgi.h
index c7391bc..fb6f574 100644 (file)
--- a/cgi.h
+++ b/cgi.h
@@ -1,6 +1,6 @@
-#ifndef CGI_H_INCLUDED
-#define CGI_H_INCLUDED
-#define CGI_H_VERSION "$Id: cgi.h,v 1.23 2002/03/24 16:18:15 jongfoster Exp $"
+#ifndef _CGI_H
+#define _CGI_H
+#define CGI_H_VERSION "$Id: cgi.h,v 1.5 2001/06/29 13:22:44 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.h,v $
@@ -12,7 +12,7 @@
  * 
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: cgi.h,v $
- *    Revision 1.23  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.22  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.21  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.20  2002/03/04 17:53:22  oes
- *    Fixed compiled warning
- *
- *    Revision 1.19  2002/01/21 00:33:52  jongfoster
- *    Adding map_block_keep() to save a few bytes in the edit-actions-list HTML.
- *
- *    Revision 1.18  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.17  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.16  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *    Revision 1.15  2001/09/16 15:02:35  jongfoster
- *    Adding i.j.b/robots.txt.
- *    Inlining add_stats() since it's only ever called from one place.
- *
- *    Revision 1.14  2001/09/16 11:38:02  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.13  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.12  2001/09/13 23:31:25  jongfoster
- *    Moving image data to cgi.c rather than cgi.h.
- *
- *    Revision 1.11  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.10  2001/08/01 21:19:22  jongfoster
- *    Moving file version information to a separate CGI page.
- *
- *    Revision 1.9  2001/08/01 00:17:54  jongfoster
- *    Adding prototype for map_conditional
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.6  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.5  2001/06/29 13:22:44  oes
  *    - Cleaned up
  *    - Added new functions: default_exports(), make_menu(),
@@ -145,59 +65,68 @@ extern "C" {
 #endif
 
 /*
- * Main dispatch function
+ * Dispatch & parameter parsing functions
  */
 extern struct http_response *dispatch_cgi(struct client_state *csp);
+extern struct map *parse_cgi_parameters(char *argstring);
+
+/*
+ * CGI functions
+ */
+extern int cgi_default(struct client_state *csp, struct http_response *rsp,
+                       struct map *parameters);
+extern int cgi_show_status(struct client_state *csp, struct http_response *rsp,
+                           struct map *parameters);
+extern int cgi_show_url_info(struct client_state *csp, struct http_response *rsp,
+                             struct map *parameters);
+extern int cgi_send_banner(struct client_state *csp, struct http_response *rsp,
+                                 struct map *parameters);
 
 /* Not exactly a CGI */
-extern struct http_response * error_response(struct client_state *csp,
-                                             const char *templatename,
-                                             int err);
+extern struct http_response *error_response(struct client_state *csp, const char *template, int err);
 
 /*
  * CGI support functions
  */
-extern struct http_response * alloc_http_response(void);
-extern void free_http_response(struct http_response *rsp);
-
 extern struct http_response *finish_http_response(struct http_response *rsp);
+extern void free_http_response(struct http_response *rsp);
 
-extern struct map * default_exports(const struct client_state *csp, const char *caller);
-
-extern jb_err map_block_killer (struct map *exports, const char *name);
-extern jb_err map_block_keep   (struct map *exports, const char *name);
-extern jb_err map_conditional  (struct map *exports, const char *name, int choose_first);
-
-extern jb_err template_load(struct client_state *csp, char ** template_ptr, 
-                            const char *templatename);
-extern jb_err template_fill(char ** template_ptr, const struct map *exports);
-extern jb_err template_fill_for_cgi(struct client_state *csp,
-                                    const char *templatename,
-                                    struct map *exports,
-                                    struct http_response *rsp);
+extern struct map *default_exports(struct client_state *csp, char *caller);
+extern struct map *map_block_killer(struct map *map, char *name);
+extern char *fill_template(struct client_state *csp, const char *template, struct map *exports);
 
-extern void cgi_init_error_messages(void);
-extern struct http_response *cgi_error_memory(void);
-extern jb_err cgi_error_no_template(struct client_state *csp,
-                                    struct http_response *rsp,
-                                    const char *template_name);
-extern jb_err cgi_error_bad_param(struct client_state *csp,
-                                  struct http_response *rsp);
 
 /*
  * Text generators
  */
-extern void get_http_time(int time_offset, char * buf);
 extern char *make_menu(const char *self);
-extern char *dump_map(const struct map *the_map);
+extern char *dump_map(struct map *map);
+
+#ifdef STATISTICS
+extern struct map *add_stats(struct map *exports);
+#endif /* def STATISTICS */
+
 
 /*
- * Ad replacement images.
+ * Hint: You can encode your own GIFs like that:
+ * perl -e 'while (read STDIN, $c, 1) { printf("\\%.3o,", unpack("C", $c)); }'
  */
-extern const char image_pattern_data[];
-extern const size_t  image_pattern_length;
-extern const char image_blank_data[];
-extern const size_t  image_blank_length;
+
+static const char JBGIF[] =
+   "GIF89aD\000\013\000\360\000\000\000\000\000\377\377\377!"
+   "\371\004\001\000\000\001\000,\000\000\000\000D\000\013\000"
+   "\000\002a\214\217\251\313\355\277\000\200G&K\025\316hC\037"
+   "\200\234\230Y\2309\235S\230\266\206\372J\253<\3131\253\271"
+   "\270\215\342\254\013\203\371\202\264\334P\207\332\020o\266"
+   "N\215I\332=\211\312\3513\266:\026AK)\364\370\365aobr\305"
+   "\372\003S\275\274k2\354\254z\347?\335\274x\306^9\374\276"
+   "\037Q\000\000;";
+
+static const char BLANKGIF[] =
+   "GIF89a\001\000\001\000\200\000\000\377\377\377\000\000"
+   "\000!\371\004\001\000\000\000\000,\000\000\000\000\001"
+   "\000\001\000\000\002\002D\001\000;";
+
 
 /* Revision control strings from this header and associated .c file */
 extern const char cgi_rcs[];
@@ -207,7 +136,7 @@ extern const char cgi_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef CGI_H_INCLUDED */
+#endif /* ndef _CGI_H */
 
 /*
   Local Variables:
diff --git a/cgiedit.c b/cgiedit.c
deleted file mode 100644 (file)
index 51a70f2..0000000
--- a/cgiedit.c
+++ /dev/null
@@ -1,4522 +0,0 @@
-const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.27 2002/03/26 23:06:04 jongfoster Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgiedit.c,v $
- *
- * Purpose     :  CGI-based actionsfile editor.
- *
- *                Functions declared include: cgi_edit_*
- *
- *                NOTE: The CGIs in this file use parameter names
- *                such as "f" and "s" which are really *BAD* choices.
- *                However, I'm trying to save bytes in the
- *                edit-actions-list HTML page - the standard actions
- *                file generated a 550kbyte page, which is ridiculous.
- *
- *                Stick to the short names in this file for consistency.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgiedit.c,v $
- *    Revision 1.27  2002/03/26 23:06:04  jongfoster
- *    Removing duplicate @ifs on the toggle page
- *
- *    Revision 1.26  2002/03/26 22:59:17  jongfoster
- *    Fixing /toggle to display status consistently.
- *
- *    Revision 1.25  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.24  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.23  2002/03/24 13:32:41  swa
- *    name change related issues
- *
- *    Revision 1.22  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.21  2002/03/22 18:02:48  jongfoster
- *    Fixing remote toggle
- *
- *    Revision 1.20  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.19  2002/03/16 18:38:14  jongfoster
- *    Stopping stupid or malicious users from breaking the actions
- *    file using the web-based editor.
- *
- *    Revision 1.18  2002/03/16 14:57:44  jongfoster
- *    Full support for enabling/disabling modular filters.
- *
- *    Revision 1.17  2002/03/16 14:26:42  jongfoster
- *    First version of modular filters support - READ ONLY!
- *    Fixing a double-free bug in the out-of-memory handling in map_radio().
- *
- *    Revision 1.16  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.15  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.14  2002/03/05 00:24:51  jongfoster
- *    Patch to always edit the current actions file.
- *
- *    Revision 1.13  2002/03/04 02:07:59  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.12  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.11  2002/01/23 01:03:31  jongfoster
- *    Fixing gcc [CygWin] compiler warnings
- *
- *    Revision 1.10  2002/01/23 00:22:59  jongfoster
- *    Adding new function cgi_edit_actions_section_swap(), to reorder
- *    the actions file.
- *
- *    Adding get_url_spec_param() to get a validated URL pattern.
- *
- *    Moving edit_read_line() out of this file and into loaders.c.
- *
- *    Adding missing html_encode() to many CGI functions.
- *
- *    Moving the functions that #include actionlist.h to the end of the file,
- *    because the Visual C++ 97 debugger gets extremely confused if you try
- *    to debug any code that comes after them in the file.
- *
- *    Major optimizations in cgi_edit_actions_list() to reduce the size of
- *    the generated HTML (down 40% from 550k to 304k), with major side-effects
- *    throughout the editor and templates.  In particular, the length of the
- *    URLs throughout the editor has been drastically reduced, by cutting
- *    paramater names down to 1 character and CGI names down to 3-4
- *    characters, by removing all non-essential CGI paramaters even at the
- *    expense of having to re-read the actions file for the most trivial
- *    page, and by using relative rather than absolute URLs.  This means
- *    that this (typical example):
- *
- *    <a href="http://ijbswa.sourceforge.net/config/edit-actions-url-form?
- *    filename=ijb&amp;ver=1011487572&amp;section=12&amp;pattern=13
- *    &amp;oldval=www.oesterhelt.org%2Fdeanimate-demo">
- *
- *    is now this:
- *
- *    <a href="eau?f=ijb&amp;v=1011487572&amp;p=13">
- *
- *    Revision 1.9  2002/01/17 20:56:22  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.8  2001/11/30 23:35:51  jongfoster
- *    Renaming actionsfile to ijb.action
- *
- *    Revision 1.7  2001/11/13 00:28:24  jongfoster
- *    - Renaming parameters from edit-actions-for-url so that they only
- *      contain legal JavaScript characters.  If we wanted to write
- *      JavaScript that worked with Netscape 4, this is nessacery.
- *      (Note that at the moment the JavaScript doesn't actually work
- *      with Netscape 4, but now this is purely a template issue, not
- *      one affecting code).
- *    - Adding new CGIs for use by non-JavaScript browsers:
- *        edit-actions-url-form
- *        edit-actions-add-url-form
- *        edit-actions-remove-url-form
- *    - Fixing || bug.
- *
- *    Revision 1.6  2001/10/29 03:48:09  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.5  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.4  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.3  2001/10/14 22:12:49  jongfoster
- *    New version of CGI-based actionsfile editor.
- *    Major changes, including:
- *    - Completely new file parser and file output routines
- *    - edit-actions CGI renamed edit-actions-for-url
- *    - All CGIs now need a filename parameter, except for...
- *    - New CGI edit-actions which doesn't need a filename,
- *      to allow you to start the editor up.
- *    - edit-actions-submit now works, and now automatically
- *      redirects you back to the main edit-actions-list handler.
- *
- *    Revision 1.2  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.1  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-/*
- * FIXME: Following includes copied from cgi.c - which are actually needed?
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <ctype.h>
-#include <string.h>
-#include <assert.h>
-#include <limits.h>
-#include <sys/stat.h>
-
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif /* def _WIN32 */
-
-#include "project.h"
-#include "cgi.h"
-#include "cgiedit.h"
-#include "cgisimple.h"
-#include "list.h"
-#include "encode.h"
-#include "actions.h"
-#include "miscutil.h"
-#include "errlog.h"
-#include "loaders.h"
-#include "loadcfg.h"
-/* loadcfg.h is for g_bToggleIJB only */
-#include "urlmatch.h"
-
-const char cgiedit_h_rcs[] = CGIEDIT_H_VERSION;
-
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-
-struct file_line
-{
-   struct file_line * next;
-   char * raw;
-   char * prefix;
-   char * unprocessed;
-   int type;
-
-   union
-   {
-      struct action_spec action[1];
-
-      struct
-      {
-         char * name;
-         char * svalue;
-         int ivalue;
-      } setting;
-
-      /* Add more data types here... e.g.
-
-
-      struct url_spec url[1];
-
-      struct
-      {
-         struct action_spec action[1];
-         const char * name;
-      } alias;
-
-      */
-
-   } data;
-};
-
-#define FILE_LINE_UNPROCESSED           1
-#define FILE_LINE_BLANK                 2
-#define FILE_LINE_ALIAS_HEADER          3
-#define FILE_LINE_ALIAS_ENTRY           4
-#define FILE_LINE_ACTION                5
-#define FILE_LINE_URL                   6
-#define FILE_LINE_SETTINGS_HEADER       7
-#define FILE_LINE_SETTINGS_ENTRY        8
-#define FILE_LINE_DESCRIPTION_HEADER    9
-#define FILE_LINE_DESCRIPTION_ENTRY    10
-
-
-struct editable_file
-{
-   struct file_line * lines;
-   const char * filename;     /* Full pathname - e.g. "/etc/privoxy/wibble.action" */
-   const char * identifier;   /* Filename stub - e.g. "wibble".  Use for CGI param. */
-                              /* Pre-encoded with url_encode() for ease of use. */
-   const char * version_str;  /* Last modification time, as a string.  For CGI param */
-                              /* Can be used in URL without using url_param(). */
-   unsigned version;          /* Last modification time - prevents chaos with
-                               * the browser's "back" button.  Note that this is a
-                               * time_t cast to an unsigned.  When comparing, always
-                               * cast the time_t to an unsigned, and *NOT* vice-versa.
-                               * This may lose the top few bits, but they're not
-                               * significant anyway.
-                               */
-   int newline;               /* Newline convention - one of the NEWLINE_xxx constants.
-                               * Note that changing this after the file has been
-                               * read in will cause a mess.
-                               */
-   struct file_line * parse_error; /* On parse error, this is the offending line. */
-   const char * parse_error_text;  /* On parse error, this is the problem.
-                                    * (Statically allocated) */
-};
-
-#define CGI_ACTION_PARAM_LEN_MAX 500
-
-/* FIXME: Following non-static functions should be prototyped in .h or made static */
-
-/* Functions to read and write arbitrary config files */
-jb_err edit_read_file(struct client_state *csp,
-                      const struct map *parameters,
-                      int require_version,
-                      const char *suffix,
-                      struct editable_file **pfile);
-jb_err edit_write_file(struct editable_file * file);
-void   edit_free_file(struct editable_file * file);
-
-/* Functions to read and write actions files */
-jb_err edit_parse_actions_file(struct editable_file * file);
-jb_err edit_read_actions_file(struct client_state *csp,
-                              struct http_response *rsp,
-                              const struct map *parameters,
-                              int require_version,
-                              struct editable_file **pfile);
-
-/* Error handlers */
-jb_err cgi_error_modified(struct client_state *csp,
-                          struct http_response *rsp,
-                          const char *filename);
-jb_err cgi_error_parse(struct client_state *csp,
-                       struct http_response *rsp,
-                       struct editable_file *file);
-jb_err cgi_error_file(struct client_state *csp,
-                      struct http_response *rsp,
-                      const char *filename);
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp);
-
-/* Internal arbitrary config file support functions */
-static jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline);
-static void edit_free_file_lines(struct file_line * first_line);
-
-/* Internal actions file support functions */
-static int match_actions_file_header_line(const char * line, const char * name);
-static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue);
-
-/* Internal parameter parsing functions */
-static jb_err get_file_name_param(struct client_state *csp,
-                                  const struct map *parameters,
-                                  const char *param_name,
-                                  const char *suffix,
-                                  char **pfilename,
-                                  const char **pparam);
-static jb_err get_number_param(struct client_state *csp,
-                               const struct map *parameters,
-                               char *name,
-                               unsigned *pvalue);
-static jb_err get_url_spec_param(struct client_state *csp,
-                                 const struct map *parameters,
-                                 const char *name,
-                                 char **pvalue);
-static jb_err get_string_param(const struct map *parameters,
-                               const char *param_name,
-                               const char **pparam);
-
-/* Internal actionsfile <==> HTML conversion functions */
-static jb_err map_radio(struct map * exports,
-                        const char * optionname,
-                        const char * values,
-                        int value);
-static jb_err actions_to_radio(struct map * exports,
-                               const struct action_spec *action);
-static jb_err actions_from_radio(const struct map * parameters,
-                                 struct action_spec *action);
-
-
-static jb_err map_copy_parameter_html(struct map *out,
-                                      const struct map *in,
-                                      const char *name);
-#if 0 /* unused function */
-static jb_err map_copy_parameter_url(struct map *out,
-                                     const struct map *in,
-                                     const char *name);
-#endif /* unused function */
-
-/*********************************************************************
- *
- * Function    :  map_copy_parameter_html
- *
- * Description :  Copy a CGI parameter from one map to another, HTML
- *                encoding it.
- *
- * Parameters  :
- *          1  :  out = target map
- *          2  :  in = source map
- *          3  :  name = name of cgi parameter to copy
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter doesn't exist
- *                                  in the source map
- *
- *********************************************************************/
-static jb_err map_copy_parameter_html(struct map *out,
-                                      const struct map *in,
-                                      const char *name)
-{
-   const char * value;
-   jb_err err;
-
-   assert(out);
-   assert(in);
-   assert(name);
-
-   value = lookup(in, name);
-   err = map(out, name, 1, html_encode(value), 0);
-
-   if (err)
-   {
-      /* Out of memory */
-      return err;
-   }
-   else if (*value == '\0')
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-   else
-   {
-      return JB_ERR_OK;
-   }
-}
-
-
-#if 0 /* unused function */
-/*********************************************************************
- *
- * Function    :  map_copy_parameter_html
- *
- * Description :  Copy a CGI parameter from one map to another, URL
- *                encoding it.
- *
- * Parameters  :
- *          1  :  out = target map
- *          2  :  in = source map
- *          3  :  name = name of cgi parameter to copy
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter doesn't exist
- *                                  in the source map
- *
- *********************************************************************/
-static jb_err map_copy_parameter_url(struct map *out,
-                                     const struct map *in,
-                                     const char *name)
-{
-   const char * value;
-   jb_err err;
-
-   assert(out);
-   assert(in);
-   assert(name);
-
-   value = lookup(in, name);
-   err = map(out, name, 1, url_encode(value), 0);
-
-   if (err)
-   {
-      /* Out of memory */
-      return err;
-   }
-   else if (*value == '\0')
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-   else
-   {
-      return JB_ERR_OK;
-   }
-}
-#endif /* 0 - unused function */
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_url_form(struct client_state *csp,
-                                 struct http_response *rsp,
-                                 const struct map *parameters)
-{
-   struct map * exports;
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != patternid)
-     || (patternid < 1)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "p", 1, url_encode(lookup(parameters, "p")), 0);
-   if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0);
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_add_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_add_url_form(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map_copy_parameter_html(exports, parameters, "f");
-   if (!err) err = map_copy_parameter_html(exports, parameters, "v");
-   if (!err) err = map_copy_parameter_html(exports, parameters, "s");
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-add-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_remove_url_form
- *
- * Description :  CGI function that displays a form for
- *                edit-actions-url
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to edit
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_remove_url_form(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   struct map * exports;
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < patternid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != patternid)
-     || (patternid < 1)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0);
-   if (!err) err = map(exports, "u", 1, html_encode(cur_line->unprocessed), 0);
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-remove-url-form", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_write_file
- *
- * Description :  Write a complete file to disk.
- *
- * Parameters  :
- *          1  :  filename = File to write to.
- *          2  :  file = Data structure to write.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_FILE   on error writing to file.
- *                JB_ERR_MEMORY on out of memory
- *
- *********************************************************************/
-jb_err edit_write_file(struct editable_file * file)
-{
-   FILE * fp;
-   struct file_line * cur_line;
-   struct stat statbuf[1];
-   char version_buf[22]; /* 22 = ceil(log10(2^64)) + 2 = max number of
-                            digits in time_t, assuming this is a 64-bit
-                            machine, plus null terminator, plus one
-                            for paranoia */
-
-   assert(file);
-   assert(file->filename);
-
-#if defined(AMIGA) || defined(__OS2__)
-   if (NULL == (fp = fopen(file->filename, "w")))
-#else
-   if (NULL == (fp = fopen(file->filename, "wt")))
-#endif /* def AMIGA */
-   {
-      return JB_ERR_FILE;
-   }
-
-   cur_line = file->lines;
-   while (cur_line != NULL)
-   {
-      if (cur_line->raw)
-      {
-         if (fputs(cur_line->raw, fp) < 0)
-         {
-            fclose(fp);
-            return JB_ERR_FILE;
-         }
-      }
-      else
-      {
-         if (cur_line->prefix)
-         {
-            if (fputs(cur_line->prefix, fp) < 0)
-            {
-               fclose(fp);
-               return JB_ERR_FILE;
-            }
-         }
-         if (cur_line->unprocessed)
-         {
-            /* This should be a single line - sanity check. */
-            assert(NULL == strchr(cur_line->unprocessed, '\r'));
-            assert(NULL == strchr(cur_line->unprocessed, '\n'));
-
-            if (NULL != strchr(cur_line->unprocessed, '#'))
-            {
-               /* Must quote '#' characters */
-               int numhash = 0;
-               int len;
-               char * src;
-               char * dest;
-               char * str;
-
-               /* Count number of # characters, so we know length of output string */
-               src = cur_line->unprocessed;
-               while (NULL != (src = strchr(src, '#')))
-               {
-                  numhash++;
-                  src++;
-               }
-               assert(numhash > 0);
-
-               /* Allocate new memory for string */
-               len = strlen(cur_line->unprocessed);
-               if (NULL == (str = malloc((size_t) len + 1 + numhash)))
-               {
-                  /* Uh oh, just trashed file! */
-                  fclose(fp);
-                  return JB_ERR_MEMORY;
-               }
-
-               /* Loop through string from end */
-               src  = cur_line->unprocessed + len;
-               dest = str + len + numhash;
-               for ( ; len >= 0; len--)
-               {
-                  if ((*dest-- = *src--) == '#')
-                  {
-                     *dest-- = '\\';
-                     numhash--;
-                     assert(numhash >= 0);
-                  }
-               }
-               assert(numhash == 0);
-               assert(src  + 1 == cur_line->unprocessed);
-               assert(dest + 1 == str);
-
-               if (fputs(str, fp) < 0)
-               {
-                  free(str);
-                  fclose(fp);
-                  return JB_ERR_FILE;
-               }
-
-               free(str);
-            }
-            else
-            {
-               /* Can write without quoting '#' characters. */
-               if (fputs(cur_line->unprocessed, fp) < 0)
-               {
-                  fclose(fp);
-                  return JB_ERR_FILE;
-               }
-            }
-            if (fputs(NEWLINE(file->newline), fp) < 0)
-            {
-               fclose(fp);
-               return JB_ERR_FILE;
-            }
-         }
-         else
-         {
-            /* FIXME: Write data from file->data->whatever */
-            assert(0);
-         }
-      }
-      cur_line = cur_line->next;
-   }
-
-   fclose(fp);
-
-
-   /* Update the version stamp in the file structure, since we just
-    * wrote to the file & changed it's date.
-    */
-   if (stat(file->filename, statbuf) < 0)
-   {
-      /* Error, probably file not found. */
-      return JB_ERR_FILE;
-   }
-   file->version = (unsigned)statbuf->st_mtime;
-
-   /* Correct file->version_str */
-   freez(file->version_str);
-   snprintf(version_buf, 22, "%u", file->version);
-   version_buf[21] = '\0';
-   file->version_str = strdup(version_buf);
-   if (version_buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_free_file
- *
- * Description :  Free a complete file in memory.
- *
- * Parameters  :
- *          1  :  file = Data structure to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void edit_free_file(struct editable_file * file)
-{
-   if (!file)
-   {
-      /* Silently ignore NULL pointer */
-      return;
-   }
-
-   edit_free_file_lines(file->lines);
-   freez(file->filename);
-   freez(file->identifier);
-   freez(file->version_str);
-   file->version = 0;
-   file->parse_error_text = NULL; /* Statically allocated */
-   file->parse_error = NULL;
-
-   free(file);
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_free_file
- *
- * Description :  Free an entire linked list of file lines.
- *
- * Parameters  :
- *          1  :  first_line = Data structure to free.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void edit_free_file_lines(struct file_line * first_line)
-{
-   struct file_line * next_line;
-
-   while (first_line != NULL)
-   {
-      next_line = first_line->next;
-      first_line->next = NULL;
-      freez(first_line->raw);
-      freez(first_line->prefix);
-      freez(first_line->unprocessed);
-      switch(first_line->type)
-      {
-         case 0: /* special case if memory zeroed */
-         case FILE_LINE_UNPROCESSED:
-         case FILE_LINE_BLANK:
-         case FILE_LINE_ALIAS_HEADER:
-         case FILE_LINE_SETTINGS_HEADER:
-         case FILE_LINE_DESCRIPTION_HEADER:
-         case FILE_LINE_DESCRIPTION_ENTRY:
-         case FILE_LINE_ALIAS_ENTRY:
-         case FILE_LINE_URL:
-            /* No data is stored for these */
-            break;
-
-         case FILE_LINE_ACTION:
-            free_action(first_line->data.action);
-            break;
-
-         case FILE_LINE_SETTINGS_ENTRY:
-            freez(first_line->data.setting.name);
-            freez(first_line->data.setting.svalue);
-            break;
-         default:
-            /* Should never happen */
-            assert(0);
-            break;
-      }
-      first_line->type = 0; /* paranoia */
-      free(first_line);
-      first_line = next_line;
-   }
-}
-
-
-/*********************************************************************
- *
- * Function    :  match_actions_file_header_line
- *
- * Description :  Match an actions file {{header}} line
- *
- * Parameters  :
- *          1  :  line = String from file
- *          2  :  name = Header to match against
- *
- * Returns     :  0 iff they match.
- *
- *********************************************************************/
-static int match_actions_file_header_line(const char * line, const char * name)
-{
-   size_t len;
-
-   assert(line);
-   assert(name);
-
-   /* Look for "{{" */
-   if ((line[0] != '{') || (line[1] != '{'))
-   {
-      return 1;
-   }
-   line += 2;
-
-   /* Look for optional whitespace */
-   while ( (*line == ' ') || (*line == '\t') )
-   {
-      line++;
-   }
-
-   /* Look for the specified name (case-insensitive) */
-   len = strlen(name);
-   if (0 != strncmpic(line, name, len))
-   {
-      return 1;
-   }
-   line += len;
-
-   /* Look for optional whitespace */
-   while ( (*line == ' ') || (*line == '\t') )
-   {
-      line++;
-   }
-
-   /* Look for "}}" and end of string*/
-   if ((line[0] != '}') || (line[1] != '}') || (line[2] != '\0'))
-   {
-      return 1;
-   }
-
-   /* It matched!! */
-   return 0;
-}
-
-
-/*********************************************************************
- *
- * Function    :  match_actions_file_header_line
- *
- * Description :  Match an actions file {{header}} line
- *
- * Parameters  :
- *          1  :  line = String from file.  Must not start with
- *                       whitespace (else infinite loop!)
- *          2  :  name = Destination for name
- *          2  :  name = Destination for value
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_PARSE  if there's no "=" sign, or if there's
- *                              nothing before the "=" sign (but empty
- *                              values *after* the "=" sign are legal).
- *
- *********************************************************************/
-static jb_err split_line_on_equals(const char * line, char ** pname, char ** pvalue)
-{
-   const char * name_end;
-   const char * value_start;
-   size_t name_len;
-
-   assert(line);
-   assert(pname);
-   assert(pvalue);
-   assert(*line != ' ');
-   assert(*line != '\t');
-
-   *pname = NULL;
-   *pvalue = NULL;
-
-   value_start = strchr(line, '=');
-   if ((value_start == NULL) || (value_start == line))
-   {
-      return JB_ERR_PARSE;
-   }
-
-   name_end = value_start - 1;
-
-   /* Eat any whitespace before the '=' */
-   while ((*name_end == ' ') || (*name_end == '\t'))
-   {
-      /*
-       * we already know we must have at least 1 non-ws char
-       * at start of buf - no need to check
-       */
-      name_end--;
-   }
-
-   name_len = name_end - line + 1; /* Length excluding \0 */
-   if (NULL == (*pname = (char *) malloc(name_len + 1)))
-   {
-      return JB_ERR_MEMORY;
-   }
-   strncpy(*pname, line, name_len);
-   (*pname)[name_len] = '\0';
-
-   /* Eat any the whitespace after the '=' */
-   value_start++;
-   while ((*value_start == ' ') || (*value_start == '\t'))
-   {
-      value_start++;
-   }
-
-   if (NULL == (*pvalue = strdup(value_start)))
-   {
-      free(*pname);
-      *pname = NULL;
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_parse_actions_file
- *
- * Description :  Parse an actions file in memory.
- *
- *                Passed linked list must have the "data" member
- *                zeroed, and must contain valid "next" and
- *                "unprocessed" fields.  The "raw" and "prefix"
- *                fields are ignored, and "type" is just overwritten.
- *
- *                Note that on error the file may have been
- *                partially parsed.
- *
- * Parameters  :
- *          1  :  file = Actions file to be parsed in-place.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_PARSE  on error
- *
- *********************************************************************/
-jb_err edit_parse_actions_file(struct editable_file * file)
-{
-   struct file_line * cur_line;
-   size_t len;
-   const char * text; /* Text from a line */
-   char * name;  /* For lines of the form name=value */
-   char * value; /* For lines of the form name=value */
-   struct action_alias * alias_list = NULL;
-   jb_err err = JB_ERR_OK;
-
-   /* alias_list contains the aliases defined in this file.
-    * It might be better to use the "file_line.data" fields
-    * in the relavent places instead.
-    */
-
-   cur_line = file->lines;
-
-   /* A note about blank line support: Blank lines should only
-    * ever occur as the last line in the file.  This function
-    * is more forgiving than that - FILE_LINE_BLANK can occur
-    * anywhere.
-    */
-
-   /* Skip leading blanks.  Should only happen if file is
-    * empty (which is valid, but pointless).
-    */
-   while ( (cur_line != NULL)
-        && (cur_line->unprocessed[0] == '\0') )
-   {
-      /* Blank line */
-      cur_line->type = FILE_LINE_BLANK;
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line != NULL)
-     && (cur_line->unprocessed[0] != '{') )
-   {
-      /* File doesn't start with a header */
-      file->parse_error = cur_line;
-      file->parse_error_text = "First (non-comment) line of the file must contain a header.";
-      return JB_ERR_PARSE;
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "settings") ) )
-   {
-      cur_line->type = FILE_LINE_SETTINGS_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            cur_line->type = FILE_LINE_SETTINGS_ENTRY;
-
-            err = split_line_on_equals(cur_line->unprocessed,
-                     &cur_line->data.setting.name,
-                     &cur_line->data.setting.svalue);
-            if (err == JB_ERR_MEMORY)
-            {
-               return err;
-            }
-            else if (err != JB_ERR_OK)
-            {
-               /* Line does not contain a name=value pair */
-               file->parse_error = cur_line;
-               file->parse_error_text = "Expected a name=value pair on this {{description}} line, but couldn't find one.";
-               return JB_ERR_PARSE;
-            }
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "description") ) )
-   {
-      cur_line->type = FILE_LINE_DESCRIPTION_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            cur_line->type = FILE_LINE_DESCRIPTION_ENTRY;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   if ( (cur_line != NULL) && (0 ==
-      match_actions_file_header_line(cur_line->unprocessed, "alias") ) )
-   {
-      cur_line->type = FILE_LINE_ALIAS_HEADER;
-
-      cur_line = cur_line->next;
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            /* define an alias */
-            struct action_alias * new_alias;
-
-            cur_line->type = FILE_LINE_ALIAS_ENTRY;
-
-            err = split_line_on_equals(cur_line->unprocessed, &name, &value);
-            if (err == JB_ERR_MEMORY)
-            {
-               return err;
-            }
-            else if (err != JB_ERR_OK)
-            {
-               /* Line does not contain a name=value pair */
-               file->parse_error = cur_line;
-               file->parse_error_text = "Expected a name=value pair on this {{alias}} line, but couldn't find one.";
-               return JB_ERR_PARSE;
-            }
-
-            if ((new_alias = zalloc(sizeof(*new_alias))) == NULL)
-            {
-               /* Out of memory */
-               free(name);
-               free(value);
-               free_alias_list(alias_list);
-               return JB_ERR_MEMORY;
-            }
-
-            err = get_actions(value, alias_list, new_alias->action);
-            if (err)
-            {
-               /* Invalid action or out of memory */
-               free(name);
-               free(value);
-               free(new_alias);
-               free_alias_list(alias_list);
-               if (err == JB_ERR_MEMORY)
-               {
-                  return err;
-               }
-               else
-               {
-                  /* Line does not contain a name=value pair */
-                  file->parse_error = cur_line;
-                  file->parse_error_text = "This alias does not specify a valid set of actions.";
-                  return JB_ERR_PARSE;
-               }
-            }
-
-            free(value);
-
-            new_alias->name = name;
-
-            /* add to list */
-            new_alias->next = alias_list;
-            alias_list = new_alias;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   }
-
-   /* Header done, process the main part of the file */
-   while (cur_line != NULL)
-   {
-      /* At this point, (cur_line->unprocessed[0] == '{') */
-      assert(cur_line->unprocessed[0] == '{');
-      text = cur_line->unprocessed + 1;
-      len = strlen(text) - 1;
-      if (text[len] != '}')
-      {
-         /* No closing } on header */
-         free_alias_list(alias_list);
-         file->parse_error = cur_line;
-         file->parse_error_text = "Headers starting with '{' must have a "
-            "closing bracket ('}').  Headers starting with two brackets ('{{') "
-            "must close with two brackets ('}}').";
-         return JB_ERR_PARSE;
-      }
-
-      if (text[0] == '{')
-      {
-         /* An invalid {{ header.  */
-         free_alias_list(alias_list);
-         file->parse_error = cur_line;
-         file->parse_error_text = "Unknown or unexpected two-bracket header.  "
-            "Please remember that the system (two-bracket) headers must "
-            "appear in the order {{settings}}, {{description}}, {{alias}}, "
-            "and must appear before any actions (one-bracket) headers.  "
-            "Also note that system headers may not be repeated.";
-         return JB_ERR_PARSE;
-      }
-
-      while ( (*text == ' ') || (*text == '\t') )
-      {
-         text++;
-         len--;
-      }
-      while ( (len > 0)
-           && ( (text[len - 1] == ' ')
-             || (text[len - 1] == '\t') ) )
-      {
-         len--;
-      }
-
-      cur_line->type = FILE_LINE_ACTION;
-
-      /* Remove {} and make copy */
-      if (NULL == (value = (char *) malloc(len + 1)))
-      {
-         /* Out of memory */
-         free_alias_list(alias_list);
-         return JB_ERR_MEMORY;
-      }
-      strncpy(value, text, len);
-      value[len] = '\0';
-
-      /* Get actions */
-      err = get_actions(value, alias_list, cur_line->data.action);
-      if (err)
-      {
-         /* Invalid action or out of memory */
-         free(value);
-         free_alias_list(alias_list);
-         if (err == JB_ERR_MEMORY)
-         {
-            return err;
-         }
-         else
-         {
-            /* Line does not contain a name=value pair */
-            file->parse_error = cur_line;
-            file->parse_error_text = "This header does not specify a valid set of actions.";
-            return JB_ERR_PARSE;
-         }
-      }
-
-      /* Done with string - it was clobbered anyway */
-      free(value);
-
-      /* Process next line */
-      cur_line = cur_line->next;
-
-      /* Loop processing URL patterns */
-      while ((cur_line != NULL) && (cur_line->unprocessed[0] != '{'))
-      {
-         if (cur_line->unprocessed[0])
-         {
-            /* Could parse URL here, but this isn't currently needed */
-
-            cur_line->type = FILE_LINE_URL;
-         }
-         else
-         {
-            cur_line->type = FILE_LINE_BLANK;
-         }
-         cur_line = cur_line->next;
-      }
-   } /* End main while(cur_line != NULL) loop */
-
-   free_alias_list(alias_list);
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_file_lines
- *
- * Description :  Read all the lines of a file into memory.
- *                Handles whitespace, comments and line continuation.
- *
- * Parameters  :
- *          1  :  fp = File to read from.  On return, this will be
- *                     at EOF but it will not have been closed.
- *          2  :  pfile = Destination for a linked list of file_lines.
- *                        Will be set to NULL on error.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline)
-{
-   struct file_line * first_line; /* Keep for return value or to free */
-   struct file_line * cur_line;   /* Current line */
-   struct file_line * prev_line;  /* Entry with prev_line->next = cur_line */
-   jb_err rval;
-
-   assert(fp);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   cur_line = first_line = zalloc(sizeof(struct file_line));
-   if (cur_line == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   cur_line->type = FILE_LINE_UNPROCESSED;
-
-   rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL);
-   if (rval)
-   {
-      /* Out of memory or empty file. */
-      /* Note that empty file is not an error we propogate up */
-      free(cur_line);
-      return ((rval == JB_ERR_FILE) ? JB_ERR_OK : rval);
-   }
-
-   do
-   {
-      prev_line = cur_line;
-      cur_line = prev_line->next = zalloc(sizeof(struct file_line));
-      if (cur_line == NULL)
-      {
-         /* Out of memory */
-         edit_free_file_lines(first_line);
-         return JB_ERR_MEMORY;
-      }
-
-      cur_line->type = FILE_LINE_UNPROCESSED;
-
-      rval = edit_read_line(fp, &cur_line->raw, &cur_line->prefix, &cur_line->unprocessed, newline, NULL);
-      if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE))
-      {
-         /* Out of memory */
-         edit_free_file_lines(first_line);
-         return JB_ERR_MEMORY;
-      }
-
-   }
-   while (rval != JB_ERR_FILE);
-
-   /* EOF */
-
-   /* We allocated one too many - free it */
-   prev_line->next = NULL;
-   free(cur_line);
-
-   *pfile = first_line;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_file
- *
- * Description :  Read a complete file into memory.
- *                Handles CGI parameter parsing.  If requested, also
- *                checks the file's modification timestamp.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters.
- *          3  :  require_version = true to check "ver" parameter.
- *          4  :  suffix = File extension, e.g. ".action".
- *          5  :  pfile = Destination for the file.  Will be set
- *                        to NULL on error.
- *
- * CGI Parameters :
- *    filename :  The name of the file to read, without the
- *                path or ".action" extension.
- *         ver :  (Only if require_version is nonzero)
- *                Timestamp of the actions file.  If wrong, this
- *                function fails with JB_ERR_MODIFIED.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *                JB_ERR_FILE   if the file cannot be opened or
- *                              contains no data
- *                JB_ERR_MODIFIED if version checking was requested and
- *                                failed - the file was modified outside
- *                                of this CGI editor instance.
- *
- *********************************************************************/
-jb_err edit_read_file(struct client_state *csp,
-                      const struct map *parameters,
-                      int require_version,
-                      const char *suffix,
-                      struct editable_file **pfile)
-{
-   struct file_line * lines;
-   FILE * fp;
-   jb_err err;
-   char * filename;
-   const char * identifier;
-   struct editable_file * file;
-   unsigned version = 0;
-   struct stat statbuf[1];
-   char version_buf[22];
-   int newline = NEWLINE_UNKNOWN;
-
-   assert(csp);
-   assert(parameters);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   err = get_file_name_param(csp, parameters, "f", suffix,
-                             &filename, &identifier);
-   if (err)
-   {
-      return err;
-   }
-
-   if (stat(filename, statbuf) < 0)
-   {
-      /* Error, probably file not found. */
-      free(filename);
-      return JB_ERR_FILE;
-   }
-   version = (unsigned) statbuf->st_mtime;
-
-   if (require_version)
-   {
-      unsigned specified_version;
-      err = get_number_param(csp, parameters, "v", &specified_version);
-      if (err)
-      {
-         free(filename);
-         return err;
-      }
-
-      if (version != specified_version)
-      {
-         return JB_ERR_MODIFIED;
-      }
-   }
-
-#if defined(AMIGA) || defined(__OS2__)
-   if (NULL == (fp = fopen(filename,"r")))
-#else
-   if (NULL == (fp = fopen(filename,"rt")))
-#endif /* def AMIGA */
-   {
-      free(filename);
-      return JB_ERR_FILE;
-   }
-
-   err = edit_read_file_lines(fp, &lines, &newline);
-
-   fclose(fp);
-
-   if (err)
-   {
-      free(filename);
-      return err;
-   }
-
-   file = (struct editable_file *) zalloc(sizeof(*file));
-   if (err)
-   {
-      free(filename);
-      edit_free_file_lines(lines);
-      return err;
-   }
-
-   file->lines = lines;
-   file->newline = newline;
-   file->filename = filename;
-   file->version = version;
-   file->identifier = url_encode(identifier);
-
-   if (file->identifier == NULL)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Correct file->version_str */
-   freez(file->version_str);
-   snprintf(version_buf, 22, "%u", file->version);
-   version_buf[21] = '\0';
-   file->version_str = strdup(version_buf);
-   if (version_buf == NULL)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   *pfile = file;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  edit_read_actions_file
- *
- * Description :  Read a complete actions file into memory.
- *                Handles CGI parameter parsing.  If requested, also
- *                checks the file's modification timestamp.
- *
- *                If this function detects an error in the categories
- *                JB_ERR_FILE, JB_ERR_MODIFIED, or JB_ERR_PARSE,
- *                then it handles it by filling in the specified
- *                response structure and returning JB_ERR_FILE.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = HTTP response.  Only filled in on error.
- *          2  :  parameters = map of cgi parameters.
- *          3  :  require_version = true to check "ver" parameter.
- *          4  :  pfile = Destination for the file.  Will be set
- *                        to NULL on error.
- *
- * CGI Parameters :
- *    filename :  The name of the actions file to read, without the
- *                path or ".action" extension.
- *         ver :  (Only if require_version is nonzero)
- *                Timestamp of the actions file.  If wrong, this
- *                function fails with JB_ERR_MODIFIED.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *                JB_ERR_FILE  if the file does not contain valid data,
- *                             or if file cannot be opened or
- *                             contains no data, or if version
- *                             checking was requested and failed.
- *
- *********************************************************************/
-jb_err edit_read_actions_file(struct client_state *csp,
-                              struct http_response *rsp,
-                              const struct map *parameters,
-                              int require_version,
-                              struct editable_file **pfile)
-{
-   jb_err err;
-   struct editable_file *file;
-
-   assert(csp);
-   assert(parameters);
-   assert(pfile);
-
-   *pfile = NULL;
-
-   err = edit_read_file(csp, parameters, require_version, ".action", &file);
-   if (err)
-   {
-      /* Try to handle if possible */
-      if (err == JB_ERR_FILE)
-      {
-         err = cgi_error_file(csp, rsp, lookup(parameters, "f"));
-      }
-      else if (err == JB_ERR_MODIFIED)
-      {
-         err = cgi_error_modified(csp, rsp, lookup(parameters, "f"));
-      }
-      if (err == JB_ERR_OK)
-      {
-         /*
-          * Signal to higher-level CGI code that there was a problem but we
-          * handled it, they should just return JB_ERR_OK.
-          */
-         err = JB_ERR_FILE;
-      }
-      return err;
-   }
-
-   err = edit_parse_actions_file(file);
-   if (err)
-   {
-      if (err == JB_ERR_PARSE)
-      {
-         err = cgi_error_parse(csp, rsp, file);
-         if (err == JB_ERR_OK)
-         {
-            /*
-             * Signal to higher-level CGI code that there was a problem but we
-             * handled it, they should just return JB_ERR_OK.
-             */
-            err = JB_ERR_FILE;
-         }
-      }
-      edit_free_file(file);
-      return err;
-   }
-
-   *pfile = file;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_file_name_param
- *
- * Description :  Get the name of the file to edit from the parameters
- *                passed to a CGI function.  This function handles
- *                security checks such as blocking urls containing
- *                "/" or ".", prepending the config file directory,
- *                and adding the specified suffix.
- *
- *                (This is an essential security check, otherwise
- *                users may be able to pass "../../../etc/passwd"
- *                and overwrite the password file [linux], "prn:"
- *                and print random data [Windows], etc...)
- *
- *                This function only allows filenames contining the
- *                characters '-', '_', 'A'-'Z', 'a'-'z', and '0'-'9'.
- *                That's probably too restrictive but at least it's
- *                secure.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  param_name = The name of the parameter to read
- *          4  :  suffix = File extension, e.g. ".actions"
- *          5  :  pfilename = destination for full filename.  Caller
- *                free()s.  Set to NULL on error.
- *          6  :  pparam = destination for partial filename,
- *                suitable for use in another URL.  Allocated as part
- *                of the map "parameters", so don't free it.
- *                Set to NULL if not specified.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_file_name_param(struct client_state *csp,
-                                  const struct map *parameters,
-                                  const char *param_name,
-                                  const char *suffix,
-                                  char **pfilename,
-                                  const char **pparam)
-{
-   const char *param;
-   const char *s;
-#if 0 /* Patch to make 3.0.0 work properly. */
-   char *name;
-#endif /* 0 - Patch to make 3.0.0 work properly. */
-   char *fullpath;
-   char ch;
-   int len;
-
-   assert(csp);
-   assert(parameters);
-   assert(suffix);
-   assert(pfilename);
-   assert(pparam);
-
-   *pfilename = NULL;
-   *pparam = NULL;
-
-   param = lookup(parameters, param_name);
-   if (!*param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   *pparam = param;
-
-   len = strlen(param);
-   if (len >= FILENAME_MAX)
-   {
-      /* Too long. */
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check every character to see if it's legal */
-   s = param;
-   while ((ch = *s++) != '\0')
-   {
-      if ( ((ch < 'A') || (ch > 'Z'))
-        && ((ch < 'a') || (ch > 'z'))
-        && ((ch < '0') || (ch > '9'))
-        && (ch != '-')
-        && (ch != '_') )
-      {
-         /* Probable hack attempt. */
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /*
-    * FIXME Following is a hack to make 3.0.0 work properly.
-    * Change "#if 0" --> "#if 1" below when we have modular action
-    * files.
-    *    -- Jon
-    */
-#if 0 /* Patch to make 3.0.0 work properly. */
-   /* Append extension */
-   name = malloc(len + strlen(suffix) + 1);
-   if (name == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   strcpy(name, param);
-   strcpy(name + len, suffix);
-
-   /* Prepend path */
-   fullpath = make_path(csp->config->confdir, name);
-   free(name);
-#else /* 1 - Patch to make 3.0.0 work properly. */
-   if ((csp->actions_list == NULL)
-    || (csp->actions_list->filename == NULL))
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   fullpath = ( (csp->actions_list && csp->actions_list->filename)
-             ? strdup(csp->actions_list->filename) : NULL);
-#endif /* 1 - Patch to make 3.0.0 work properly. */
-   if (fullpath == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /* Success */
-   *pfilename = fullpath;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_char_param
- *
- * Description :  Get a single-character parameter passed to a CGI
- *                function.
- *
- * Parameters  :
- *          1  :  parameters = map of cgi parameters
- *          2  :  param_name = The name of the parameter to read
- *
- * Returns     :  Uppercase character on success, '\0' on error.
- *
- *********************************************************************/
-static char get_char_param(const struct map *parameters,
-                           const char *param_name)
-{
-   char ch;
-
-   assert(parameters);
-   assert(param_name);
-
-   ch = *(lookup(parameters, param_name));
-   if ((ch >= 'a') && (ch <= 'z'))
-   {
-      ch = ch - 'a' + 'A';
-   }
-
-   return ch;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_string_param
- *
- * Description :  Get a string paramater, to be used as an
- *                ACTION_STRING or ACTION_MULTI paramater.
- *                Validates the input to prevent stupid/malicious
- *                users from corrupting their action file.
- *
- * Parameters  :
- *          1  :  parameters = map of cgi parameters
- *          2  :  param_name = The name of the parameter to read
- *          3  :  pparam = destination for paramater.  Allocated as
- *                part of the map "parameters", so don't free it.
- *                Set to NULL if not specified.
- *
- * Returns     :  JB_ERR_OK         on success, or if the paramater
- *                                  was not specified.
- *                JB_ERR_MEMORY     on out-of-memory.
- *                JB_ERR_CGI_PARAMS if the paramater is not valid.
- *
- *********************************************************************/
-static jb_err get_string_param(const struct map *parameters,
-                               const char *param_name,
-                               const char **pparam)
-{
-   const char *param;
-   const char *s;
-   char ch;
-
-   assert(parameters);
-   assert(param_name);
-   assert(pparam);
-
-   *pparam = NULL;
-
-   param = lookup(parameters, param_name);
-   if (!*param)
-   {
-      return JB_ERR_OK;
-   }
-
-   if (strlen(param) >= CGI_ACTION_PARAM_LEN_MAX)
-   {
-      /*
-       * Too long.
-       *
-       * Note that the length limit is arbitrary, it just seems
-       * sensible to limit it to *something*.  There's no
-       * technical reason for any limit at all.
-       */
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check every character to see if it's legal */
-   s = param;
-   while ((ch = *s++) != '\0')
-   {
-      if ( ((unsigned char)ch < (unsigned char)' ')
-        || (ch == '}') )
-      {
-         /* Probable hack attempt, or user accidentally used '}'. */
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /* Success */
-   *pparam = param;
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_number_param
- *
- * Description :  Get a non-negative integer from the parameters
- *                passed to a CGI function.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  name = Name of CGI parameter to read
- *          4  :  pvalue = destination for value.
- *                         Set to -1 on error.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_number_param(struct client_state *csp,
-                               const struct map *parameters,
-                               char *name,
-                               unsigned *pvalue)
-{
-   const char *param;
-   char ch;
-   unsigned value;
-
-   assert(csp);
-   assert(parameters);
-   assert(name);
-   assert(pvalue);
-
-   *pvalue = 0; 
-
-   param = lookup(parameters, name);
-   if (!*param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* We don't use atoi because I want to check this carefully... */
-
-   value = 0;
-   while ((ch = *param++) != '\0')
-   {
-      if ((ch < '0') || (ch > '9'))
-      {
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      ch -= '0';
-
-      /* Note:
-       *
-       * <limits.h> defines UINT_MAX
-       *
-       * (UINT_MAX - ch) / 10 is the largest number that
-       *     can be safely multiplied by 10 then have ch added.
-       */
-      if (value > ((UINT_MAX - (unsigned)ch) / 10U))
-      {
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      value = value * 10 + ch;
-   }
-
-   /* Success */
-   *pvalue = value;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  get_url_spec_param
- *
- * Description :  Get a URL pattern from the parameters
- *                passed to a CGI function.  Removes leading/trailing
- *                spaces and validates it.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  parameters = map of cgi parameters
- *          3  :  name = Name of CGI parameter to read
- *          4  :  pvalue = destination for value.  Will be malloc()'d.
- *                         Set to NULL on error.
- *
- * Returns     :  JB_ERR_OK         on success
- *                JB_ERR_MEMORY     on out-of-memory
- *                JB_ERR_CGI_PARAMS if the parameter was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-static jb_err get_url_spec_param(struct client_state *csp,
-                                 const struct map *parameters,
-                                 const char *name,
-                                 char **pvalue)
-{
-   const char *orig_param;
-   char *param;
-   char *s;
-   struct url_spec compiled[1];
-   jb_err err;
-
-   assert(csp);
-   assert(parameters);
-   assert(name);
-   assert(pvalue);
-
-   *pvalue = NULL;
-
-   orig_param = lookup(parameters, name);
-   if (!*orig_param)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Copy and trim whitespace */
-   param = strdup(orig_param);
-   if (param == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   chomp(param);
-
-   /* Must be non-empty, and can't allow 1st character to be '{' */
-   if (param[0] == '\0' || param[0] == '{')
-   {
-      free(param);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* Check for embedded newlines */
-   for (s = param; *s != '\0'; s++)
-   {
-      if ((*s == '\r') || (*s == '\n'))
-      {
-         free(param);
-         return JB_ERR_CGI_PARAMS;
-      }
-   }
-
-   /* Check that regex is valid */
-   s = strdup(param);
-   if (s == NULL)
-   {
-      free(param);
-      return JB_ERR_MEMORY;
-   }
-   err = create_url_spec(compiled, s);
-   free(s);
-   if (err)
-   {
-      free(param);
-      return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS;
-   }
-   free_url_spec(compiled);
-
-   if (param[strlen(param) - 1] == '\\')
-   {
-      /*
-       * Must protect trailing '\\' from becoming line continuation character.
-       * Two methods: 1) If it's a domain only, add a trailing '/'.
-       * 2) For path, add the do-nothing PCRE expression (?:) to the end
-       */
-      if (strchr(param, '/') == NULL)
-      {
-         err = string_append(&param, "/");
-      }
-      else
-      {
-         err = string_append(&param, "(?:)");
-      }
-      if (err)
-      {
-         return err;
-      }
-
-      /* Check that the modified regex is valid */
-      s = strdup(param);
-      if (s == NULL)
-      {
-         free(param);
-         return JB_ERR_MEMORY;
-      }
-      err = create_url_spec(compiled, s);
-      free(s);
-      if (err)
-      {
-         free(param);
-         return (err == JB_ERR_MEMORY) ? JB_ERR_MEMORY : JB_ERR_CGI_PARAMS;
-      }
-      free_url_spec(compiled);
-   }
-
-   *pvalue = param;
-   return JB_ERR_OK;
-}
-
-/*********************************************************************
- *
- * Function    :  map_radio
- *
- * Description :  Map a set of radio button values.  E.g. if you have
- *                3 radio buttons, declare them as:
- *                  <option type="radio" name="xyz" @xyz-a@>
- *                  <option type="radio" name="xyz" @xyz-b@>
- *                  <option type="radio" name="xyz" @xyz-c@>
- *                Then map one of the @xyz-?@ variables to "checked"
- *                and all the others to empty by calling:
- *                map_radio(exports, "xyz", "abc", sel)
- *                Where 'sel' is 'a', 'b', or 'c'.
- *
- * Parameters  :
- *          1  :  exports = Exports map to modify.
- *          2  :  optionname = name for map
- *          3  :  values = null-terminated list of values;
- *          4  :  value = Selected value.
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err map_radio(struct map * exports,
-                        const char * optionname,
-                        const char * values,
-                        int value)
-{
-   size_t len;
-   char * buf;
-   char * p;
-   char c;
-
-   assert(exports);
-   assert(optionname);
-   assert(values);
-
-   len = strlen(optionname);
-   buf = malloc(len + 3);
-   if (buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   strcpy(buf, optionname);
-   p = buf + len;
-   *p++ = '-';
-   p[1] = '\0';
-
-   while ((c = *values++) != '\0')
-   {
-      if (c != value)
-      {
-         *p = c;
-         if (map(exports, buf, 1, "", 1))
-         {
-            return JB_ERR_MEMORY;
-         }
-      }
-   }
-
-   *p = value;
-   return map(exports, buf, 0, "checked", 1);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_modified
- *
- * Description :  CGI function that is called when a file is modified
- *                outside the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  filename = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_modified(struct client_state *csp,
-                          struct http_response *rsp,
-                          const char *filename)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(filename);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, html_encode(filename), 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-modified", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_parse
- *
- * Description :  CGI function that is called when a file cannot
- *                be parsed by the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  file = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_parse(struct client_state *csp,
-                       struct http_response *rsp,
-                       struct editable_file *file)
-{
-   struct map *exports;
-   jb_err err;
-   struct file_line *cur_line;
-
-   assert(csp);
-   assert(rsp);
-   assert(file);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "parse-error", 1, html_encode(file->parse_error_text), 0);
-
-   cur_line = file->parse_error;
-   assert(cur_line);
-
-   if (!err) err = map(exports, "line-raw", 1, html_encode(cur_line->raw), 0);
-   if (!err) err = map(exports, "line-data", 1, html_encode(cur_line->unprocessed), 0);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-parse", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_file
- *
- * Description :  CGI function that is called when a file cannot be
- *                opened by the CGI editor.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  filename = The file that was modified.
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_file(struct client_state *csp,
-                      struct http_response *rsp,
-                      const char *filename)
-{
-   struct map *exports;
-   jb_err err;
-
-   assert(csp);
-   assert(rsp);
-   assert(filename);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, html_encode(filename), 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-file", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_bad_param
- *
- * Description :  CGI function that is called if the parameters
- *                (query string) for a CGI were wrong.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-disabled", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions
- *
- * Description :  CGI function that allows the user to choose which
- *                actions file to edit.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error
- *
- *********************************************************************/
-jb_err cgi_edit_actions(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   /* FIXME: Incomplete */
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   if (enlist_unique_header(rsp->headers, "Location",
-      CGI_PREFIX "edit-actions-list?f=default"))
-   {
-      free(rsp->status);
-      rsp->status = NULL;
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_list
- *
- * Description :  CGI function that edits the actions list.
- *                FIXME: This function shouldn't FATAL ever.
- *                FIXME: This function doesn't check the retval of map()
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : filename
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   if the file cannot be opened or
- *                              contains no data
- *                JB_ERR_CGI_PARAMS if "filename" was not specified
- *                                  or is not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_list(struct client_state *csp,
-                             struct http_response *rsp,
-                             const struct map *parameters)
-{
-   char * section_template;
-   char * url_template;
-   char * sections;
-   char * urls;
-   char buf[50];
-   char * s;
-   struct map * exports;
-   struct map * section_exports;
-   struct map * url_exports;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number = 0;
-   unsigned prev_section_line_number = ((unsigned) (-1));
-   int url_1_2;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 0, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   /* Should do all global exports above this point */
-
-   err = template_load(csp, &section_template, "edit-actions-list-section");
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      if (err == JB_ERR_FILE)
-      {
-         return cgi_error_no_template(csp, rsp, "edit-actions-list-section");
-      }
-      return err;
-   }
-
-   err = template_load(csp, &url_template, "edit-actions-list-url");
-   if (err)
-   {
-      free(section_template);
-      edit_free_file(file);
-      free_map(exports);
-      if (err == JB_ERR_FILE)
-      {
-         return cgi_error_no_template(csp, rsp, "edit-actions-list-url");
-      }
-      return err;
-   }
-
-   err = template_fill(&section_template, exports);
-   if (err)
-   {
-      free(url_template);
-      edit_free_file(file);
-      free_map(exports);
-      free(url_template);
-      return err;
-   }
-
-   err = template_fill(&url_template, exports);
-   if (err)
-   {
-      free(section_template);
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   /* Find start of actions in file */
-   cur_line = file->lines;
-   line_number = 1;
-   while ((cur_line != NULL) && (cur_line->type != FILE_LINE_ACTION))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if (NULL == (sections = strdup("")))
-   {
-      free(section_template);
-      free(url_template);
-      edit_free_file(file);
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   while ((cur_line != NULL) && (cur_line->type == FILE_LINE_ACTION))
-   {
-      if (NULL == (section_exports = new_map()))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      snprintf(buf, 50, "%d", line_number);
-      err = map(section_exports, "s", 1, buf, 1);
-      if (!err) err = map(section_exports, "actions", 1,
-                          actions_to_html(cur_line->data.action), 0);
-
-      if ( (!err)
-        && (cur_line->next != NULL)
-        && (cur_line->next->type == FILE_LINE_URL))
-      {
-         /* This section contains at least one URL, don't allow delete */
-         err = map_block_killer(section_exports, "empty-section");
-      }
-      else
-      {
-         if (!err) err = map_block_keep(section_exports, "empty-section");
-      }
-
-      if (prev_section_line_number != ((unsigned)(-1)))
-      {
-         /* Not last section */
-         snprintf(buf, 50, "%d", prev_section_line_number);
-         if (!err) err = map(section_exports, "s-prev", 1, buf, 1);
-         if (!err) err = map_block_keep(section_exports, "s-prev-exists");
-      }
-      else
-      {
-         /* Last section */
-         if (!err) err = map_block_killer(section_exports, "s-prev-exists");
-      }
-      prev_section_line_number = line_number;
-
-      if (err)
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return err;
-      }
-
-      /* Should do all section-specific exports above this point */
-
-      if (NULL == (urls = strdup("")))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return JB_ERR_MEMORY;
-      }
-
-      url_1_2 = 2;
-
-      cur_line = cur_line->next;
-      line_number++;
-
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL))
-      {
-         if (NULL == (url_exports = new_map()))
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            return JB_ERR_MEMORY;
-         }
-
-         snprintf(buf, 50, "%d", line_number);
-         err = map(url_exports, "p", 1, buf, 1);
-
-         snprintf(buf, 50, "%d", url_1_2);
-         if (!err) err = map(url_exports, "url-1-2", 1, buf, 1);
-
-         if (!err) err = map(url_exports, "url-html", 1,
-                             html_encode(cur_line->unprocessed), 0);
-         if (!err) err = map(url_exports, "url", 1,
-                             url_encode(cur_line->unprocessed), 0);
-
-         if (err)
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            free_map(url_exports);
-            return err;
-         }
-
-         if (NULL == (s = strdup(url_template)))
-         {
-            free(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            free_map(url_exports);
-            return JB_ERR_MEMORY;
-         }
-
-         err = template_fill(&s, section_exports);
-         if (!err) err = template_fill(&s, url_exports);
-         if (!err) err = string_append(&urls, s);
-
-         free_map(url_exports);
-         freez(s);
-
-         if (err)
-         {
-            freez(urls);
-            free(sections);
-            free(section_template);
-            free(url_template);
-            edit_free_file(file);
-            free_map(exports);
-            free_map(section_exports);
-            return err;
-         }
-
-         url_1_2 = 3 - url_1_2;
-
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      err = map(section_exports, "urls", 1, urls, 0);
-
-      /* Could also do section-specific exports here, but it wouldn't be as fast */
-
-      if ( (cur_line != NULL)
-        && (cur_line->type == FILE_LINE_ACTION))
-      {
-         /* Not last section */
-         snprintf(buf, 50, "%d", line_number);
-         if (!err) err = map(section_exports, "s-next", 1, buf, 1);
-         if (!err) err = map_block_keep(section_exports, "s-next-exists");
-      }
-      else
-      {
-         /* Last section */
-         if (!err) err = map_block_killer(section_exports, "s-next-exists");
-      }
-
-      if (err)
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return err;
-      }
-
-      if (NULL == (s = strdup(section_template)))
-      {
-         free(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         free_map(section_exports);
-         return JB_ERR_MEMORY;
-      }
-
-      err = template_fill(&s, section_exports);
-      if (!err) err = string_append(&sections, s);
-
-      freez(s);
-      free_map(section_exports);
-
-      if (err)
-      {
-         freez(sections);
-         free(section_template);
-         free(url_template);
-         edit_free_file(file);
-         free_map(exports);
-         return err;
-      }
-   }
-
-   edit_free_file(file);
-   free(section_template);
-   free(url_template);
-
-   err = map(exports, "sections", 1, sections, 0);
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   /* Could also do global exports here, but it wouldn't be as fast */
-
-   return template_fill_for_cgi(csp, "edit-actions-list", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions
- *
- * Description :  CGI function that edits the Actions list.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_for_url(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters)
-{
-   struct map * exports;
-   unsigned sectionid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   jb_err err;
-   struct file_list *filter_file;
-   struct re_filterfile_spec *filter_group;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != sectionid)
-     || (sectionid < 1)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "f", 1, file->identifier, 1);
-   if (!err) err = map(exports, "v", 1, file->version_str, 1);
-   if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0);
-
-   if (!err) err = actions_to_radio(exports, cur_line->data.action);
-
-   filter_file = csp->rlist;
-   filter_group = ((filter_file != NULL) ? filter_file->f : NULL);
-
-   if (!err) err = map_conditional(exports, "any-filters-defined", (filter_group != NULL));
-
-   if (err)
-   {
-      edit_free_file(file);
-      free_map(exports);
-      return err;
-   }
-
-   if (filter_group == NULL)
-   {
-      err = map(exports, "filter-params", 1, "", 1);
-   }
-   else
-   {
-      /* We have some entries in the filter list */
-      char * result;
-      int index = 0;
-      char * filter_template;
-
-      err = template_load(csp, &filter_template, "edit-actions-for-url-filter");
-      if (err)
-      {
-         edit_free_file(file);
-         free_map(exports);
-         if (err == JB_ERR_FILE)
-         {
-            return cgi_error_no_template(csp, rsp, "edit-actions-for-url-filter");
-         }
-         return err;
-      }
-
-      result = strdup("");
-
-      for (;(!err) && (filter_group != NULL); filter_group = filter_group->next)
-      {
-         char current_mode = 'x';
-         struct list_entry *filter_name;
-         char * this_line;
-         struct map *line_exports;
-         char number[20];
-
-         filter_name = cur_line->data.action->multi_add[ACTION_MULTI_FILTER]->first;
-         while ((filter_name != NULL)
-             && (0 != strcmp(filter_group->name, filter_name->str)))
-         {
-              filter_name = filter_name->next;
-         }
-
-         if (filter_name != NULL)
-         {
-            current_mode = 'y';
-         }
-         else
-         {
-            filter_name = cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]->first;
-            while ((filter_name != NULL)
-                && (0 != strcmp(filter_group->name, filter_name->str)))
-            {
-                 filter_name = filter_name->next;
-            }
-            if (filter_name != NULL)
-            {
-               current_mode = 'n';
-            }
-         }
-
-         /* Generate a unique serial number */
-         snprintf(number, sizeof(number), "%x", index++);
-         number[sizeof(number) - 1] = '\0';
-
-         line_exports = new_map();
-         if (line_exports == NULL)
-         {
-            err = JB_ERR_MEMORY;
-            freez(result);
-         }
-         else
-         {
-            if (!err) err = map(line_exports, "index", 1, number, 1);
-            if (!err) err = map(line_exports, "name",  1, filter_group->name, 1);
-            if (!err) err = map(line_exports, "description",  1, filter_group->description, 1);
-            if (!err) err = map_radio(line_exports, "this-filter", "ynx", current_mode);
-
-            this_line = NULL;
-            if (!err)
-            {
-               this_line = strdup(filter_template);
-               if (this_line == NULL) err = JB_ERR_MEMORY;
-            }
-            if (!err) err = template_fill(&this_line, line_exports);
-            string_join(&result, this_line);
-
-            free_map(line_exports);
-         }
-      }
-      if (!err)
-      {
-         err = map(exports, "filter-params", 1, result, 0);
-      }
-      else
-      {
-         freez(result);
-      }
-   }
-
-   if (!err) err = map_radio(exports, "filter-all", "nx",
-      (cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] ? 'n' : 'x'));
-
-   edit_free_file(file);
-
-   if (err)
-   {
-      free_map(exports);
-      return err;
-   }
-
-   return template_fill_for_cgi(csp, "edit-actions-for-url", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_submit
- *
- * Description :  CGI function that actually edits the Actions list.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_submit(struct client_state *csp,
-                               struct http_response *rsp,
-                               const struct map *parameters)
-{
-   unsigned sectionid;
-   char * actiontext;
-   char * newtext;
-   size_t len;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-   int index;
-   char ch;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   cur_line = file->lines;
-
-   for (line_number = 1; (cur_line != NULL) && (line_number < sectionid); line_number++)
-   {
-      cur_line = cur_line->next;
-   }
-
-   if ( (cur_line == NULL)
-     || (line_number != sectionid)
-     || (sectionid < 1)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = actions_from_radio(parameters, cur_line->data.action);
-   if(err)
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return err;
-   }
-
-   ch = get_char_param(parameters, "filter_all");
-   if (ch == 'N')
-   {
-      list_remove_all(cur_line->data.action->multi_add[ACTION_MULTI_FILTER]);
-      list_remove_all(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]);
-      cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] = 1;
-   }
-   else if (ch == 'X')
-   {
-      cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER] = 0;
-   }
-
-   for (index = 0; !err; index++)
-   {
-      char key_value[30];
-      char key_name[30];
-      const char *name;
-      char value;
-
-      /* Generate the keys */
-      snprintf(key_value, sizeof(key_value), "filter_r%x", index);
-      key_value[sizeof(key_value) - 1] = '\0';
-      snprintf(key_name, sizeof(key_name), "filter_n%x", index);
-      key_name[sizeof(key_name) - 1] = '\0';
-
-      err = get_string_param(parameters, key_name, &name);
-      if (err) break;
-
-      if (name == NULL)
-      {
-         /* End of list */
-         break;
-      }
-
-
-      value = get_char_param(parameters, key_value);
-      if (value == 'Y')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         if (!err) err = enlist(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-      }
-      else if (value == 'N')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         if (!cur_line->data.action->multi_remove_all[ACTION_MULTI_FILTER])
-         {
-            list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-            if (!err) err = enlist(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-         }
-      }
-      else if (value == 'X')
-      {
-         list_remove_item(cur_line->data.action->multi_add[ACTION_MULTI_FILTER], name);
-         list_remove_item(cur_line->data.action->multi_remove[ACTION_MULTI_FILTER], name);
-      }
-   }
-
-   if(err)
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return err;
-   }
-
-   if (NULL == (actiontext = actions_to_text(cur_line->data.action)))
-   {
-      /* Out of memory */
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   len = strlen(actiontext);
-   if (len == 0)
-   {
-      /*
-       * Empty action - must special-case this.
-       * Simply setting len to 1 is sufficient...
-       */
-      len = 1;
-   }
-
-   if (NULL == (newtext = malloc(len + 2)))
-   {
-      /* Out of memory */
-      free(actiontext);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-   strcpy(newtext, actiontext);
-   free(actiontext);
-   newtext[0]       = '{';
-   newtext[len]     = '}';
-   newtext[len + 1] = '\0';
-
-   freez(cur_line->raw);
-   freez(cur_line->unprocessed);
-   cur_line->unprocessed = newtext;
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_url
- *
- * Description :  CGI function that actually edits a URL pattern in
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *    filename : Identifies the file to edit
- *         ver : File's last-modified time
- *     section : Line number of section to edit
- *     pattern : Line number of pattern to edit
- *      newval : New value for pattern
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_url(struct client_state *csp,
-                            struct http_response *rsp,
-                            const struct map *parameters)
-{
-   unsigned patternid;
-   char * new_pattern;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-   if (patternid < 1U)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = get_url_spec_param(csp, parameters, "u", &new_pattern);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      free(new_pattern);
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < patternid))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to edit is in cur_line */
-
-   freez(cur_line->raw);
-   freez(cur_line->unprocessed);
-   cur_line->unprocessed = new_pattern;
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_add_url
- *
- * Description :  CGI function that actually adds a URL pattern to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *    filename : Identifies the file to edit
- *         ver : File's last-modified time
- *     section : Line number of section to edit
- *      newval : New pattern
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_add_url(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters)
-{
-   unsigned sectionid;
-   char * new_pattern;
-   struct file_line * new_line;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-   if (sectionid < 1U)
-   {
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   err = get_url_spec_param(csp, parameters, "u", &new_pattern);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      free(new_pattern);
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < sectionid))
-   {
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION))
-   {
-      /* Invalid "sectionid" parameter */
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the section header is in cur_line - add after this. */
-
-   /* Allocate the new line */
-   new_line = (struct file_line *)zalloc(sizeof(*new_line));
-   if (new_line == NULL)
-   {
-      free(new_pattern);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Fill in the data members of the new line */
-   new_line->raw = NULL;
-   new_line->prefix = NULL;
-   new_line->unprocessed = new_pattern;
-   new_line->type = FILE_LINE_URL;
-
-   /* Link new_line into the list, after cur_line */
-   new_line->next = cur_line->next;
-   cur_line->next = new_line;
-
-   /* Done making changes, now commit */
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_remove_url
- *
- * Description :  CGI function that actually removes a URL pattern from
- *                the actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           p : (pattern) Line number of pattern to remove
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_remove_url(struct client_state *csp,
-                                   struct http_response *rsp,
-                                   const struct map *parameters)
-{
-   unsigned patternid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "p", &patternid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   prev_line = NULL;
-   cur_line = file->lines;
-
-   while ((cur_line != NULL) && (line_number < patternid))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (prev_line == NULL)
-     || (cur_line->type != FILE_LINE_URL))
-   {
-      /* Invalid "patternid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to remove is in cur_line, and the previous
-    * one is in prev_line
-    */
-
-   /* Unlink cur_line */
-   prev_line->next = cur_line->next;
-   cur_line->next = NULL;
-
-   /* Free cur_line */
-   edit_free_file_lines(cur_line);
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_remove
- *
- * Description :  CGI function that actually removes a whole section from
- *                the actions file.  The section must be empty first
- *                (else JB_ERR_CGI_PARAMS).
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to edit
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_remove(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters)
-{
-   unsigned sectionid;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   prev_line = NULL;
-   while ((cur_line != NULL) && (line_number < sectionid))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION) )
-   {
-      /* Invalid "sectionid" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   if ( (cur_line->next != NULL)
-     && (cur_line->next->type == FILE_LINE_URL) )
-   {
-      /* Section not empty. */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* At this point, the line to remove is in cur_line, and the previous
-    * one is in prev_line
-    */
-
-   /* Unlink cur_line */
-   if (prev_line == NULL)
-   {
-      /* Removing the first line from the file */
-      file->lines = cur_line->next;
-   }
-   else
-   {
-      prev_line->next = cur_line->next;
-   }
-   cur_line->next = NULL;
-
-   /* Free cur_line */
-   edit_free_file_lines(cur_line);
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_add
- *
- * Description :  CGI function that adds a new empty section to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *           s : (section) Line number of section to add after, 0 for
- *               start of file.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_add(struct client_state *csp,
-                                    struct http_response *rsp,
-                                    const struct map *parameters)
-{
-   unsigned sectionid;
-   struct file_line * new_line;
-   char * new_text;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s", &sectionid);
-   if (err)
-   {
-      return err;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   line_number = 1;
-   cur_line = file->lines;
-
-   if (sectionid < 1U)
-   {
-      /* Add to start of file */
-      if (cur_line != NULL)
-      {
-         /* There's something in the file, find the line before the first
-          * action.
-          */
-         while ( (cur_line->next != NULL)
-              && (cur_line->next->type != FILE_LINE_ACTION) )
-         {
-            cur_line = cur_line->next;
-            line_number++;
-         }
-      }
-   }
-   else
-   {
-      /* Add after stated section. */
-      while ((cur_line != NULL) && (line_number < sectionid))
-      {
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      if ( (cur_line == NULL)
-        || (cur_line->type != FILE_LINE_ACTION))
-      {
-         /* Invalid "sectionid" parameter */
-         edit_free_file(file);
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      /* Skip through the section to find the last line in it. */
-      while ( (cur_line->next != NULL)
-           && (cur_line->next->type != FILE_LINE_ACTION) )
-      {
-         cur_line = cur_line->next;
-         line_number++;
-      }
-   }
-
-   /* At this point, the last line in the previous section is in cur_line
-    * - add after this.  (Or if we need to add as the first line, cur_line
-    * will be NULL).
-    */
-
-   new_text = strdup("{}");
-   if (NULL == new_text)
-   {
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Allocate the new line */
-   new_line = (struct file_line *)zalloc(sizeof(*new_line));
-   if (new_line == NULL)
-   {
-      free(new_text);
-      edit_free_file(file);
-      return JB_ERR_MEMORY;
-   }
-
-   /* Fill in the data members of the new line */
-   new_line->raw = NULL;
-   new_line->prefix = NULL;
-   new_line->unprocessed = new_text;
-   new_line->type = FILE_LINE_ACTION;
-
-   if (cur_line != NULL)
-   {
-      /* Link new_line into the list, after cur_line */
-      new_line->next = cur_line->next;
-      cur_line->next = new_line;
-   }
-   else
-   {
-      /* Link new_line into the list, as first line */
-      new_line->next = file->lines;
-      file->lines = new_line;
-   }
-
-   /* Done making changes, now commit */
-
-   err = edit_write_file(file);
-   if (err)
-   {
-      /* Error writing file */
-      edit_free_file(file);
-      return err;
-   }
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_edit_actions_section_swap
- *
- * Description :  CGI function that swaps the order of two sections
- *                in the actions file.  Note that this CGI can actually
- *                swap any two arbitrary sections, but the GUI interface
- *                currently only allows consecutive sections to be
- *                specified.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           f : (filename) Identifies the file to edit
- *           v : (version) File's last-modified time
- *          s1 : (section1) Line number of first section to swap
- *          s2 : (section2) Line number of second section to swap
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_CGI_PARAMS if the CGI parameters are not
- *                                  specified or not valid.
- *
- *********************************************************************/
-jb_err cgi_edit_actions_section_swap(struct client_state *csp,
-                                     struct http_response *rsp,
-                                     const struct map *parameters)
-{
-   unsigned section1;
-   unsigned section2;
-   struct editable_file * file;
-   struct file_line * cur_line;
-   struct file_line * prev_line;
-   struct file_line * line_before_section1;
-   struct file_line * line_start_section1;
-   struct file_line * line_end_section1;
-   struct file_line * line_after_section1;
-   struct file_line * line_before_section2;
-   struct file_line * line_start_section2;
-   struct file_line * line_end_section2;
-   struct file_line * line_after_section2;
-   unsigned line_number;
-   char * target;
-   jb_err err;
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   err = get_number_param(csp, parameters, "s1", &section1);
-   if (!err) err = get_number_param(csp, parameters, "s2", &section2);
-   if (err)
-   {
-      return err;
-   }
-
-   if (section1 > section2)
-   {
-      unsigned temp = section2;
-      section2 = section1;
-      section1 = temp;
-   }
-
-   err = edit_read_actions_file(csp, rsp, parameters, 1, &file);
-   if (err)
-   {
-      /* No filename specified, can't read file, modified, or out of memory. */
-      return (err == JB_ERR_FILE ? JB_ERR_OK : err);
-   }
-
-   /* Start at the beginning... */
-   line_number = 1;
-   cur_line = file->lines;
-   prev_line = NULL;
-
-   /* ... find section1 ... */
-   while ((cur_line != NULL) && (line_number < section1))
-   {
-      prev_line = cur_line;
-      cur_line = cur_line->next;
-      line_number++;
-   }
-
-   if ( (cur_line == NULL)
-     || (cur_line->type != FILE_LINE_ACTION) )
-   {
-      /* Invalid "section1" parameter */
-      edit_free_file(file);
-      return JB_ERR_CGI_PARAMS;
-   }
-
-   /* If no-op, we've validated params and can skip the rest. */
-   if (section1 != section2)
-   {
-      /* ... find the end of section1 ... */
-      line_before_section1 = prev_line;
-      line_start_section1 = cur_line;
-      do
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL));
-      line_end_section1 = prev_line;
-      line_after_section1 = cur_line;
-
-      /* ... find section2 ... */
-      while ((cur_line != NULL) && (line_number < section2))
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-
-      if ( (cur_line == NULL)
-        || (cur_line->type != FILE_LINE_ACTION) )
-      {
-         /* Invalid "section2" parameter */
-         edit_free_file(file);
-         return JB_ERR_CGI_PARAMS;
-      }
-
-      /* ... find the end of section2 ... */
-      line_before_section2 = prev_line;
-      line_start_section2 = cur_line;
-      do
-      {
-         prev_line = cur_line;
-         cur_line = cur_line->next;
-         line_number++;
-      }
-      while ((cur_line != NULL) && (cur_line->type == FILE_LINE_URL));
-      line_end_section2 = prev_line;
-      line_after_section2 = cur_line;
-
-      /* Now have all the pointers we need. Do the swap. */
-
-      /* Change the pointer to section1 to point to section2 instead */
-      if (line_before_section1 == NULL)
-      {
-         file->lines = line_start_section2;
-      }
-      else
-      {
-         line_before_section1->next = line_start_section2;
-      }
-
-      if (line_before_section2 == line_end_section1)
-      {
-         /* Consecutive sections */
-         line_end_section2->next = line_start_section1;
-      }
-      else
-      {
-         line_end_section2->next = line_after_section1;
-         line_before_section2->next = line_start_section1;
-      }
-
-      /* Set the pointer from the end of section1 to the rest of the file */
-      line_end_section1->next = line_after_section2;
-
-      err = edit_write_file(file);
-      if (err)
-      {
-         /* Error writing file */
-         edit_free_file(file);
-         return err;
-      }
-   } /* END if (section1 != section2) */
-
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-
-   edit_free_file(file);
-
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_toggle
- *
- * Description :  CGI function that adds a new empty section to
- *                an actions file.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *         set : If present, how to change toggle setting:
- *               "enable", "disable", "toggle", or none (default).
- *        mini : If present, use mini reply template.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-jb_err cgi_toggle(struct client_state *csp,
-                  struct http_response *rsp,
-                  const struct map *parameters)
-{
-   struct map *exports;
-   char mode;
-   const char *template_name;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_TOGGLE))
-   {
-      return cgi_error_disabled(csp, rsp);
-   }
-
-   mode = get_char_param(parameters, "set");
-
-   if (mode == 'E')
-   {
-      /* Enable */
-      g_bToggleIJB = 1;
-   }
-   else if (mode == 'D')
-   {
-      /* Disable */
-      g_bToggleIJB = 0;
-   }
-   else if (mode == 'T')
-   {
-      /* Toggle */
-      g_bToggleIJB = !g_bToggleIJB;
-   }
-
-   if (NULL == (exports = default_exports(csp, "toggle")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   template_name = (get_char_param(parameters, "mini")
-                 ? "toggle-mini"
-                 : "toggle");
-
-   return template_fill_for_cgi(csp, template_name, exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  javascriptify
- *
- * Description :  Converts a string into a form JavaScript will like.
- *
- *                Netscape 4's JavaScript sucks - it doesn't use 
- *                "id" parameters, so you have to set the "name"
- *                used to submit a form element to something JavaScript
- *                will like.  (Or access the elements by index in an
- *                array.  That array contains >60 elements and will
- *                be changed whenever we add a new action to the
- *                editor, so I'm NOT going to use indexes that have
- *                to be figured out by hand.)
- *
- *                Currently the only thing we have to worry about
- *                is "-" ==> "_" conversion.
- *
- *                This is a length-preserving operation so it is
- *                carried out in-place, no memory is allocated
- *                or freed.
- *
- * Parameters  :
- *          1  :  identifier = String to make JavaScript-friendly.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void javascriptify(char * identifier)
-{
-   char * p = identifier;
-   while (NULL != (p = strchr(p, '-')))
-   {
-      *p++ = '_';
-   }
-}
-
-
-/*********************************************************************
- *
- * Function    :  actions_to_radio
- *
- * Description :  Converts a actionsfile entry into settings for
- *                radio buttons and edit boxes on a HTML form.
- *
- * Parameters  :
- *          1  :  exports = List of substitutions to add to.
- *          2  :  action  = Action to read
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err actions_to_radio(struct map * exports,
-                               const struct action_spec *action)
-{
-   unsigned mask = action->mask;
-   unsigned add  = action->add;
-   int mapped_param;
-   int checked;
-   char current_mode;
-
-   assert(exports);
-   assert(action);
-
-   mask = action->mask;
-   add  = action->add;
-
-   /* sanity - prevents "-feature +feature" */
-   mask |= add;
-
-
-#define DEFINE_ACTION_BOOL(name, bit)                 \
-   if (!(mask & bit))                                 \
-   {                                                  \
-      current_mode = 'n';                             \
-   }                                                  \
-   else if (add & bit)                                \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      current_mode = 'x';                             \
-   }                                                  \
-   if (map_radio(exports, name, "ynx", current_mode)) \
-   {                                                  \
-      return JB_ERR_MEMORY;                           \
-   }
-
-#define DEFINE_ACTION_STRING(name, bit, index)        \
-   DEFINE_ACTION_BOOL(name, bit);                     \
-   mapped_param = 0;
-
-#define DEFINE_CGI_PARAM_RADIO(name, bit, index, value, is_default)  \
-   if (add & bit)                                                    \
-   {                                                                 \
-      checked = !strcmp(action->string[index], value);               \
-   }                                                                 \
-   else                                                              \
-   {                                                                 \
-      checked = is_default;                                          \
-   }                                                                 \
-   mapped_param |= checked;                                          \
-   if (map(exports, name "-param-" value, 1, (checked ? "checked" : ""), 1)) \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_CGI_PARAM_CUSTOM(name, bit, index, default_val)       \
-   if (map(exports, name "-param-custom", 1,                         \
-           ((!mapped_param) ? "checked" : ""), 1))                   \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }                                                                 \
-   if (map(exports, name "-param", 1,                                \
-           (((add & bit) && !mapped_param) ?                         \
-           action->string[index] : default_val), 1))                 \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_CGI_PARAM_NO_RADIO(name, bit, index, default_val)     \
-   if (map(exports, name "-param", 1,                                \
-           ((add & bit) ? action->string[index] : default_val), 1))  \
-   {                                                                 \
-      return JB_ERR_MEMORY;                                          \
-   }
-
-#define DEFINE_ACTION_MULTI(name, index)              \
-   if (action->multi_add[index]->first)               \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else if (action->multi_remove_all[index])          \
-   {                                                  \
-      current_mode = 'n';                             \
-   }                                                  \
-   else if (action->multi_remove[index]->first)       \
-   {                                                  \
-      current_mode = 'y';                             \
-   }                                                  \
-   else                                               \
-   {                                                  \
-      current_mode = 'x';                             \
-   }                                                  \
-   if (map_radio(exports, name, "ynx", current_mode)) \
-   {                                                  \
-      return JB_ERR_MEMORY;                           \
-   }
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for output */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef DEFINE_CGI_PARAM_CUSTOM
-#undef DEFINE_CGI_PARAM_RADIO
-#undef DEFINE_CGI_PARAM_NO_RADIO
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  actions_from_radio
- *
- * Description :  Converts a map of parameters passed to a CGI function
- *                into an actionsfile entry.
- *
- * Parameters  :
- *          1  :  parameters = parameters to the CGI call
- *          2  :  action  = Action to change.  Must be valid before
- *                          the call, actions not specified will be
- *                          left unchanged.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *
- *********************************************************************/
-static jb_err actions_from_radio(const struct map * parameters,
-                                 struct action_spec *action)
-{
-   static int first_time = 1;
-   const char * param;
-   char * param_dup;
-   char ch;
-   const char * js_name;
-   jb_err err = JB_ERR_OK;
-
-   assert(parameters);
-   assert(action);
-
-   /* Statics are generally a potential race condition,
-    * but in this case we're safe and don't need semaphores.
-    * Be careful if you modify this function.
-    * - Jon
-    */
-
-#define JAVASCRIPTIFY(dest_var, string)               \
-   {                                                  \
-      static char js_name_arr[] = string;             \
-      if (first_time)                                 \
-      {                                               \
-         javascriptify(js_name_arr);                  \
-      }                                               \
-      dest_var = js_name_arr;                         \
-   }                                                  \
-
-#define DEFINE_ACTION_BOOL(name, bit)                 \
-   JAVASCRIPTIFY(js_name, name);                      \
-   ch = get_char_param(parameters, js_name);          \
-   if (ch == 'Y')                                     \
-   {                                                  \
-      action->add  |= bit;                            \
-      action->mask |= bit;                            \
-   }                                                  \
-   else if (ch == 'N')                                \
-   {                                                  \
-      action->add  &= ~bit;                           \
-      action->mask &= ~bit;                           \
-   }                                                  \
-   else if (ch == 'X')                                \
-   {                                                  \
-      action->add  &= ~bit;                           \
-      action->mask |= bit;                            \
-   }                                                  \
-
-#define DEFINE_ACTION_STRING(name, bit, index)                 \
-   JAVASCRIPTIFY(js_name, name);                               \
-   ch = get_char_param(parameters, js_name);                   \
-   if (ch == 'Y')                                              \
-   {                                                           \
-      param = NULL;                                            \
-      JAVASCRIPTIFY(js_name, name "-mode");                    \
-      if (!err) err = get_string_param(parameters, js_name, &param);    \
-      if ((param == NULL) || (0 == strcmp(param, "CUSTOM")))            \
-      {                                                                 \
-         JAVASCRIPTIFY(js_name, name "-param");                         \
-         if (!err) err = get_string_param(parameters, js_name, &param); \
-      }                                                        \
-      if (param != NULL)                                       \
-      {                                                        \
-         if (NULL == (param_dup = strdup(param)))              \
-         {                                                     \
-            return JB_ERR_MEMORY;                              \
-         }                                                     \
-         freez(action->string[index]);                         \
-         action->add  |= bit;                                  \
-         action->mask |= bit;                                  \
-         action->string[index] = param_dup;                    \
-      }                                                        \
-   }                                                           \
-   else if (ch == 'N')                                         \
-   {                                                           \
-      if (action->add & bit)                                   \
-      {                                                        \
-         freez(action->string[index]);                         \
-      }                                                        \
-      action->add  &= ~bit;                                    \
-      action->mask &= ~bit;                                    \
-   }                                                           \
-   else if (ch == 'X')                                         \
-   {                                                           \
-      if (action->add & bit)                                   \
-      {                                                        \
-         freez(action->string[index]);                         \
-      }                                                        \
-      action->add  &= ~bit;                                    \
-      action->mask |= bit;                                     \
-   }                                                           \
-
-#define DEFINE_ACTION_MULTI(name, index)                       \
-   JAVASCRIPTIFY(js_name, name);                               \
-   ch = get_char_param(parameters, js_name);                   \
-   if (ch == 'Y')                                              \
-   {                                                           \
-      /* FIXME */                                              \
-   }                                                           \
-   else if (ch == 'N')                                         \
-   {                                                           \
-      list_remove_all(action->multi_add[index]);               \
-      list_remove_all(action->multi_remove[index]);            \
-      action->multi_remove_all[index] = 1;                     \
-   }                                                           \
-   else if (ch == 'X')                                         \
-   {                                                           \
-      list_remove_all(action->multi_add[index]);               \
-      list_remove_all(action->multi_remove[index]);            \
-      action->multi_remove_all[index] = 0;                     \
-   }                                                           \
-
-#define DEFINE_ACTION_ALIAS 0 /* No aliases for URL parsing */
-
-#include "actionlist.h"
-
-#undef DEFINE_ACTION_MULTI
-#undef DEFINE_ACTION_STRING
-#undef DEFINE_ACTION_BOOL
-#undef DEFINE_ACTION_ALIAS
-#undef JAVASCRIPTIFY
-
-   first_time = 0;
-
-   return err;
-}
-
-
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgiedit.h b/cgiedit.h
deleted file mode 100644 (file)
index 72721c2..0000000
--- a/cgiedit.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef CGIEDIT_H_INCLUDED
-#define CGIEDIT_H_INCLUDED
-#define CGIEDIT_H_VERSION "$Id: cgiedit.h,v 1.6 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgiedit.h,v $
- *
- * Purpose     :  CGI-based actionsfile editor.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgiedit.h,v $
- *    Revision 1.6  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.5  2002/01/22 23:24:48  jongfoster
- *    Adding edit-actions-section-swap
- *
- *    Revision 1.4  2001/11/13 00:28:51  jongfoster
- *    Adding new CGIs for use by non-JavaScript browsers:
- *      edit-actions-url-form
- *      edit-actions-add-url-form
- *      edit-actions-remove-url-form
- *
- *    Revision 1.3  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.2  2001/10/14 22:12:49  jongfoster
- *    New version of CGI-based actionsfile editor.
- *    Major changes, including:
- *    - Completely new file parser and file output routines
- *    - edit-actions CGI renamed edit-actions-for-url
- *    - All CGIs now need a filename parameter, except for...
- *    - New CGI edit-actions which doesn't need a filename,
- *      to allow you to start the editor up.
- *    - edit-actions-submit now works, and now automatically
- *      redirects you back to the main edit-actions-list handler.
- *
- *    Revision 1.1  2001/09/16 15:47:37  jongfoster
- *    First version of CGI-based edit interface.  This is very much a
- *    work-in-progress, and you can't actually use it to edit anything
- *    yet.  You must #define FEATURE_CGI_EDIT_ACTIONS for these changes
- *    to have any effect.
- *
- *
- **********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * CGI functions
- */
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-extern jb_err cgi_edit_actions        (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_for_url(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_list   (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_submit (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_url    (struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_url_form(struct client_state *csp,
-                                        struct http_response *rsp,
-                                        const struct map *parameters);
-extern jb_err cgi_edit_actions_add_url(struct client_state *csp,
-                                       struct http_response *rsp,
-                                       const struct map *parameters);
-extern jb_err cgi_edit_actions_add_url_form(struct client_state *csp,
-                                            struct http_response *rsp,
-                                            const struct map *parameters);
-extern jb_err cgi_edit_actions_remove_url    (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_remove_url_form(struct client_state *csp,
-                                            struct http_response *rsp,
-                                            const struct map *parameters);
-extern jb_err cgi_edit_actions_section_remove(struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_section_add   (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_edit_actions_section_swap  (struct client_state *csp,
-                                              struct http_response *rsp,
-                                              const struct map *parameters);
-extern jb_err cgi_toggle(struct client_state *csp,
-                         struct http_response *rsp,
-                         const struct map *parameters);
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char cgiedit_rcs[];
-extern const char cgiedit_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef CGI_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgisimple.c b/cgisimple.c
deleted file mode 100644 (file)
index 733c350..0000000
+++ /dev/null
@@ -1,1303 +0,0 @@
-const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.22 2002/03/24 16:18:15 jongfoster Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.c,v $
- *
- * Purpose     :  Simple CGIs to get information about Privoxy's
- *                status.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgisimple.c,v $
- *    Revision 1.22  2002/03/24 16:18:15  jongfoster
- *    Removing old logo
- *
- *    Revision 1.21  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.20  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.19  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.18  2002/03/12 01:44:49  oes
- *    Changed default for "blocked" image from jb logo to checkboard pattern
- *
- *    Revision 1.17  2002/03/08 16:43:18  oes
- *    Added choice beween GIF and PNG built-in images
- *
- *    Revision 1.16  2002/03/07 03:48:38  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.15  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.14  2002/03/02 04:14:50  david__schmidt
- *    Clean up a little CRLF unpleasantness that suddenly appeared
- *
- *    Revision 1.13  2002/02/21 00:10:37  jongfoster
- *    Adding send-banner?type=auto option
- *
- *    Revision 1.12  2002/01/23 01:03:32  jongfoster
- *    Fixing gcc [CygWin] compiler warnings
- *
- *    Revision 1.11  2002/01/23 00:01:04  jongfoster
- *    Adding cgi_transparent_gif() for http://i.j.b/t
- *    Adding missing html_encode() to many CGI functions.
- *    Adding urlmatch.[ch] to http://i.j.b/show-version
- *
- *    Revision 1.10  2002/01/17 21:10:37  jongfoster
- *    Changes to cgi_show_url_info to use new matching code from urlmatch.c.
- *    Also fixing a problem in the same function with improperly quoted URLs
- *    in output HTML, and adding code to handle https:// URLs correctly.
- *
- *    Revision 1.9  2001/11/30 23:09:15  jongfoster
- *    Now reports on FEATURE_CGI_EDIT_ACTIONS
- *    Removing FEATURE_DENY_GZIP from template
- *
- *    Revision 1.8  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.7  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.6  2001/10/14 22:00:32  jongfoster
- *    Adding support for a 404 error when an invalid CGI page is requested.
- *
- *    Revision 1.5  2001/10/07 15:30:41  oes
- *    Removed FEATURE_DENY_GZIP
- *
- *    Revision 1.4  2001/10/02 15:31:12  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.3  2001/09/22 16:34:44  jongfoster
- *    Removing unneeded #includes
- *
- *    Revision 1.2  2001/09/19 18:01:11  oes
- *    Fixed comments; cosmetics
- *
- *    Revision 1.1  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <string.h>
-#include <assert.h>
-
-#ifdef _WIN32
-#define snprintf _snprintf
-#endif /* def _WIN32 */
-
-#include "project.h"
-#include "cgi.h"
-#include "cgisimple.h"
-#include "list.h"
-#include "encode.h"
-#include "jcc.h"
-#include "filters.h"
-#include "actions.h"
-#include "miscutil.h"
-#include "loadcfg.h"
-#include "parsers.h"
-#include "urlmatch.h"
-
-const char cgisimple_h_rcs[] = CGISIMPLE_H_VERSION;
-
-
-static char *show_rcs(void);
-static jb_err show_defines(struct map *exports);
-
-
-/*********************************************************************
- *
- * Function    :  cgi_default
- *
- * Description :  CGI function that is called if no action was given.
- *                Lists menu of available unhidden CGIs.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory
- *                (Problems other than out-of-memory should be
- *                handled by this routine - it should set the
- *                rsp appropriately and return "success")
- *
- *********************************************************************/
-jb_err cgi_default(struct client_state *csp,
-                   struct http_response *rsp,
-                   const struct map *parameters)
-{
-   char *tmp;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /* If there were other parameters, export a dump as "cgi-parameters" */
-   if (parameters->first)
-   {
-      tmp = strdup("<p>What made you think this cgi takes parameters?\n"
-                   "Anyway, here they are, in case you're interested:</p>\n");
-      string_join(&tmp, dump_map(parameters));
-      if (tmp == NULL)
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      if (map(exports, "cgi-parameters", 1, tmp, 0))
-      {
-         return JB_ERR_MEMORY;
-      }
-   }
-   else
-   {
-      if (map(exports, "cgi-parameters", 1, "", 1))
-      {
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   return template_fill_for_cgi(csp, "default", exports, rsp);
-}
-
-
-
-
-/*********************************************************************
- *
- * Function    :  cgi_error_404
- *
- * Description :  CGI function that is called if an unknown action was
- *                given.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_error_404(struct client_state *csp,
-                     struct http_response *rsp,
-                     const struct map *parameters)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("404 Privoxy configuration page not found");
-   if (rsp->status == NULL)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-404", exports, rsp);
-}
-
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  cgi_die
- *
- * Description :  CGI function to shut down Privoxy.
- *                NOTE: Turning this on in a production build
- *                would be a BAD idea.  An EXTREMELY BAD idea.
- *                In short, don't do it.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_die (struct client_state *csp,
-                struct http_response *rsp,
-                const struct map *parameters)
-{
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   /* quit */
-   g_terminate = 1;
-
-   /*
-    * I don't really care what gets sent back to the browser.
-    * Take the easy option - "out of memory" page.
-    */
-
-   return JB_ERR_MEMORY;
-}
-#endif /* def FEATURE_GRACEFUL_TERMINATION */
-
-
-/*********************************************************************
- *
- * Function    :  cgi_show_request
- *
- * Description :  Show the client's request and what sed() would have
- *                made of it.
- *               
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_request(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-   char *p;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-request")))
-   {
-      return JB_ERR_MEMORY;
-   }
-   
-   /*
-    * Repair the damage done to the IOB by get_header()
-    */
-   for (p = csp->iob->buf; p < csp->iob->eod; p++)
-   {
-      if (*p == '\0') *p = '\n';
-   }
-
-   /*
-    * Export the original client's request and the one we would
-    * be sending to the server if this wasn't a CGI call
-    */
-
-   if (map(exports, "client-request", 1, html_encode(csp->iob->buf), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   if (map(exports, "processed-request", 1, html_encode_and_free_original(
-      sed(client_patterns, add_client_headers, csp)), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-request", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_send_banner
- *
- * Description :  CGI function that returns a banner. 
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *           type : Selects the type of banner between "trans", "logo",
- *                  and "auto". Defaults to "logo" if absent or invalid.
- *                  "auto" means to select as if we were image-blocking.
- *                  (Only the first character really counts).
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_send_banner(struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters)
-{
-   char imagetype = lookup(parameters, "type")[0];
-
-   if (imagetype == 'a') /* auto */
-   {
-      /* Default to pattern */
-      imagetype = 'p';
-#ifdef FEATURE_IMAGE_BLOCKING
-      if ((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0)
-      {
-         /* determine HOW images should be blocked */
-         const char * p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
-
-         /* and handle accordingly: */
-         if ((p != NULL) && (0 == strcmpic(p, "blank")))
-         {
-            imagetype = 'b';
-         }
-         else if ((p != NULL) && (0 == strcmpic(p, "pattern")))
-         {
-            imagetype = 'p';
-         }
-      }
-#endif /* def FEATURE_IMAGE_BLOCKING */
-   }
-      
-   if ((imagetype == 'b') || (imagetype == 't')) /* blank / transparent */
-   {
-      rsp->body = bindup(image_blank_data, image_blank_length);
-      rsp->content_length = image_blank_length;
-
-   }
-   else /* pattern */
-   {
-      rsp->body = bindup(image_pattern_data, image_pattern_length);
-      rsp->content_length = image_pattern_length;
-   }   
-
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->is_static = 1;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_transparent_image
- *
- * Description :  CGI function that sends a 1x1 transparent image.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_transparent_image(struct client_state *csp,
-                           struct http_response *rsp,
-                           const struct map *parameters)
-{
-   rsp->body = bindup(image_blank_data, image_blank_length);
-   rsp->content_length = image_blank_length;
-
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->is_static = 1;
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_show_version
- *
- * Description :  CGI function that returns a a web page describing the
- *                file versions of Privoxy.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_version(struct client_state *csp,
-                        struct http_response *rsp,
-                        const struct map *parameters)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-version")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (map(exports, "sourceversions", 1, show_rcs(), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-version", exports, rsp);
-}
-
-/*********************************************************************
- *
- * Function    :  cgi_show_status
- *
- * Description :  CGI function that returns a a web page describing the
- *                current status of Privoxy.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *        file :  Which file to show.  Only first letter is checked,
- *                valid values are:
- *                - "p"ermissions (actions) file
- *                - "r"egex
- *                - "t"rust
- *                Default is to show menu and other information.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_status(struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters)
-{
-   char *s = NULL;
-   int i;
-
-   FILE * fp;
-   char buf[BUFFER_SIZE];
-   const char * filename = NULL;
-   char * file_description = NULL;
-#ifdef FEATURE_STATISTICS
-   float perc_rej;   /* Percentage of http requests rejected */
-   int local_urls_read;
-   int local_urls_rejected;
-#endif /* ndef FEATURE_STATISTICS */
-   jb_err err;
-
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-status")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   switch (*(lookup(parameters, "file")))
-   {
-   case 'p':
-      if (csp->actions_list)
-      {
-         filename = csp->actions_list->filename;
-         file_description = "Actions List";
-      }
-      break;
-
-   case 'r':
-      if (csp->rlist)
-      {
-         filename = csp->rlist->filename;
-         file_description = "Regex Filter List";
-      }
-      break;
-
-#ifdef FEATURE_TRUST
-   case 't':
-      if (csp->tlist)
-      {
-         filename = csp->tlist->filename;
-         file_description = "Trust List";
-      }
-      break;
-#endif /* def FEATURE_TRUST */
-   }
-
-   if (NULL != filename)
-   {
-      if ( map(exports, "file-description", 1, file_description, 1)
-        || map(exports, "filepath", 1, html_encode(filename), 0) )
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if ((fp = fopen(filename, "r")) == NULL)
-      {
-         if (map(exports, "content", 1, "<h1>ERROR OPENING FILE!</h1>", 1))
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-      else
-      {
-         s = strdup("");
-         while ((s != NULL) && fgets(buf, sizeof(buf), fp))
-         {
-            string_join  (&s, html_encode(buf));
-            string_append(&s, "<br>");
-         }
-         fclose(fp);
-
-         if (map(exports, "contents", 1, s, 0))
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-
-      return template_fill_for_cgi(csp, "show-status-file", exports, rsp);
-   }
-
-   if (map(exports, "redirect-url", 1, html_encode(REDIRECT_URL), 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-   
-   s = strdup("");
-   for (i = 0; (s != NULL) && (i < Argc); i++)
-   {
-      string_join  (&s, html_encode(Argv[i]));
-      string_append(&s, " ");
-   }
-   if (map(exports, "invocation", 1, s, 0))
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   err = map(exports, "options", 1, csp->config->proxy_args, 1);
-   if (!err) err = show_defines(exports);
-
-#ifdef FEATURE_STATISTICS
-   local_urls_read     = urls_read;
-   local_urls_rejected = urls_rejected;
-
-   /*
-    * Need to alter the stats not to include the fetch of this
-    * page.
-    *
-    * Can't do following thread safely! doh!
-    *
-    * urls_read--;
-    * urls_rejected--; * This will be incremented subsequently *
-    */
-
-   if (local_urls_read == 0)
-   {
-      if (!err) err = map_block_killer(exports, "have-stats");
-   }
-   else
-   {
-      if (!err) err = map_block_killer(exports, "have-no-stats");
-
-      perc_rej = (float)local_urls_rejected * 100.0F /
-            (float)local_urls_read;
-
-      sprintf(buf, "%d", local_urls_read);
-      if (!err) err = map(exports, "requests-received", 1, buf, 1);
-
-      sprintf(buf, "%d", local_urls_rejected);
-      if (!err) err = map(exports, "requests-blocked", 1, buf, 1);
-
-      sprintf(buf, "%6.2f", perc_rej);
-      if (!err) err = map(exports, "percent-blocked", 1, buf, 1);
-   }
-
-#else /* ndef FEATURE_STATISTICS */
-   err = err || map_block_killer(exports, "statistics");
-#endif /* ndef FEATURE_STATISTICS */
-
-   if (csp->actions_list)
-   {
-      if (!err) err = map(exports, "actions-filename", 1, html_encode(csp->actions_list->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "actions-filename", 1, "None specified", 1);
-   }
-
-   if (csp->rlist)
-   {
-      if (!err) err = map(exports, "re-filter-filename", 1, html_encode(csp->rlist->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "re-filter-filename", 1, "None specified", 1);
-   }
-
-#ifdef FEATURE_TRUST
-   if (csp->tlist)
-   {
-      if (!err) err = map(exports, "trust-filename", 1, html_encode(csp->tlist->filename), 0);
-   }
-   else
-   {
-      if (!err) err = map(exports, "trust-filename", 1, "None specified", 1);
-   }
-#else
-   if (!err) err = map_block_killer(exports, "trust-support");
-#endif /* ndef FEATURE_TRUST */
-
-   if (err)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "show-status", exports, rsp);
-}
-
-/*********************************************************************
- *
- * Function    :  cgi_show_url_info
- *
- * Description :  CGI function that determines and shows which actions
- *                Privoxy will perform for a given url, and which
- *                matches starting from the defaults have lead to that.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters :
- *            url : The url whose actions are to be determined.
- *                  If url is unset, the url-given conditional will be
- *                  set, so that all but the form can be suppressed in
- *                  the template.
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_show_url_info(struct client_state *csp,
-                         struct http_response *rsp,
-                         const struct map *parameters)
-{
-   char *url_param;
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-   assert(parameters);
-
-   if (NULL == (exports = default_exports(csp, "show-url-info")))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   /*
-    * Get the url= parameter (if present) and remove any leading/trailing spaces.
-    */
-   url_param = strdup(lookup(parameters, "url"));
-   if (url_param == NULL)
-   {
-      free_map(exports);
-      return JB_ERR_MEMORY;
-   }
-   chomp(url_param);
-
-   /*
-    * Handle prefixes.  4 possibilities:
-    * 1) "http://" or "https://" prefix present and followed by URL - OK
-    * 2) Only the "http://" or "https://" part is present, no URL - change
-    *    to empty string so it will be detected later as "no URL".
-    * 3) Parameter specified but doesn't contain "http(s?)://" - add a
-    *    "http://" prefix.
-    * 4) Parameter not specified or is empty string - let this fall through
-    *    for now, next block of code will handle it.
-    */
-   if (0 == strncmp(url_param, "http://", 7))
-   {
-      if (url_param[7] == '\0')
-      {
-         /*
-          * Empty URL (just prefix).
-          * Make it totally empty so it's caught by the next if()
-          */
-         url_param[0] = '\0';
-      }
-   }
-   else if (0 == strncmp(url_param, "https://", 8))
-   {
-      if (url_param[8] == '\0')
-      {
-         /*
-          * Empty URL (just prefix).
-          * Make it totally empty so it's caught by the next if()
-          */
-         url_param[0] = '\0';
-      }
-   }
-   else if (url_param[0] != '\0')
-   {
-      /*
-       * Unknown prefix - assume http://
-       */
-      char * url_param_prefixed = malloc(7 + 1 + strlen(url_param));
-      if (NULL == url_param_prefixed)
-      {
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      strcpy(url_param_prefixed, "http://");
-      strcpy(url_param_prefixed + 7, url_param);
-      free(url_param);
-      url_param = url_param_prefixed;
-   }
-
-
-   if (url_param[0] == '\0')
-   {
-      /* URL paramater not specified, display query form only. */
-      free(url_param);
-      if (map_block_killer(exports, "url-given")
-        || map(exports, "url", 1, "", 1))
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-   }
-   else
-   {
-      /* Given a URL, so query it. */
-      jb_err err;
-      char *matches;
-      char *s;
-      int hits = 0;
-      struct file_list *fl;
-      struct url_actions *b;
-      struct http_request url_to_query[1];
-      struct current_action_spec action[1];
-      
-      if (map(exports, "url", 1, html_encode(url_param), 0))
-      {
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      init_current_action(action);
-
-      if (map(exports, "default", 1, html_encode_and_free_original(
-         current_action_to_text(action)), 0))
-      {
-         free_current_action(action);
-         free(url_param);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
-      {
-         err = map(exports, "matches", 1, "none" , 1);
-         if (!err) err = map(exports, "final", 1, lookup(exports, "default"), 1);
-
-         free_current_action(action);
-         free(url_param);
-
-         if (err)
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-
-         return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-      }
-
-      err = parse_http_url(url_param, url_to_query, csp);
-
-      free(url_param);
-
-      if (err == JB_ERR_MEMORY)
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-      else if (err)
-      {
-         /* Invalid URL */
-
-         err = map(exports, "matches", 1, "<b>[Invalid URL specified!]</b>" , 1);
-         if (!err) err = map(exports, "final", 1, lookup(exports, "default"), 1);
-
-         free_current_action(action);
-
-         if (err)
-         {
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-
-         return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-      }
-
-      /*
-       * We have a warning about SSL paths.  Hide it for insecure sites.
-       */
-      if (!url_to_query->ssl)
-      {
-         if (map_block_killer(exports, "https"))
-         {
-            free_current_action(action);
-            free_map(exports);
-            return JB_ERR_MEMORY;
-         }
-      }
-
-      matches = strdup("");
-
-      for (b = b->next; (b != NULL) && (matches != NULL); b = b->next)
-      {
-         if (url_match(b->url, url_to_query))
-         {
-            string_append(&matches, "<b>{");
-            string_join  (&matches, html_encode_and_free_original(
-                                    actions_to_text(b->action)));
-            string_append(&matches, " }</b><br>\n<code>");
-            string_join  (&matches, html_encode(b->url->spec));
-            string_append(&matches, "</code><br>\n<br>\n");
-
-            if (merge_current_action(action, b->action))
-            {
-               freez(matches);
-               free_http_request(url_to_query);
-               free_current_action(action);
-               free_map(exports);
-               return JB_ERR_MEMORY;
-            }
-            hits++;
-         }
-      }
-
-      free_http_request(url_to_query);
-
-      if (matches == NULL)
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      if (!hits)
-      {
-         free(matches);
-         matches = strdup("none");
-      }
-      if (map(exports, "matches", 1, matches , 0))
-      {
-         free_current_action(action);
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-
-      s = html_encode_and_free_original(current_action_to_text(action));
-
-      free_current_action(action);
-
-      if (map(exports, "final", 1, s, 0))
-      {
-         free_map(exports);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   return template_fill_for_cgi(csp, "show-url-info", exports, rsp);
-}
-
-
-/*********************************************************************
- *
- * Function    :  cgi_robots_txt
- *
- * Description :  CGI function to return "/robots.txt".
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *          3  :  parameters = map of cgi parameters
- *
- * CGI Parameters : None
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-jb_err cgi_robots_txt(struct client_state *csp,
-                      struct http_response *rsp,
-                      const struct map *parameters)
-{
-   char buf[100];
-   jb_err err;
-
-   rsp->body = strdup(
-      "# This is the Privoxy control interface.\n"
-      "# It isn't very useful to index it, and you're likely to break stuff.\n"
-      "# So go away!\n"
-      "\n"
-      "User-agent: *\n"
-      "Disallow: /\n"
-      "\n");
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   err = enlist_unique(rsp->headers, "Content-Type: text/plain", 13);
-
-   rsp->is_static = 1;
-
-   get_http_time(7 * 24 * 60 * 60, buf); /* 7 days into future */
-   if (!err) err = enlist_unique_header(rsp->headers, "Expires", buf);
-
-   return (err ? JB_ERR_MEMORY : JB_ERR_OK);
-}
-
-
-/*********************************************************************
- *
- * Function    :  show_defines
- *
- * Description :  Add to a map the state od all conditional #defines
- *                used when building
- *
- * Parameters  :
- *          1  :  exports = map to extend
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.  
- *
- *********************************************************************/
-static jb_err show_defines(struct map *exports)
-{
-   jb_err err = JB_ERR_OK;
-
-#ifdef FEATURE_ACL
-   if (!err) err = map_conditional(exports, "FEATURE_ACL", 1);
-#else /* ifndef FEATURE_ACL */
-   if (!err) err = map_conditional(exports, "FEATURE_ACL", 0);
-#endif /* ndef FEATURE_ACL */
-
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 1);
-#else /* ifndef FEATURE_COOKIE_JAR */
-   if (!err) err = map_conditional(exports, "FEATURE_CGI_EDIT_ACTIONS", 0);
-#endif /* ndef FEATURE_COOKIE_JAR */
-
-#ifdef FEATURE_COOKIE_JAR
-   if (!err) err = map_conditional(exports, "FEATURE_COOKIE_JAR", 1);
-#else /* ifndef FEATURE_COOKIE_JAR */
-   if (!err) err = map_conditional(exports, "FEATURE_COOKIE_JAR", 0);
-#endif /* ndef FEATURE_COOKIE_JAR */
-
-#ifdef FEATURE_FAST_REDIRECTS
-   if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 1);
-#else /* ifndef FEATURE_FAST_REDIRECTS */
-   if (!err) err = map_conditional(exports, "FEATURE_FAST_REDIRECTS", 0);
-#endif /* ndef FEATURE_FAST_REDIRECTS */
-
-#ifdef FEATURE_FORCE_LOAD
-   if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-   if (!err) err = map_conditional(exports, "FEATURE_FORCE_LOAD", 0);
-#endif /* ndef FEATURE_FORCE_LOAD */
-
-#ifdef FEATURE_IMAGE_BLOCKING
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 1);
-#else /* ifndef FEATURE_IMAGE_BLOCKING */
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_BLOCKING", 0);
-#endif /* ndef FEATURE_IMAGE_BLOCKING */
-
-#ifdef FEATURE_IMAGE_DETECT_MSIE
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 1);
-#else /* ifndef FEATURE_IMAGE_DETECT_MSIE */
-   if (!err) err = map_conditional(exports, "FEATURE_IMAGE_DETECT_MSIE", 0);
-#endif /* ndef FEATURE_IMAGE_DETECT_MSIE */
-
-#ifdef FEATURE_KILL_POPUPS
-   if (!err) err = map_conditional(exports, "FEATURE_KILL_POPUPS", 1);
-#else /* ifndef FEATURE_KILL_POPUPS */
-   if (!err) err = map_conditional(exports, "FEATURE_KILL_POPUPS", 0);
-#endif /* ndef FEATURE_KILL_POPUPS */
-
-#ifdef FEATURE_NO_GIFS
-   if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 1);
-#else /* ifndef FEATURE_NO_GIFS */
-   if (!err) err = map_conditional(exports, "FEATURE_NO_GIFS", 0);
-#endif /* ndef FEATURE_NO_GIFS */
-
-#ifdef FEATURE_PTHREAD
-   if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 1);
-#else /* ifndef FEATURE_PTHREAD */
-   if (!err) err = map_conditional(exports, "FEATURE_PTHREAD", 0);
-#endif /* ndef FEATURE_PTHREAD */
-
-#ifdef FEATURE_STATISTICS
-   if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 1);
-#else /* ifndef FEATURE_STATISTICS */
-   if (!err) err = map_conditional(exports, "FEATURE_STATISTICS", 0);
-#endif /* ndef FEATURE_STATISTICS */
-
-#ifdef FEATURE_TOGGLE
-   if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 1);
-#else /* ifndef FEATURE_TOGGLE */
-   if (!err) err = map_conditional(exports, "FEATURE_TOGGLE", 0);
-#endif /* ndef FEATURE_TOGGLE */
-
-#ifdef FEATURE_TRUST
-   if (!err) err = map_conditional(exports, "FEATURE_TRUST", 1);
-#else /* ifndef FEATURE_TRUST */
-   if (!err) err = map_conditional(exports, "FEATURE_TRUST", 0);
-#endif /* ndef FEATURE_TRUST */
-
-#ifdef REGEX_GNU
-   if (!err) err = map_conditional(exports, "REGEX_GNU", 1);
-#else /* ifndef REGEX_GNU */
-   if (!err) err = map_conditional(exports, "REGEX_GNU", 0);
-#endif /* def REGEX_GNU */
-
-#ifdef REGEX_PCRE
-   if (!err) err = map_conditional(exports, "REGEX_PCRE", 1);
-#else /* ifndef REGEX_PCRE */
-   if (!err) err = map_conditional(exports, "REGEX_PCRE", 0);
-#endif /* def REGEX_PCRE */
-
-#ifdef STATIC_PCRE
-   if (!err) err = map_conditional(exports, "STATIC_PCRE", 1);
-#else /* ifndef STATIC_PCRE */
-   if (!err) err = map_conditional(exports, "STATIC_PCRE", 0);
-#endif /* ndef STATIC_PCRE */
-
-#ifdef STATIC_PCRS
-   if (!err) err = map_conditional(exports, "STATIC_PCRS", 1);
-#else /* ifndef STATIC_PCRS */
-   if (!err) err = map_conditional(exports, "STATIC_PCRS", 0);
-#endif /* ndef STATIC_PCRS */
-
-   if (!err) err = map(exports, "FORCE_PREFIX", 1, FORCE_PREFIX, 1);
-
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  show_rcs
- *
- * Description :  Create a string with the rcs info for all sourcefiles
- *
- * Parameters  :  None
- *
- * Returns     :  A string, or NULL on out-of-memory.
- *
- *********************************************************************/
-static char *show_rcs(void)
-{
-   char *result = strdup("");
-   char buf[BUFFER_SIZE];
-
-   /* Instead of including *all* dot h's in the project (thus creating a
-    * tremendous amount of dependencies), I will concede to declaring them
-    * as extern's.  This forces the developer to add to this list, but oh well.
-    */
-
-#define SHOW_RCS(__x)              \
-   {                               \
-      extern const char __x[];     \
-      sprintf(buf, "%s\n", __x);   \
-      string_append(&result, buf); \
-   }
-
-   /* In alphabetical order */
-   SHOW_RCS(actions_h_rcs)
-   SHOW_RCS(actions_rcs)
-   SHOW_RCS(cgi_h_rcs)
-   SHOW_RCS(cgi_rcs)
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-   SHOW_RCS(cgiedit_h_rcs)
-   SHOW_RCS(cgiedit_rcs)
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-   SHOW_RCS(cgisimple_h_rcs)
-   SHOW_RCS(cgisimple_rcs)
-#ifdef __MINGW32__
-   SHOW_RCS(cygwin_h_rcs)
-#endif
-   SHOW_RCS(deanimate_h_rcs)
-   SHOW_RCS(deanimate_rcs)
-   SHOW_RCS(encode_h_rcs)
-   SHOW_RCS(encode_rcs)
-   SHOW_RCS(errlog_h_rcs)
-   SHOW_RCS(errlog_rcs)
-   SHOW_RCS(filters_h_rcs)
-   SHOW_RCS(filters_rcs)
-   SHOW_RCS(gateway_h_rcs)
-   SHOW_RCS(gateway_rcs)
-#ifdef GNU_REGEX
-   SHOW_RCS(gnu_regex_h_rcs)
-   SHOW_RCS(gnu_regex_rcs)
-#endif /* def GNU_REGEX */
-   SHOW_RCS(jbsockets_h_rcs)
-   SHOW_RCS(jbsockets_rcs)
-   SHOW_RCS(jcc_h_rcs)
-   SHOW_RCS(jcc_rcs)
-#ifdef FEATURE_KILL_POPUPS
-   SHOW_RCS(killpopup_h_rcs)
-   SHOW_RCS(killpopup_rcs)
-#endif /* def FEATURE_KILL_POPUPS */
-   SHOW_RCS(list_h_rcs)
-   SHOW_RCS(list_rcs)
-   SHOW_RCS(loadcfg_h_rcs)
-   SHOW_RCS(loadcfg_rcs)
-   SHOW_RCS(loaders_h_rcs)
-   SHOW_RCS(loaders_rcs)
-   SHOW_RCS(miscutil_h_rcs)
-   SHOW_RCS(miscutil_rcs)
-   SHOW_RCS(parsers_h_rcs)
-   SHOW_RCS(parsers_rcs)
-   SHOW_RCS(pcrs_rcs)
-   SHOW_RCS(pcrs_h_rcs)
-   SHOW_RCS(project_h_rcs)
-   SHOW_RCS(ssplit_h_rcs)
-   SHOW_RCS(ssplit_rcs)
-   SHOW_RCS(urlmatch_h_rcs)
-   SHOW_RCS(urlmatch_rcs)
-#ifdef _WIN32
-#ifndef _WIN_CONSOLE
-   SHOW_RCS(w32log_h_rcs)
-   SHOW_RCS(w32log_rcs)
-   SHOW_RCS(w32res_h_rcs)
-   SHOW_RCS(w32taskbar_h_rcs)
-   SHOW_RCS(w32taskbar_rcs)
-#endif /* ndef _WIN_CONSOLE */
-   SHOW_RCS(win32_h_rcs)
-   SHOW_RCS(win32_rcs)
-#endif /* def _WIN32 */
-
-#undef SHOW_RCS
-
-   return result;
-
-}
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/cgisimple.h b/cgisimple.h
deleted file mode 100644 (file)
index 753afcc..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-#ifndef CGISIMPLE_H_INCLUDED
-#define CGISIMPLE_H_INCLUDED
-#define CGISIMPLE_H_VERSION "$Id: cgisimple.h,v 1.9 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.h,v $
- *
- * Purpose     :  Declares functions to intercept request, generate
- *                html or gif answers, and to compose HTTP resonses.
- *                
- *                Functions declared include:
- * 
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: cgisimple.h,v $
- *    Revision 1.9  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.8  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.7  2002/03/08 16:43:59  oes
- *    Renamed cgi_transparent_png to cgi_transparent_image
- *
- *    Revision 1.6  2002/03/07 03:48:59  oes
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *
- *    Revision 1.5  2002/01/22 23:26:03  jongfoster
- *    Adding cgi_transparent_gif() for http://i.j.b/t
- *
- *    Revision 1.4  2001/10/23 21:48:19  jongfoster
- *    Cleaning up error handling in CGI functions - they now send back
- *    a HTML error page and should never cause a FATAL error.  (Fixes one
- *    potential source of "denial of service" attacks).
- *
- *    CGI actions file editor that works and is actually useful.
- *
- *    Ability to toggle JunkBuster remotely using a CGI call.
- *
- *    You can turn off both the above features in the main configuration
- *    file, e.g. if you are running a multi-user proxy.
- *
- *    Revision 1.3  2001/10/14 22:00:32  jongfoster
- *    Adding support for a 404 error when an invalid CGI page is requested.
- *
- *    Revision 1.2  2001/10/02 15:31:20  oes
- *    Introduced show-request cgi
- *
- *    Revision 1.1  2001/09/16 17:08:54  jongfoster
- *    Moving simple CGI functions from cgi.c to new file cgisimple.c
- *
- *
- **********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * CGI functions
- */
-extern jb_err cgi_default      (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_error_404    (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_robots_txt   (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_send_banner  (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_status  (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_url_info(struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_version (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_show_request (struct client_state *csp,
-                                struct http_response *rsp,
-                                const struct map *parameters);
-extern jb_err cgi_transparent_image (struct client_state *csp,
-                                   struct http_response *rsp,
-                                   const struct map *parameters);
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-extern jb_err cgi_die (struct client_state *csp,
-                       struct http_response *rsp,
-                       const struct map *parameters);
-#endif
-
-/* Revision control strings from this header and associated .c file */
-extern const char cgisimple_rcs[];
-extern const char cgisimple_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef CGISIMPLE_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/config b/config
index d970941..871b259 100644 (file)
--- a/config
+++ b/config
@@ -1,7 +1,7 @@
-#  Sample Configuration file for Privoxy
+#  Sample Configuration file for the Internet Junkbuster 2.9.x
 
 #
-# $Id: config,v 1.30 2002/03/24 11:37:39 jongfoster Exp $
+# $Id: config,v 1.15 2001/06/29 13:23:20 oes Exp $
 #
 
 #  Table of Contents
 #
 #  1. INTRODUCTION
 #
-#  This file holds the Privoxy configuration.  If you modify this
-#  file, you will need to send a couple of requests to the proxy
-#  before any changes take effect.
+#  This file holds the Junkbuster configuration.  If you modify this
+#  file, you will need to stop & restart Junkbuster, or use the
+#  "Reload Config" option (Windows) before any changes take effect.
 #
-#  When starting Privoxy on Unix systems, give the name of this
-#  file as an argument.  On Windows systems, Privoxy will look for
-#  this file with the name 'config.txt' in the same directory where
-#  Privoxy is installed.
+#  When starting Junkbuster on Unix systems, give the name of this
+#  file as an argument.  On Windows systems, Junkbuster will look for
+#  this file with the name 'junkbustr.txt' in the same directory where
+#  Junkbuster is installed.
 #
 #  2. FORMAT OF THE CONFIGURATION FILE
 #
@@ -29,9 +29,9 @@
 #  of values, all separated by whitespace (any number of spaces or
 #  tabs).  For example,
 #
-#  actionsfile default.action
+#  blockfile blocklist.ini
 #
-#  Indicates that the actionsfile is named 'default.action'.
+#  Indicates that the blockfile is named 'blocklist.ini'.
 #
 #  The '#' indicates a comment.  Any part of a line following a '#' is
 #  ignored, except if the '#' is preceded by a '\'.
 #  Thus, by placing a # at the start of an existing configuration line,
 #  you can make it a comment and it will be treated as if it weren't there. 
 #  This is called "commenting out" an option and can be useful to turn
-#  off features: If you comment out the "logfile" line, Privoxy will
+#  off features: If you comment out the "logfile" line, junkbuster will
 #  not log to a file at all. Watch for the "default:" section in each 
 #  explanation to see what happens if the option is left unset (or 
 #  commented out). 
 #
 #  Long lines can be continued on the next line by using a `\' as
 #  the last character.
+#  
+
 #
 #  3. OTHER CONFIGURATION FILES
 #
-#  Privoxy uses a number of other files to tell it what ads to
+#  Junkbuster uses a number of other files to tell it what ads to
 #  block, what cookies to accept, etc.  This section of the
-#  configuration file tells Privoxy where to find all those other
+#  configuration file tells Junkbuster where to find all those other
 #  files.
 #
-#  Privoxy looks for these files in the directory specified with
-#  "confdir" option.
-#
-#  (Note that on Windows, Privoxy usually starts with the current
-#  directory (".") being the same directory as the executable)
-#
-#  An absolute path name can be used to avoid problems.
-#
+#  On Windows, Junkbuster looks for these files in the same
+#  directory as the executable.  On Unix, Junkbuster looks for these
+#  files in the current working directory.  In either case, an
+#  absolute path name can be used to avoid problems.
+
 #  While we go modular and multiuser, the blocker, filter, and 
 #  per-user config will be stored in subdirectories of confdir.
 #  Now, only confdir/templates is used for storing HTML templates
@@ -76,33 +75,36 @@ confdir .
 #
 logdir .
 
+#
 #  Note that all file specifications below are relative to 
 #  the above two directories!!!
+#
 
 #  The actions file contains patterns to specify the
 #  actions to apply to requests for each site.
 #
 #  Default: Cookies to and from all destinations are filtered.
 #           Popups are disabled for all sites.
-#           All sites are filtered if filterfile specified.
+#           All sites are filtered if re_filterfile specified.
 #           No sites are blocked.  Nothing is an image.
 #
-actionsfile default.action
+actionsfile actionsfile
 
-#  The filterfile contains content modification rules.  These rules
+#
+#  The re_filterfile contains content modification rules.  These rules
 #  permit powerful changes on the content of Web pages, e.g., you
 #  could disable your favourite JavaScript annoyances, rewrite the
 #  actual content, or just have some fun replacing "Microsoft"
 #  with "Microsuck" wherever it appears on a Web page.
 #
-#  Default: content modification. (see '+-filter' in actionsfile)
+#  Default: No content modification.
 #
-filterfile default.filter
+re_filterfile   re_filterfile
 
 #
 #  The logfile is where all logging and error messages are written.
 #  The logfile can be useful for tracking down a problem with
-#  Privoxy (e.g., it's not blocking an ad you think it should
+#  Junkbuster (e.g., it's not blocking an ad you think it should
 #  block) but in most cases you probably will never look at it.
 #
 #  Your logfile will grow indefinitely, and you will probably want to
@@ -110,25 +112,25 @@ filterfile default.filter
 #  cron job (see 'man cron').
 #
 #  On SuSE Linux systems, you can place a line like
-#  "/var/log/privoxy.* +1024k 644 nobody.nogroup" in /etc/logfiles,
+#  "/var/log/junkbuster.* +1024k 644 nobody.nogroup" in /etc/logfiles,
 #  with the effect that cron.daily will automatically archive, gzip,
 #  and empty the log, when it exceeds 1M size.
 #
 #  Default: Log to the standard error channel, not to a file
 #
-logfile logfile
+logfile      logfile
 
 #
-#  The jarfile defines where Privoxy stores the cookies it
+#  The jarfile defines where Junkbuster stores the cookies it
 #  intercepts.  Note that if you use a jarfile, it may grow quite
 #  large. 
 #
 #  Default: Don't store intercepted cookies
 #
-jarfile jarfile
+#jarfile     jarfile
 
 #
-#  If you specify a trustfile, Privoxy will only allow access
+#  If you specify a trustfile, Junkbuster will only allow access
 #  to sites that are named in the trustfile. You can also mark
 #  sites as trusted referrers, with the effect that access to
 #  untrusted sites will be granted, if a link from a trusted
@@ -153,22 +155,25 @@ jarfile jarfile
 trust-info-url http://www.your-site.com/why_we_block.html
 trust-info-url http://www.your-site.com/what_we_allow.html
 
+
+#
 #  4. OPTIONS
 #
 #  This part of the configuration file contains options that control
-#  how Privoxy operates.
+#  how Junkbuster operates.
 #
 
+#
 #  Admin-address should be set to the email address of the proxy
 #  administrator. It is used in many of the proxy-generated pages.
 #
-#  Default: Do not display an e-mail address
+#  Default: fill@me.in.please
 #
-admin-address fill@me.in.please
+#admin-address fill@me.in.please
 
 #
 #  Proxy-info-url can be set to a URL that contains more info about
-#  this Privoxy installation, it's configuration and policies.
+#  this junkbuster installation, it's configuration and policies.
 #  It is used in many of the proxy-generated pages and its use is
 #  highly recommended, since your users will want to know why certain
 #  content is blocked or modified.
@@ -178,41 +183,41 @@ admin-address fill@me.in.please
 proxy-info-url http://www.your-site.com/proxy.html
 
 #
-#  Listen-address specifies the address and port where Privoxy will
+#  Listen-address specifies the address and port where Junkbuster will
 #  listen for connections from your Web browser.  The default is to
-#  listen on the local host on port 8118, and this is suitable for
+#  listen on the local host on port 8000, and this is suitable for
 #  most users.  (In your web browser, under proxy configuration, list
-#  the proxy server as 'localhost' and the port as '8118').
+#  the proxy server as 'localhost' and the port as '8000').
 # 
-#  If you already have another service running on port 8118, or if you
+#  If you already have another service running on port 8000, or if you
 #  want to serve requests from other machines (e.g. on your local
 #  network) as well, you will need to override the default. The syntax
 #  is "listen-address [<ip-address>]:<port>" If you leave out the ip
-#  adress, Privoxy will bind to all interfaces (addresses) on your
+#  adress, junkbuster will bind to all interfaces (addresses) on your
 #  machine and may become reachable from the internet. In that case,
 #  consider using access control lists (acl's) (see "aclfile" above).
 #
-#  For example, suppose you are running Privoxy on a machine which
+#  For example, suppose you are running Junkbuster on a machine which
 #  has the address 192.168.0.1 on your local private network
 #  (192.168.0.0) and has another outside connection with a different
 #  address. You want it to serve requests from inside only:
 #
-#     listen-address 192.168.0.1:8118
+#     listen-address 192.168.0.1:8000
 #
 #  If you want it to listen on all addresses (including the outside
 #  connection):
 #
-#     listen-address :8118
+#     listen-address :8000
 #
 #  If you do this, consider using acls (see "aclfile" above).
 #
 #  Note: you will need to point your browser(s) to the address
 #  and port that you have configured here.
 #
-#  Default:  listen-address    localhost:8118 
-#            listen-address    127.0.0.1:8118
+#  Default:  listen-address    localhost:8000 
+#            listen-address    127.0.0.1:8000
 #
-listen-address 127.0.0.1:8118
+
 
 #
 #  The debug option sets the level of debugging information to log in
@@ -228,10 +233,8 @@ listen-address 127.0.0.1:8118
 #   debug        16 # LOG  = log all data into the logfile
 #   debug        32 # FRC  = debug force feature
 #   debug        64 # REF  = debug regular expression filter 
-#   debug       128 #      = debug fast redirects
-#   debug       256 #      = debug GIF deanimation
-#   debug       512 # CLF  = Common Log Format
-#   debug     1024 #        = debug kill popups
+#   debug       128 # RED  = debug fast redirects
+#   debug       256 # CLF  = Common Log Format
 #   debug      4096 # INFO = Startup banner and warnings.
 #   debug      8192 # ERROR = Non-fatal errors
 #
@@ -239,9 +242,9 @@ listen-address 127.0.0.1:8118
 #  reporting.  (debug 8192).
 #
 #  The reporting of FATAL errors (i.e. ones which crash 
-#  Privoxy) is always on and cannot be disabled.
+#  JunkBuster) is always on and cannot be disabled.
 #
-#  If you want to use CLF, you should set "debug 512" ONLY,
+#  If you want to use CLF, you should set "debug 256" ONLY,
 #  do not enable anything else.
 #
 #  Multiple "debug" directives, are OK - they're logical-OR'd
@@ -256,86 +259,36 @@ debug   4096 # Info
 debug   8192 # Errors - *we highly recommended enabling this*
 
 #
-#  Privoxy normally uses "multi-threading", a software technique
+#  Junkbuster normally uses "multi-threading", a software technique
 #  that permits it to handle many different requests simultaneously.
 #  In some cases you may wish to disable this -- particularly if
 #  you're trying to debug a problem.  The 'single-threaded' option
-#  forces Privoxy to handle requests sequentially.
+#  forces Junkbuster to handle requests sequentially.
 #
 #  Default: Multithreaded mode
 #
 #single-threaded
 
 #
-#    'toggle' allows you to temporarily disable all Privoxy's 
+#    'toggle' allows you to temporarily disable all Junkbuster's 
 #    filtering.  Just set "toggle 0".
 #    
-#    This can now be toggled remotely, through the web-based config
-#    interface.  There is no reason to edit this file any more.
-#
-#    The Windows version of Privoxy puts an icon in the system
+#    The Windows version of Junkbuster puts an icon in the system
 #    tray, which allows you to change this option without having
 #    to edit this file.  If you right-click on that icon (or select
 #    the 'Options' menu), one choice is "Enable".  Clicking on enable
-#    toggles Privoxy on and off.  This is useful if you want to
-#    temporarily disable Privoxy, e.g., to access a site that
+#    toggles Junkbuster on and off.  This is useful if you want to
+#    temporarily disable Junkbuster, e.g., to access a site that
 #    requires cookies which you normally have blocked.
 #
-#    'toggle 1' means Privoxy runs normally, 'toggle 0' means
-#    that Privoxy becomes a non-anonymizing non-blocking
+#    'toggle 1' means Junkbuster runs normally, 'toggle 0' means
+#    that Junkbuster becomes a non-anonymizing non-blocking
 #    proxy.
 #
 #  Default: 1
 #
 toggle 1
 
-#
-#  For content filtering, i.e. the +filter and +deanimate-gif
-#  actions, it is neccessary that Privoxy buffers up the
-#  whole document body. This can be potentially dangerous, since
-#  a server could just keep sending data indefinitely and wait
-#  for your RAM to exhaust.
-#  The buffer-limit option lets you set the size in Kbytes that
-#  each buffer may use at maximum. When the documents buffer
-#  exceeds that size, it is flushed to the client unfiltered and 
-#  no further attempt to filter the rest of it is taken.
-#  Remember that there may multiple threads running, which might
-#  require up to buffer-limit Kbytes *each*, unless you have set
-#  single-threaded below.
-#
-#  Default: 4069, i.e. 4 MB
-#
-buffer-limit 4069
-
-
-#
-#  Enable the web-based actionsfile editor.  Set to 1 to enable,
-#  0 to disable.  Note that you must have compiled Privoxy
-#  with support for this feature, otherwise this option has no
-#  effect.
-#
-#  Security note:  If this is enabled, anyone who can use the proxy
-#  can edit the actions file, and their changes will affect all users.
-#  For shared proxies, you probably want to disable this.
-#
-#  Default: Disabled
-#
-enable-edit-actions 1
-
-
-#
-#  Allow Privoxy to be toggled on and off remotely, using your
-#  web browser.  Set to 1 to enable, 0 to disable.  Note that you
-#  must have compiled Privoxy with support for this feature,
-#  otherwise this option has no effect.
-#
-#  Security note:  If this is enabled, anyone who can use the proxy
-#  can toggle it on or off, and their changes will affect all users.
-#  For shared proxies, you probably want to disable this.
-#
-#  Default: Disabled
-#
-enable-remote-toggle 1
 
 #############################################################################
 # Access Control List
@@ -377,11 +330,11 @@ enable-remote-toggle 1
 #
 # IMPORTANT NOTE
 # ==============
-# If Privoxy is using a forwarder or a gateway for a particular 
+# If the junkbuster is using a forwarder or a gateway for a particular 
 # destination URL, the DST_ADDRR that is examined is the address of
 # the forwarder or the gateway and NOT the address of the ultimate target.
 # This is necessary because it may be impossible for the local
-# Privoxy to determine the address of the ultimate target
+# junkbuster to determine the address of the ultimate target
 # (that's often what gateways are used for).
 #
 # Here are a few examples to show how the ACL works:
@@ -391,14 +344,13 @@ enable-remote-toggle 1
 #
 # a silly example to illustrate:
 #
-# permit any host on the class-C subnet with our web server to go
-# anywhere
+# permit any host on the class-C subnet with junkbusters to go anywhere
 #
-# permit-access www.example.com/24
+# permit-access www.junkbusters.com/24
 #
 # except deny one particular IP address from using it at all
 #
-# deny-access      hacker.example.com
+# deny-access      ident.junkbusters.com
 #
 # another example
 #
@@ -417,7 +369,7 @@ enable-remote-toggle 1
 #
 # to allow all .org domains; every IP-address listed must resolve fully.
 #
-# An ISP may want to provide a Privoxy that is accessible by "the world"
+# An ISP may want to provide a junkbuster that is accessible by "the world"
 # and yet restrict use of some of their private content to hosts on its
 # internal network (i.e. its own subscribers).  Say, for instance the
 # ISP owns the Class-B IP address block 123.124.0.0 (a 16 bit netmask).
@@ -475,13 +427,13 @@ enable-remote-toggle 1
 #
 # In the following common configuration, everything goes to Lucent's LPWA,
 # except SSL on port 443 (which it doesn't handle)
-#    forward .*    lpwa.com:8118
+#    forward .*    lpwa.com:8000
 #    forward :443 .
 #
 # See the FAQ for instructions on how to automate the login procedure for LPWA.
 # Some users have reported difficulties related to LPWA's use of . as the
 # last element of the domain, and have said that this can be fixed with this:
-#    forward lpwa.  lpwa.com:8118
+#    forward lpwa.  lpwa.com:8000
 # (NOTE: the syntax for specifiying target_domain has changed since the
 # previous paragraph weas written - it will not work now.  More information
 # is welcome.)
@@ -489,7 +441,7 @@ enable-remote-toggle 1
 # In this fictitious example, everything goes via an ISP's caching proxy,
 # except requests to that ISP:
 #
-# forward .* caching.myisp.net:8118
+# forward .* caching.myisp.net:8000
 # forward myisp.net .
 #
 # For the @home network, we're told the forwarding configuration is this:
@@ -502,12 +454,12 @@ enable-remote-toggle 1
 # but everything else goes through Lucent's LPWA by way of the company's
 # SOCKS gateway to the Internet.
 #
-# forward-socks4 .* lpwa.com:8118 firewall.my_company.com:1080
+# forward_socks4 .* lpwa.com:8000 firewall.my_company.com:1080
 # forward my_company.com .
 #
 # This is how you could set up a site that always uses SOCKS but no forwarders
 #
-# forward-socks4a .* . firewall.my_company.com:1080
+# forward_socks4a .* . firewall.my_company.com:1080
 #
 # An advanced example for network administrators:
 #
@@ -521,13 +473,13 @@ enable-remote-toggle 1
 # host-a has a PPP connection to isp-a.com
 # host-b has a PPP connection to isp-b.com
 #
-# host-a can run Privoxy with forwarding like this:
+# host-a can run an Internet Junkbuster proxy with forwarding like this:
 #   forward .* .
-#   forward isp-b.com host-b:8118
+#   forward isp-b.com host-b:8000
 #
-# host-b can run Privoxy with forwarding like this:
+# host-b can run an Internet Junkbuster proxy with forwarding like this:
 #   forward .* .
-#   forward isp-a.com host-a:8118
+#   forward isp-a.com host-a:8000
 #
 # Now, *anyone* on the Internet (including users on host-a and host-b)
 # can set their browser's proxy to *either* host-a or host-b and
@@ -546,45 +498,25 @@ enable-remote-toggle 1
 #   forward localhost.localdomain . # Loopback address
 #   forward www.ukc.mirror.ac.uk  . # Specific host
 #
-#
-# Note: If you intend to chain Privoxy and squid locally, the chain
-#       broswer -> squid -> Privoxy is the recommended way.
-#
-#       Your squid configuration could then look like this:
-#
-#       # Define Privoxy as parent cache 
-#       cache_peer 127.0.0.1 8118 parent 0 no-query 
-#
-#       # Define ACL for protocol FTP 
-#       acl FTP proto FTP 
-#
-#       # Do not forward ACL FTP to Privoxy 
-#       always_direct allow FTP 
-#
-#       # Do not forward ACL CONNECT (https) to Privoxy 
-#       always_direct allow CONNECT 
-#
-#       # Forward the rest to Privoxy 
-#       never_direct allow all 
-#
+
 
 #############################################################################
 #  5. WINDOWS GUI OPTIONS
 #############################################################################
 #
-#  Privoxy has a number of options specific to the Windows GUI
+#  Junkbuster has a number of options specific to the Windows GUI
 #  interface:
 #
 #    activity-animation      {1 or 0}
 #
-#    If set to 1, the Privoxy icon will animate when Privoxy is
+#    If set to 1, the Junkbuster icon will animate when Junkbuster is
 #    active.
 #
 #Win32-only: activity-animation      1
 
 #    log-messages            {1 or 0}
 #
-#    If set to 1, Privoxy will log messages to the console window.
+#    If set to 1, Junkbuster will log messages to the console window.
 #
 #Win32-only: log-messages            1
 
@@ -607,7 +539,7 @@ enable-remote-toggle 1
 
 #    log-highlight-messages  {1 or 0}
 #
-#    If set to 1, Privoxy will highlight portions of the log
+#    If set to 1, Junkbuster will highlight portions of the log
 #    messages with a bold-faced font.
 #
 #Win32-only: log-highlight-messages  1
@@ -626,7 +558,7 @@ enable-remote-toggle 1
 
 #    show-on-task-bar        {1 or 0}
 #
-#    Controls whether or not Privoxy will appear as a button on the Task
+#    Controls whether or not Junkbuster will appear as a button on the Task
 #    bar when minimized.
 #
 #Win32-only: show-on-task-bar        0
@@ -634,7 +566,7 @@ enable-remote-toggle 1
 
 #    close-button-minimizes  1
 #
-#    If set, the Windows close button will minimize Privoxy instead
+#    If set, the Windows close button will minimize Junkbuster instead
 #    of closing the program (close with the exit option on the File
 #    menu).
 #
@@ -642,15 +574,15 @@ enable-remote-toggle 1
 
 
 #
-#  This option is specific to the Win32 console version of Privoxy:
+#  This option is specific to the Win32 console version of JunkBuster:
 #
 #    hide-console
 #
-#    If this option is used, Privoxy will disconnect from and hide 
+#    If this option is used, Junkbuster will disconnect from and hide 
 #    the command console.
 #
 #Win32-only: #hide-console
 
 
-# Note: Privoxy is distributed under the GNU General Public License (GPL)
+# Note: Junkbuster is distributed under the GNU General Public License (GPL)
 #       For details, see http://www.gnu.org/copyleft/gpl.html
diff --git a/config.guess b/config.guess
deleted file mode 100755 (executable)
index cd430f6..0000000
+++ /dev/null
@@ -1,1314 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-#   Free Software Foundation, Inc.
-
-timestamp='2001-08-21'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Written by Per Bothner <bothner@cygnus.com>.
-# Please send patches to <config-patches@gnu.org>.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
-    --version | -v )
-       echo "$version" ; exit 0 ;;
-    --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script.
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int dummy(){}" > $dummy.c ;
-       for c in cc gcc c89 ; do
-         ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
-         if test $? = 0 ; then
-            CC_FOR_BUILD="$c"; break ;
-         fi ;
-       done ;
-       rm -f $dummy.c $dummy.o $dummy.rel ;
-       if test x"$CC_FOR_BUILD" = x ; then
-         CC_FOR_BUILD=no_compiler_found ;
-       fi
-       ;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-       PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-       # Netbsd (nbsd) targets should (where applicable) match one or
-       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-       # switched to ELF, *-*-netbsd* would select the old
-       # object file format.  This provides both forward
-       # compatibility and a consistent mechanism for selecting the
-       # object file format.
-       # Determine the machine/vendor (is the vendor relevant).
-       case "${UNAME_MACHINE}" in
-           amiga) machine=m68k-unknown ;;
-           arm32) machine=arm-unknown ;;
-           atari*) machine=m68k-atari ;;
-           sun3*) machine=m68k-sun ;;
-           mac68k) machine=m68k-apple ;;
-           macppc) machine=powerpc-apple ;;
-           hp3[0-9][05]) machine=m68k-hp ;;
-           ibmrt|romp-ibm) machine=romp-ibm ;;
-           *) machine=${UNAME_MACHINE}-unknown ;;
-       esac
-       # The Operating System including object format, if it has switched
-       # to ELF recently, or will in the future.
-       case "${UNAME_MACHINE}" in
-           i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
-               eval $set_cc_for_build
-               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-                       | grep __ELF__ >/dev/null
-               then
-                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-                   # Return netbsd for either.  FIX?
-                   os=netbsd
-               else
-                   os=netbsdelf
-               fi
-               ;;
-           *)
-               os=netbsd
-               ;;
-       esac
-       # The OS release
-       release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-       # contains redundant information, the shorter form:
-       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "${machine}-${os}${release}"
-       exit 0 ;;
-    alpha:OSF1:*:*)
-       if test $UNAME_RELEASE = "V4.0"; then
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-       fi
-       # A Vn.n version is a released version.
-       # A Tn.n version is a released field test version.
-       # A Xn.n version is an unreleased experimental baselevel.
-       # 1.2 uses "1.2" for uname -r.
-       cat <<EOF >$dummy.s
-       .data
-\$Lformat:
-       .byte 37,100,45,37,120,10,0     # "%d-%x\n"
-
-       .text
-       .globl main
-       .align 4
-       .ent main
-main:
-       .frame \$30,16,\$26,0
-       ldgp \$29,0(\$27)
-       .prologue 1
-       .long 0x47e03d80 # implver \$0
-       lda \$2,-1
-       .long 0x47e20c21 # amask \$2,\$1
-       lda \$16,\$Lformat
-       mov \$0,\$17
-       not \$1,\$18
-       jsr \$26,printf
-       ldgp \$29,0(\$26)
-       mov 0,\$16
-       jsr \$26,exit
-       .end main
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
-       if test "$?" = 0 ; then
-               case `./$dummy` in
-                       0-0)
-                               UNAME_MACHINE="alpha"
-                               ;;
-                       1-0)
-                               UNAME_MACHINE="alphaev5"
-                               ;;
-                       1-1)
-                               UNAME_MACHINE="alphaev56"
-                               ;;
-                       1-101)
-                               UNAME_MACHINE="alphapca56"
-                               ;;
-                       2-303)
-                               UNAME_MACHINE="alphaev6"
-                               ;;
-                       2-307)
-                               UNAME_MACHINE="alphaev67"
-                               ;;
-                       2-1307)
-                               UNAME_MACHINE="alphaev68"
-                               ;;
-               esac
-       fi
-       rm -f $dummy.s $dummy
-       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       exit 0 ;;
-    Alpha\ *:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # Should we change UNAME_MACHINE based on the output of uname instead
-       # of the specific Alpha model?
-       echo alpha-pc-interix
-       exit 0 ;;
-    21064:Windows_NT:50:3)
-       echo alpha-dec-winnt3.5
-       exit 0 ;;
-    Amiga*:UNIX_System_V:4.0:*)
-       echo m68k-unknown-sysv4
-       exit 0;;
-    amiga:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-       echo ${UNAME_MACHINE}-unknown-amigaos
-       exit 0 ;;
-    arc64:OpenBSD:*:*)
-       echo mips64el-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    arc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    hkmips:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    pmax:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    sgi:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:OS/390:*:*)
-       echo i370-ibm-openedition
-       exit 0 ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-       echo arm-acorn-riscix${UNAME_RELEASE}
-       exit 0;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-       echo hppa1.1-hitachi-hiuxmpp
-       exit 0;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-       if test "`(/bin/universe) 2>/dev/null`" = att ; then
-               echo pyramid-pyramid-sysv3
-       else
-               echo pyramid-pyramid-bsd
-       fi
-       exit 0 ;;
-    NILE*:*:*:dcosx)
-       echo pyramid-pyramid-svr4
-       exit 0 ;;
-    sun4H:SunOS:5.*:*)
-       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    i86pc:SunOS:5.*:*)
-       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:6*:*)
-       # According to config.sub, this is the proper way to canonicalize
-       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-       # it's likely to be more like Solaris than SunOS4.
-       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:*:*)
-       case "`/usr/bin/arch -k`" in
-           Series*|S4*)
-               UNAME_RELEASE=`uname -v`
-               ;;
-       esac
-       # Japanese Language versions have a version number like `4.1.3-JL'.
-       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-       exit 0 ;;
-    sun3*:SunOS:*:*)
-       echo m68k-sun-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    sun*:*:4.2BSD:*)
-       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-       case "`/bin/arch`" in
-           sun3)
-               echo m68k-sun-sunos${UNAME_RELEASE}
-               ;;
-           sun4)
-               echo sparc-sun-sunos${UNAME_RELEASE}
-               ;;
-       esac
-       exit 0 ;;
-    aushp:SunOS:*:*)
-       echo sparc-auspex-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    sparc*:NetBSD:*)
-       echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
-    sun3*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mac68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme88k:OpenBSD:*:*)
-       echo m88k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    powerpc:machten:*:*)
-       echo powerpc-apple-machten${UNAME_RELEASE}
-       exit 0 ;;
-    RISC*:Mach:*:*)
-       echo mips-dec-mach_bsd4.3
-       exit 0 ;;
-    RISC*:ULTRIX:*:*)
-       echo mips-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    VAX*:ULTRIX*:*:*)
-       echo vax-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-       echo clipper-intergraph-clix${UNAME_RELEASE}
-       exit 0 ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-       sed 's/^        //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-       #if defined (host_mips) && defined (MIPSEB)
-       #if defined (SYSTYPE_SYSV)
-         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_SVR4)
-         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-       #endif
-       #endif
-         exit (-1);
-       }
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy \
-         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-         && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo mips-mips-riscos${UNAME_RELEASE}
-       exit 0 ;;
-    Motorola:PowerMAX_OS:*:*)
-       echo powerpc-motorola-powermax
-       exit 0 ;;
-    Night_Hawk:Power_UNIX:*:*)
-       echo powerpc-harris-powerunix
-       exit 0 ;;
-    m88k:CX/UX:7*:*)
-       echo m88k-harris-cxux7
-       exit 0 ;;
-    m88k:*:4*:R4*)
-       echo m88k-motorola-sysv4
-       exit 0 ;;
-    m88k:*:3*:R3*)
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-       then
-           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-              [ ${TARGET_BINARY_INTERFACE}x = x ]
-           then
-               echo m88k-dg-dgux${UNAME_RELEASE}
-           else
-               echo m88k-dg-dguxbcs${UNAME_RELEASE}
-           fi
-       else
-           echo i586-dg-dgux${UNAME_RELEASE}
-       fi
-       exit 0 ;;
-    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
-       echo m88k-dolphin-sysv3
-       exit 0 ;;
-    M88*:*:R3*:*)
-       # Delta 88k system running SVR3
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-       echo m88k-tektronix-sysv3
-       exit 0 ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-       echo m68k-tektronix-bsd
-       exit 0 ;;
-    *:IRIX*:*:*)
-       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-       exit 0 ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-       echo i386-ibm-aix
-       exit 0 ;;
-    ia64:AIX:*:*)
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-       exit 0 ;;
-    *:AIX:2:3)
-       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               sed 's/^                //' << EOF >$dummy.c
-               #include <sys/systemcfg.h>
-
-               main()
-                       {
-                       if (!__power_pc())
-                               exit(1);
-                       puts("powerpc-ibm-aix3.2.5");
-                       exit(0);
-                       }
-EOF
-               eval $set_cc_for_build
-               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
-               rm -f $dummy.c $dummy
-               echo rs6000-ibm-aix3.2.5
-       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-               echo rs6000-ibm-aix3.2.4
-       else
-               echo rs6000-ibm-aix3.2
-       fi
-       exit 0 ;;
-    *:AIX:*:[45])
-       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
-       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-               IBM_ARCH=rs6000
-       else
-               IBM_ARCH=powerpc
-       fi
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-       exit 0 ;;
-    *:AIX:*:*)
-       echo rs6000-ibm-aix
-       exit 0 ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-       echo romp-ibm-bsd4.4
-       exit 0 ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-       exit 0 ;;                           # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-       echo rs6000-bull-bosx
-       exit 0 ;;
-    DPX/2?00:B.O.S.:*:*)
-       echo m68k-bull-sysv3
-       exit 0 ;;
-    9000/[34]??:4.3bsd:1.*:*)
-       echo m68k-hp-bsd
-       exit 0 ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-       echo m68k-hp-bsd4.4
-       exit 0 ;;
-    9000/[34678]??:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
-           9000/[678][0-9][0-9])
-              case "${HPUX_REV}" in
-                11.[0-9][0-9])
-                  if [ -x /usr/bin/getconf ]; then
-                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-                        esac ;;
-                    esac
-                  fi ;;
-              esac
-              if [ "${HP_ARCH}" = "" ]; then
-              sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-               {
-               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-               case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-                   switch (bits)
-                       {
-                       case 64: puts ("hppa2.0w"); break;
-                       case 32: puts ("hppa2.0n"); break;
-                       default: puts ("hppa2.0"); break;
-                       } break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-                   puts ("hppa2.0"); break;
-              #endif
-               default: puts ("hppa1.0"); break;
-               }
-                  exit (0);
-              }
-EOF
-       eval $set_cc_for_build
-       (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
-       if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
-       rm -f $dummy.c $dummy
-       fi ;;
-       esac
-       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-       exit 0 ;;
-    ia64:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       echo ia64-hp-hpux${HPUX_REV}
-       exit 0 ;;
-    3050*:HI-UX:*:*)
-       sed 's/^        //' << EOF >$dummy.c
-       #include <unistd.h>
-       int
-       main ()
-       {
-         long cpu = sysconf (_SC_CPU_VERSION);
-         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-            results, however.  */
-         if (CPU_IS_PA_RISC (cpu))
-           {
-             switch (cpu)
-               {
-                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-                 default: puts ("hppa-hitachi-hiuxwe2"); break;
-               }
-           }
-         else if (CPU_IS_HP_MC68K (cpu))
-           puts ("m68k-hitachi-hiuxwe2");
-         else puts ("unknown-hitachi-hiuxwe2");
-         exit (0);
-       }
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo unknown-hitachi-hiuxwe2
-       exit 0 ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-       echo hppa1.1-hp-bsd
-       exit 0 ;;
-    9000/8??:4.3bsd:*:*)
-       echo hppa1.0-hp-bsd
-       exit 0 ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-       echo hppa1.0-hp-mpeix
-       exit 0 ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-       echo hppa1.1-hp-osf
-       exit 0 ;;
-    hp8??:OSF1:*:*)
-       echo hppa1.0-hp-osf
-       exit 0 ;;
-    i*86:OSF1:*:*)
-       if [ -x /usr/sbin/sysversion ] ; then
-           echo ${UNAME_MACHINE}-unknown-osf1mk
-       else
-           echo ${UNAME_MACHINE}-unknown-osf1
-       fi
-       exit 0 ;;
-    parisc*:Lites*:*:*)
-       echo hppa1.1-hp-lites
-       exit 0 ;;
-    hppa*:OpenBSD:*:*)
-       echo hppa-unknown-openbsd
-       exit 0 ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-       echo c1-convex-bsd
-        exit 0 ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-        exit 0 ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-       echo c34-convex-bsd
-        exit 0 ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-       echo c38-convex-bsd
-        exit 0 ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-       echo c4-convex-bsd
-        exit 0 ;;
-    CRAY*X-MP:*:*:*)
-       echo xmp-cray-unicos
-        exit 0 ;;
-    CRAY*Y-MP:*:*:*)
-       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*[A-Z]90:*:*:*)
-       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-             -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*TS:*:*:*)
-       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*T3D:*:*:*)
-       echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*T3E:*:*:*)
-       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY*SV1:*:*:*)
-       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit 0 ;;
-    CRAY-2:*:*:*)
-       echo cray2-cray-unicos
-        exit 0 ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit 0 ;;
-    hp300:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    sparc*:BSD/OS:*:*)
-       echo sparc-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:BSD/OS:*:*)
-       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:FreeBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-       exit 0 ;;
-    *:OpenBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       exit 0 ;;
-    i*:CYGWIN*:*)
-       echo ${UNAME_MACHINE}-pc-cygwin
-       exit 0 ;;
-    i*:MINGW*:*)
-       echo ${UNAME_MACHINE}-pc-mingw32
-       exit 0 ;;
-    i*:PW*:*)
-       echo ${UNAME_MACHINE}-pc-pw32
-       exit 0 ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-       # UNAME_MACHINE based on the output of uname instead of i386?
-       echo i386-pc-interix
-       exit 0 ;;
-    i*:UWIN*:*)
-       echo ${UNAME_MACHINE}-pc-uwin
-       exit 0 ;;
-    p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin
-       exit 0 ;;
-    prep*:SunOS:5.*:*)
-       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    *:GNU:*:*)
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-       exit 0 ;;
-    i*86:Minix:*:*)
-       echo ${UNAME_MACHINE}-pc-minix
-       exit 0 ;;
-    arm*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    ia64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux
-       exit 0 ;;
-    m68*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    mips:Linux:*:*)
-       case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
-         big)    echo mips-unknown-linux-gnu && exit 0 ;;
-         little) echo mipsel-unknown-linux-gnu && exit 0 ;;
-       esac
-       ;;
-    ppc:Linux:*:*)
-       echo powerpc-unknown-linux-gnu
-       exit 0 ;;
-    ppc64:Linux:*:*)
-       echo powerpc64-unknown-linux-gnu
-       exit 0 ;;
-    alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-         EV5)   UNAME_MACHINE=alphaev5 ;;
-         EV56)  UNAME_MACHINE=alphaev56 ;;
-         PCA56) UNAME_MACHINE=alphapca56 ;;
-         PCA57) UNAME_MACHINE=alphapca56 ;;
-         EV6)   UNAME_MACHINE=alphaev6 ;;
-         EV67)  UNAME_MACHINE=alphaev67 ;;
-         EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-       exit 0 ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-       # Look for CPU level
-       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-         PA7*) echo hppa1.1-unknown-linux-gnu ;;
-         PA8*) echo hppa2.0-unknown-linux-gnu ;;
-         *)    echo hppa-unknown-linux-gnu ;;
-       esac
-       exit 0 ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-       echo hppa64-unknown-linux-gnu
-       exit 0 ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-       echo ${UNAME_MACHINE}-ibm-linux
-       exit 0 ;;
-    sh*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-gnu
-       exit 0 ;;
-    x86_64:Linux:*:*)
-       echo x86_64-unknown-linux-gnu
-       exit 0 ;;
-    i*86:Linux:*:*)
-       # The BFD linker knows what the default object file format is, so
-       # first see if it will tell us. cd to the root directory to prevent
-       # problems with other programs or directories called `ld' in the path.
-       ld_supported_targets=`cd /; ld --help 2>&1 \
-                        | sed -ne '/supported targets:/!d
-                                   s/[         ][      ]*/ /g
-                                   s/.*supported targets: *//
-                                   s/ .*//
-                                   p'`
-        case "$ld_supported_targets" in
-         elf32-i386)
-               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-               ;;
-         a.out-i386-linux)
-               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-               exit 0 ;;               
-         coff-i386)
-               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-               exit 0 ;;
-         "")
-               # Either a pre-BFD a.out linker (linux-gnuoldld) or
-               # one that does not give us useful --help.
-               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-               exit 0 ;;
-       esac
-       # Determine whether the default compiler is a.out or elf
-       cat >$dummy.c <<EOF
-#include <features.h>
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __ELF__
-# ifdef __GLIBC__
-#  if __GLIBC__ >= 2
-    printf ("%s-pc-linux-gnu\n", argv[1]);
-#  else
-    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-#  endif
-# else
-   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-#else
-  printf ("%s-pc-linux-gnuaout\n", argv[1]);
-#endif
-  return 0;
-}
-EOF
-       eval $set_cc_for_build
-       $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
-       ;;
-    i*86:DYNIX/ptx:4*:*)
-       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-       # earlier versions are messed up and put the nodename in both
-       # sysname and nodename.
-       echo i386-sequent-sysv4
-       exit 0 ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-       # I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-       exit 0 ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-       else
-               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-       fi
-       exit 0 ;;
-    i*86:*:5:[78]*)
-       case `/bin/uname -X | grep "^Machine"` in
-           *486*)           UNAME_MACHINE=i486 ;;
-           *Pentium)        UNAME_MACHINE=i586 ;;
-           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-       esac
-       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-       exit 0 ;;
-    i*86:*:3.2:*)
-       if test -f /usr/options/cb.name; then
-               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-       elif /bin/uname -X 2>/dev/null >/dev/null ; then
-               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
-               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
-               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
-                       && UNAME_MACHINE=i586
-               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-       else
-               echo ${UNAME_MACHINE}-pc-sysv32
-       fi
-       exit 0 ;;
-    i*86:*DOS:*:*)
-       echo ${UNAME_MACHINE}-pc-msdosdjgpp
-       exit 0 ;;
-    pc:*:*:*)
-       # Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-       echo i386-pc-msdosdjgpp
-        exit 0 ;;
-    Intel:Mach:3*:*)
-       echo i386-pc-mach3
-       exit 0 ;;
-    paragon:*:*:*)
-       echo i860-intel-osf1
-       exit 0 ;;
-    i860:*:4.*:*) # i860-SVR4
-       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-       else # Add other i860-SVR4 vendors below as they are discovered.
-         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-       fi
-       exit 0 ;;
-    mini*:CTIX:SYS*5:*)
-       # "miniframe"
-       echo m68010-convergent-sysv
-       exit 0 ;;
-    M68*:*:R3V[567]*:*)
-       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
-       OS_REL=''
-       test -r /etc/.relid \
-       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
-       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && echo i486-ncr-sysv4 && exit 0 ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-       echo m68k-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    mc68030:UNIX_System_V:4.*:*)
-       echo m68k-atari-sysv4
-       exit 0 ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-       echo i386-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    TSUNAMI:LynxOS:2.*:*)
-       echo sparc-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    rs6000:LynxOS:2.*:*)
-       echo rs6000-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-       echo powerpc-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    SM[BE]S:UNIX_SV:*:*)
-       echo mips-dde-sysv${UNAME_RELEASE}
-       exit 0 ;;
-    RM*:ReliantUNIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    RM*:SINIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    *:SINIX-*:*:*)
-       if uname -p 2>/dev/null >/dev/null ; then
-               UNAME_MACHINE=`(uname -p) 2>/dev/null`
-               echo ${UNAME_MACHINE}-sni-sysv4
-       else
-               echo ns32k-sni-sysv
-       fi
-       exit 0 ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit 0 ;;
-    *:UNIX_System_V:4*:FTX*)
-       # From Gerald Hewes <hewes@openmarket.com>.
-       # How about differentiating between stratus architectures? -djm
-       echo hppa1.1-stratus-sysv4
-       exit 0 ;;
-    *:*:*:FTX*)
-       # From seanf@swdc.stratus.com.
-       echo i860-stratus-sysv4
-       exit 0 ;;
-    *:VOS:*:*)
-       # From Paul.Green@stratus.com.
-       echo hppa1.1-stratus-vos
-       exit 0 ;;
-    mc68*:A/UX:*:*)
-       echo m68k-apple-aux${UNAME_RELEASE}
-       exit 0 ;;
-    news*:NEWS-OS:6*:*)
-       echo mips-sony-newsos6
-       exit 0 ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-       if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
-       else
-               echo mips-unknown-sysv${UNAME_RELEASE}
-       fi
-        exit 0 ;;
-    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
-       echo powerpc-be-beos
-       exit 0 ;;
-    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
-       echo powerpc-apple-beos
-       exit 0 ;;
-    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
-       echo i586-pc-beos
-       exit 0 ;;
-    SX-4:SUPER-UX:*:*)
-       echo sx4-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    SX-5:SUPER-UX:*:*)
-       echo sx5-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    Power*:Rhapsody:*:*)
-       echo powerpc-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:Rhapsody:*:*)
-       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:Darwin:*:*)
-       echo `uname -p`-apple-darwin${UNAME_RELEASE}
-       exit 0 ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-       if test "${UNAME_MACHINE}" = "x86pc"; then
-               UNAME_MACHINE=pc
-       fi
-       echo `uname -p`-${UNAME_MACHINE}-nto-qnx
-       exit 0 ;;
-    *:QNX:*:4*)
-       echo i386-pc-qnx
-       exit 0 ;;
-    NSR-[KW]:NONSTOP_KERNEL:*:*)
-       echo nsr-tandem-nsk${UNAME_RELEASE}
-       exit 0 ;;
-    *:NonStop-UX:*:*)
-       echo mips-compaq-nonstopux
-       exit 0 ;;
-    BS2000:POSIX*:*:*)
-       echo bs2000-siemens-sysv
-       exit 0 ;;
-    DS/*:UNIX_System_V:*:*)
-       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-       exit 0 ;;
-    *:Plan9:*:*)
-       # "uname -m" is not consistent, so use $cputype instead. 386
-       # is converted to i386 for consistency with other x86
-       # operating systems.
-       if test "$cputype" = "386"; then
-           UNAME_MACHINE=i386
-       else
-           UNAME_MACHINE="$cputype"
-       fi
-       echo ${UNAME_MACHINE}-unknown-plan9
-       exit 0 ;;
-    i*86:OS/2:*:*)
-       # If we were able to find `uname', then EMX Unix compatibility
-       # is probably installed.
-       echo ${UNAME_MACHINE}-pc-os2-emx
-       exit 0 ;;
-    *:TOPS-10:*:*)
-       echo pdp10-unknown-tops10
-       exit 0 ;;
-    *:TENEX:*:*)
-       echo pdp10-unknown-tenex
-       exit 0 ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-       echo pdp10-dec-tops20
-       exit 0 ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-       echo pdp10-xkl-tops20
-       exit 0 ;;
-    *:TOPS-20:*:*)
-       echo pdp10-unknown-tops20
-       exit 0 ;;
-    *:ITS:*:*)
-       echo pdp10-unknown-its
-       exit 0 ;;
-    i*86:XTS-300:*:STOP)
-       echo ${UNAME_MACHINE}-unknown-stop
-       exit 0 ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-         ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-       printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-       printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-eval $set_cc_for_build
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
-rm -f $dummy.c $dummy
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit 0 ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit 0 ;;
-    c34*)
-       echo c34-convex-bsd
-       exit 0 ;;
-    c38*)
-       echo c38-convex-bsd
-       exit 0 ;;
-    c4*)
-       echo c4-convex-bsd
-       exit 0 ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-    ftp://ftp.gnu.org/pub/gnu/config/
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..b88a04a
--- /dev/null
@@ -0,0 +1,280 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+#ifndef _CONFIG_H
+#define _CONFIG_H
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/config.h.in,v $
+ *
+ * Purpose     :  This file should be the first thing included in every
+ *                .c file.  (Before even system headers).  It contains 
+ *                #define statements for various features.  It was
+ *                introduced because the compile command line started
+ *                getting ludicrously long with feature defines.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: config.h.in,v $
+ *    Revision 1.3  2001/05/29 09:50:24  jongfoster
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
+ *
+ *    Revision 1.3  2001/05/26 01:26:34  jongfoster
+ *    New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
+ *    This #define cannot be set from ./configure - there's no point, it
+ *    doesn't work yet.  See feature request # 425722
+ *
+ *    Revision 1.2  2001/05/22 17:43:35  oes
+ *
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *      which is selected by the (nonstandard and therefore
+ *      capital) letter 'U' in the option string.
+ *      It causes the quantifiers to be ungreedy by default.
+ *      Appending a ? turns back to greedy (!).
+ *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Many minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:58:45  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/*
+ * Version number - Major (X._._)
+ */
+#undef VERSION_MAJOR
+
+/*
+ * Version number - Minor (_.X._)
+ */
+#undef VERSION_MINOR
+
+/*
+ * Version number - Point (_._.X)
+ */
+#undef VERSION_POINT
+
+/*
+ * Version number, as a string
+ */
+#undef VERSION
+
+/*
+ * Status of the code: alpha, beta or stable
+ */
+#undef CODE_STATUS
+
+/*
+ * Regular expression matching for URLs.  (Highly recommended).  If this is 
+ * not defined then you can ony use prefix matching.
+ */
+#undef REGEX
+
+/*
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
+ */
+#undef TOGGLE
+
+/*
+ * Enables arbitrary content modification regexps
+ */
+#undef PCRS
+
+/*
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
+ */
+#undef DENY_GZIP
+
+/*
+ * Enables statistics function.
+ */
+#undef STATISTICS
+
+/*
+ * Bypass filtering for 1 page only
+ */
+#undef FORCE_LOAD
+
+/*
+ * Locally redirect remote script-redirect URLs
+ */
+#undef FAST_REDIRECTS
+
+/*
+ * Split the show-proxy-args page into a page for each config file.
+ */
+#undef SPLIT_PROXY_ARGS
+
+/*
+ * Kills JavaScript popups - window.open, onunload, etc.
+ */
+#undef KILLPOPUPS
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
+ */
+#undef WEBDAV
+
+/*
+ * Detect image requests automatically for MSIE.  Will fall back to
+ * other image-detection methods (i.e. "+image" permission) for other
+ * browsers.
+ *
+ * You must also define IMAGE_BLOCKING to use this feature.
+ *
+ * It detects the following header pair as an image request:
+ *
+ * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
+ * Accept: * / *
+ *
+ * And the following as a HTML request:
+ *
+ * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
+ * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / *
+ *
+ * And no, I haven't got that backwards - IE is being wierd.
+ *
+ * Known limitations: 
+ * 1) If you press shift-reload on a blocked HTML page, you get
+ *    the image "blocked" page, not the HTML "blocked" page.
+ * 2) Once an image "blocked" page has been sent, viewing it 
+ *    in it's own browser window *should* bring up the HTML
+ *    "blocked" page, but it doesn't.  You need to clear the 
+ *    browser cache to get the HTML version again.
+ *
+ * These limitations are due to IE making inconsistent choices
+ * about which "Accept:" header to send.
+ */
+#undef DETECT_MSIE_IMAGES
+
+/*
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
+ */
+#undef IMAGE_BLOCKING
+
+/*
+ * Allows the use of ACL files to control access to the proxy by IP address.
+ */
+#undef ACL_FILES
+
+/*
+ * Allows the use of trust files.
+ */
+#undef TRUST_FILES
+
+/*
+ * Allows the use of jar files to capture cookies.
+ */
+#undef JAR_FILES
+
+/*
+ * Use PCRE rather than GNU Regex
+ */
+#undef PCRE
+
+/* Define if you have the bcopy function.  */
+#undef HAVE_BCOPY
+
+/* Define if you have the memmove function.  */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+#endif /* _CONFIG_H */
index 0141117..380737b 100755 (executable)
@@ -1,5 +1,6 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
+/* config.h.win - Microsoft Visual C++ version of config.h  */
+#ifndef _CONFIG_H
+#define _CONFIG_H
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/config.h.win,v $
@@ -11,7 +12,7 @@
  *                getting ludicrously long with feature defines.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: config.h.win,v $
- *    Revision 1.18  2002/03/24 17:08:12  jongfoster
- *    Version number bump
+ *    Revision 1.1  2001/06/01 17:56:07  jongfoster
+ *    Removing generated files config.h and pcre/chartables.c
+ *    Now use a custom build step to copy config.h.win to config.h
+ *    New VC++ project pcre/vc_dftables.dsp will generate pcre/chartables.c
+ *    Also adding the new files list.[ch], actions.[ch] to the console build.
  *
- *    Revision 1.17  2002/03/24 13:33:26  swa
- *    name change related issues
- *
- *    Revision 1.16  2002/03/16 14:27:22  jongfoster
- *    Ignoring a very common warning.
- *
- *    Revision 1.15  2002/03/13 00:28:32  jongfoster
- *    Hiding all the warnings generated by #include<windows.h>
- *
- *    Revision 1.14  2001/11/30 21:35:54  jongfoster
- *    Bumping version number to 2.9.10
- *
- *    Revision 1.13  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.12  2001/10/07 15:33:14  oes
- *    Removed FEATURE_DENY_GZIP
- *    Bumped up version number
- *
- *    Revision 1.11  2001/09/16 16:59:34  jongfoster
- *    Bugfix - couldn't build resources with previous version.
- *
- *    Revision 1.10  2001/09/16 16:19:02  jongfoster
- *    New version based on latest configure.in and acconfig.h
- *
- *    Revision 1.9  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/25 19:16:27  oes
- *    Bumping version number to 2.9.8
- *
- *    Revision 1.7  2001/07/21 18:00:07  jongfoster
- *    Bumping version number to 2.9.7
- *
- *    Revision 1.6  2001/07/15 20:08:40  jongfoster
- *    New build files for VC++ which provide the option of POSIX
- *    or Win32 threads.
- *
- *    Revision 1.5  2001/07/15 18:00:46  jongfoster
- *    Renaming STATIC to STATIC_PCRE.
- *    Replacing this file with one built by "configure" from
- *    "config.h.in", for consistency.
- *
- *    Revision 1.6  2001/07/15 17:54:29  jongfoster
- *    Renaming #define STATIC to STATIC_PCRE
- *    Adding new #define FEATURE_PTHREAD that will be used to enable
- *    POSIX threads support.
- *
- *    Revision 1.5  2001/07/13 13:48:37  oes
- *     - (Fix:) Copied CODE_STATUS #define from config.h.in
- *     - split REGEX #define into REGEX_GNU and REGEX_PCRE
- *       and removed PCRE.
- *       (REGEX = REGEX_GNU || REGEX_PCRE per project.h)
- *     - Moved STATIC (for pcre) here from Makefile.in
- *     - Introduced STATIC_PCRS #define to allow for dynaimc linking with
- *       libpcrs
- *     - Removed PCRS #define, since pcrs is now needed for CGI anyway
- *
- *    Revision 1.4  2001/05/29 09:50:24  jongfoster
+ *    Revision 1.6  2001/05/29 09:50:24  jongfoster
  *    Unified blocklist/imagelist/permissionslist.
  *    File format is still under discussion, but the internal changes
  *    are (mostly) done.
  *      if it had been intercepted then it then it would have replaced
  *      it with an image.)
  *
- *    Revision 1.3  2001/05/26 01:26:34  jongfoster
- *    New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
- *    This #define cannot be set from ./configure - there's no point, it
- *    doesn't work yet.  See feature request # 425722
- *
- *    Revision 1.2  2001/05/22 17:43:35  oes
- *
- *    - Enabled filtering banners by size rather than URL
- *      by adding patterns that replace all standard banner
- *      sizes with the "Junkbuster" gif to the re_filterfile
- *
- *    - Enabled filtering WebBugs by providing a pattern
- *      which kills all 1x1 images
- *
- *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
- *      which is selected by the (nonstandard and therefore
- *      capital) letter 'U' in the option string.
- *      It causes the quantifiers to be ungreedy by default.
- *      Appending a ? turns back to greedy (!).
- *
- *    - Added a new interceptor ijb-send-banner, which
- *      sends back the "Junkbuster" gif. Without imagelist or
- *      MSIE detection support, or if tinygif = 1, or the
- *      URL isn't recognized as an imageurl, a lame HTML
- *      explanation is sent instead.
- *
- *    - Added new feature, which permits blocking remote
- *      script redirects and firing back a local redirect
- *      to the browser.
- *      The feature is conditionally compiled, i.e. it
- *      can be disabled with --disable-fast-redirects,
- *      plus it must be activated by a "fast-redirects"
- *      line in the config file, has its own log level
- *      and of course wants to be displayed by show-proxy-args
- *      Note: Boy, all the #ifdefs in 1001 locations and
- *      all the fumbling with configure.in and acconfig.h
- *      were *way* more work than the feature itself :-(
- *
- *    - Because a generic redirect template was needed for
- *      this, tinygif = 3 now uses the same.
- *
- *    - Moved GIFs, and other static HTTP response templates
- *      to project.h
- *
- *    - Many minor fixes
- *
- *    - Removed some >400 CRs again (Jon, you really worked
- *      a lot! ;-)
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:45  oes
+ *    Revision 1.5  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.4  2001/05/25 22:17:28  jongfoster
+ *    Resurrecting these files which are required for the MS Visual C++
+ *    build only.
+ *
+ *    Revision 1.2  2001/05/20 01:21:20  jongfoster
+ *    Version 2.9.4 checkin.
+ *    - Merged popupfile and cookiefile, and added control over PCRS
+ *      filtering, in new "permissionsfile".
+ *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
+ *      file error you now get a message box (in the Win32 GUI) rather
+ *      than the program exiting with no explanation.
+ *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
+ *      skipping.
+ *    - Removed tabs from "config"
+ *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
+ *    - Bumped up version number.
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:58:49  oes
  *    Initial import of version 2.9.3 source tree
  *
  *
  *********************************************************************/
 \f
 
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
 /*
  * Version number - Major (X._._)
  */
 /*
  * Version number - Point (_._.X)
  */
-#define VERSION_POINT 13
+#define VERSION_POINT 4
 
 /*
  * Version number, as a string
  */
-#define VERSION "2.9.13"
+#define VERSION "2.9.4"
 
 /*
  * Status of the code: alpha, beta or stable
  */
-#define CODE_STATUS "beta"
+#define CODE_STATUS "alpha"
 
 /*
- * Regular expression matching for URLs.  (Highly recommended).
- * If neither of these are defined then you can ony use prefix matching.
- * Don't bother to change this here! Use configure instead.
+ * Regular expression matching for URLs.  (Highly recommended).  If this is 
+ * not defined then you can ony use prefix matching.
  */
-/* #define REGEX_GNU 1 */
-#define REGEX_PCRE 1
+#define REGEX 1
 
-/* 
- * Should pcre be statically built in instead of linkling with libpcre?
- * (This is determined by configure depending on the availiability of
- * libpcre and user preferences). The name is ugly, but pcre needs it.
- * Don't bother to change this here! Use configure instead.
+/*
+ * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
+ * non-anonymizing proxy.  This is useful if you're trying to access a
+ * blocked or broken site - just change the setting in the config file
+ * and send a SIGHUP (UN*X), or use the handy "Disable" menu option (Windows
+ * GUI).
  */
-#define STATIC_PCRE 1
+#define TOGGLE 1
 
-/* 
- * Should pcrs be statically built in instead of linkling with libpcrs?
- * (This is determined by configure depending on the availiability of
- * libpcrs and user preferences).
- * Don't bother to change this here! Use configure instead.
+/*
+ * Enables arbitrary content modification regexps
  */
-#define STATIC_PCRS 1
+#define PCRS 1
 
 /*
- * Allows the use of an ACL to control access to the proxy by IP address.
+ * If a stream is compressed via gzip (Netscape specific I think), then
+ * it cannot be modified with Perl regexps.  This forces it to be 
+ * uncompressed.
  */
-#define FEATURE_ACL 1
+#define DENY_GZIP 1
 
 /*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
+ * Enables statistics function.
  */
-#define FEATURE_CGI_EDIT_ACTIONS 1
+#define STATISTICS 1
 
 /*
- * Allows the use of jar files to capture cookies.
+ * Bypass filtering for 1 page only
  */
-#define FEATURE_COOKIE_JAR 1
+#define FORCE_LOAD 1
 
 /*
  * Locally redirect remote script-redirect URLs
  */
-#define FEATURE_FAST_REDIRECTS 1
+#define FAST_REDIRECTS 1
 
 /*
- * Bypass filtering for 1 page only
+ * Split the show-proxy-args page into a page for each config file.
  */
-#define FEATURE_FORCE_LOAD 1
+#define SPLIT_PROXY_ARGS 1
 
 /*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
+ * Kills JavaScript popups - window.open, onunload, etc.
  */
-#define FEATURE_IMAGE_BLOCKING 1
+#define KILLPOPUPS 1
+
+/*
+ * Support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail
+ */
+#define WEBDAV 1
 
 /*
  * Detect image requests automatically for MSIE.  Will fall back to
  * other image-detection methods (i.e. "+image" permission) for other
  * browsers.
  *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
+ * You must also define IMAGE_BLOCKING to use this feature.
  *
  * It detects the following header pair as an image request:
  *
  * These limitations are due to IE making inconsistent choices
  * about which "Accept:" header to send.
  */
-#define FEATURE_IMAGE_DETECT_MSIE 1
+#define DETECT_MSIE_IMAGES 1
 
 /*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
-
-/*
- * Use POSIX threads instead of native threads.
- */
-#define FEATURE_PTHREAD 1
-
-/*
- * Enables statistics function.
+ * Allow blocking using images as well as HTML.
+ * If you do not define this then everything is blocked as HTML.
+ *
+ * Note that this is required if you want to use DETECT_MSIE_IMAGES.
  */
-#define FEATURE_STATISTICS 1
+#define IMAGE_BLOCKING 1
 
 /*
- * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
+ * Allows the use of ACL files to control access to the proxy by IP address.
  */
-#define FEATURE_TOGGLE 1
+#define ACL_FILES 1
 
 /*
  * Allows the use of trust files.
  */
-#define FEATURE_TRUST 1
-
-
-/****************************************************************************
- * The following values are correct for MS VC++97.
- * You should normally not change them.
- ***************************************************************************/
-
-
-/*
- * Defined on Solaris only.  Makes the system libraries thread safe.
- */
-/* #define _REENTRANT 1 */
+#define TRUST_FILES 1
 
 /*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
+ * Allows the use of jar files to capture cookies.
  */
-/* #define __EXTENSIONS__ 1 */
+#define JAR_FILES 1
 
 /*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
+ * Use PCRE rather than GNU Regex
  */
-#define __MT__ 1
-
+#define PCRE 1
 
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
+/* Define if you have the bcopy function.  */
+#define HAVE_BCOPY 1
 
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
-
-/* Define if you have the `memmove' function. */
+/* Define if you have the memmove function.  */
 #define HAVE_MEMMOVE 1
 
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <stdint.h> header file. */
-/* #define HAVE_STDINT_H 1 */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
+/* Define if you have the strerror function.  */
 #define HAVE_STRERROR 1
 
-/* Define if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/* #define HAVE_UNISTD_H 1 */
-
-/* The size of a `char *', as computed by sizeof. */
-#define SIZEOF_CHAR_P 4
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of a `long long', as computed by sizeof. */
-/* #define SIZEOF_LONG_LONG ---not supported--- */
-
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #define const */
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-/* #define size_t unsigned */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-/* Don't define for MS VC++ or you don't get strdup() declared.
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
-*/
-
-/*
- * Need to set up this define only for the Pthreads library for
- * Win32, available from http://sources.redhat.com/pthreads-win32/
- */
-#if defined(FEATURE_PTHREAD) && defined(_WIN32)
-#define __CLEANUP_C
-#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
-
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED))
-#error This file is only intended for MS VC++ on Win32.  For other compilers, please run configure.
-#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */
-
-#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 )
-
-/*
- * C4100 : unreferenced formal parameter
- * Very common, not a bug
- * 
- * C4115 : named type definition in parentheses
- * #include <windows.h> causes a warning about one of these.
- *
- * C4201 : nonstandard extension used : nameless struct/union
- * Endemic in <windows.h>
- *
- * C4214 nonstandard extension used : bit field types other than int
- * Endemic in <windows.h>
- *
- * C4244 conversion from 'int' to 'char', possible loss of data
- * Should really fix this one.  Throughout the JB code.
- *
- * C4514 unreferenced inline/local function has been removed
- * Caused by #include <windows.h>
- */
-
-#endif /* CONFIG_H_INCLUDED */
-
+#endif /* _CONFIG_H */
diff --git a/config.h.win32threads.win b/config.h.win32threads.win
deleted file mode 100644 (file)
index ac28b76..0000000
+++ /dev/null
@@ -1,469 +0,0 @@
-#ifndef CONFIG_H_INCLUDED
-#define CONFIG_H_INCLUDED
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/config.h.win32threads.win,v $
- *
- * Purpose     :  This file should be the first thing included in every
- *                .c file.  (Before even system headers).  It contains 
- *                #define statements for various features.  It was
- *                introduced because the compile command line started
- *                getting ludicrously long with feature defines.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: config.h.win32threads.win,v $
- *    Revision 1.13  2002/03/24 17:08:12  jongfoster
- *    Version number bump
- *
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/16 14:27:22  jongfoster
- *    Ignoring a very common warning.
- *
- *    Revision 1.10  2002/03/13 00:28:32  jongfoster
- *    Hiding all the warnings generated by #include<windows.h>
- *
- *    Revision 1.9  2001/11/30 21:35:54  jongfoster
- *    Bumping version number to 2.9.10
- *
- *    Revision 1.8  2001/10/23 21:24:09  jongfoster
- *    Support for FEATURE_CGI_EDIT_ACTIONS
- *
- *    Revision 1.7  2001/10/07 15:33:14  oes
- *    Removed FEATURE_DENY_GZIP
- *    Bumped up version number
- *
- *    Revision 1.6  2001/09/16 16:59:34  jongfoster
- *    Bugfix - couldn't build resources with previous version.
- *
- *    Revision 1.5  2001/09/16 16:19:02  jongfoster
- *    New version based on latest configure.in and acconfig.h
- *
- *    Revision 1.9  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/25 19:16:27  oes
- *    Bumping version number to 2.9.8
- *
- *    Revision 1.7  2001/07/21 18:00:07  jongfoster
- *    Bumping version number to 2.9.7
- *
- *    Revision 1.6  2001/07/15 20:08:40  jongfoster
- *    New build files for VC++ which provide the option of POSIX
- *    or Win32 threads.
- *
- *    Revision 1.5  2001/07/15 18:00:46  jongfoster
- *    Renaming STATIC to STATIC_PCRE.
- *    Replacing this file with one built by "configure" from
- *    "config.h.in", for consistency.
- *
- *    Revision 1.6  2001/07/15 17:54:29  jongfoster
- *    Renaming #define STATIC to STATIC_PCRE
- *    Adding new #define FEATURE_PTHREAD that will be used to enable
- *    POSIX threads support.
- *
- *    Revision 1.5  2001/07/13 13:48:37  oes
- *     - (Fix:) Copied CODE_STATUS #define from config.h.in
- *     - split REGEX #define into REGEX_GNU and REGEX_PCRE
- *       and removed PCRE.
- *       (REGEX = REGEX_GNU || REGEX_PCRE per project.h)
- *     - Moved STATIC (for pcre) here from Makefile.in
- *     - Introduced STATIC_PCRS #define to allow for dynaimc linking with
- *       libpcrs
- *     - Removed PCRS #define, since pcrs is now needed for CGI anyway
- *
- *    Revision 1.4  2001/05/29 09:50:24  jongfoster
- *    Unified blocklist/imagelist/permissionslist.
- *    File format is still under discussion, but the internal changes
- *    are (mostly) done.
- *
- *    Also modified interceptor behaviour:
- *    - We now intercept all URLs beginning with one of the following
- *      prefixes (and *only* these prefixes):
- *        * http://i.j.b/
- *        * http://ijbswa.sf.net/config/
- *        * http://ijbswa.sourceforge.net/config/
- *    - New interceptors "home page" - go to http://i.j.b/ to see it.
- *    - Internal changes so that intercepted and fast redirect pages
- *      are not replaced with an image.
- *    - Interceptors now have the option to send a binary page direct
- *      to the client. (i.e. ijb-send-banner uses this)
- *    - Implemented show-url-info interceptor.  (Which is why I needed
- *      the above interceptors changes - a typical URL is
- *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
- *      The previous mechanism would not have intercepted that, and
- *      if it had been intercepted then it then it would have replaced
- *      it with an image.)
- *
- *    Revision 1.3  2001/05/26 01:26:34  jongfoster
- *    New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
- *    This #define cannot be set from ./configure - there's no point, it
- *    doesn't work yet.  See feature request # 425722
- *
- *    Revision 1.2  2001/05/22 17:43:35  oes
- *
- *    - Enabled filtering banners by size rather than URL
- *      by adding patterns that replace all standard banner
- *      sizes with the "Junkbuster" gif to the re_filterfile
- *
- *    - Enabled filtering WebBugs by providing a pattern
- *      which kills all 1x1 images
- *
- *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
- *      which is selected by the (nonstandard and therefore
- *      capital) letter 'U' in the option string.
- *      It causes the quantifiers to be ungreedy by default.
- *      Appending a ? turns back to greedy (!).
- *
- *    - Added a new interceptor ijb-send-banner, which
- *      sends back the "Junkbuster" gif. Without imagelist or
- *      MSIE detection support, or if tinygif = 1, or the
- *      URL isn't recognized as an imageurl, a lame HTML
- *      explanation is sent instead.
- *
- *    - Added new feature, which permits blocking remote
- *      script redirects and firing back a local redirect
- *      to the browser.
- *      The feature is conditionally compiled, i.e. it
- *      can be disabled with --disable-fast-redirects,
- *      plus it must be activated by a "fast-redirects"
- *      line in the config file, has its own log level
- *      and of course wants to be displayed by show-proxy-args
- *      Note: Boy, all the #ifdefs in 1001 locations and
- *      all the fumbling with configure.in and acconfig.h
- *      were *way* more work than the feature itself :-(
- *
- *    - Because a generic redirect template was needed for
- *      this, tinygif = 3 now uses the same.
- *
- *    - Moved GIFs, and other static HTTP response templates
- *      to project.h
- *
- *    - Many minor fixes
- *
- *    - Removed some >400 CRs again (Jon, you really worked
- *      a lot! ;-)
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:45  oes
- *    Initial import of version 2.9.3 source tree
- *
- *
- *********************************************************************/
-\f
-
-/*
- * Version number - Major (X._._)
- */
-#define VERSION_MAJOR 2
-
-/*
- * Version number - Minor (_.X._)
- */
-#define VERSION_MINOR 9
-
-/*
- * Version number - Point (_._.X)
- */
-#define VERSION_POINT 13
-
-/*
- * Version number, as a string
- */
-#define VERSION "2.9.13"
-
-/*
- * Status of the code: alpha, beta or stable
- */
-#define CODE_STATUS "beta"
-
-/*
- * Regular expression matching for URLs.  (Highly recommended).
- * If neither of these are defined then you can ony use prefix matching.
- * Don't bother to change this here! Use configure instead.
- */
-/* #define REGEX_GNU 1 */
-#define REGEX_PCRE 1
-
-/* 
- * Should pcre be statically built in instead of linkling with libpcre?
- * (This is determined by configure depending on the availiability of
- * libpcre and user preferences). The name is ugly, but pcre needs it.
- * Don't bother to change this here! Use configure instead.
- */
-#define STATIC_PCRE 1
-
-/* 
- * Should pcrs be statically built in instead of linkling with libpcrs?
- * (This is determined by configure depending on the availiability of
- * libpcrs and user preferences).
- * Don't bother to change this here! Use configure instead.
- */
-#define STATIC_PCRS 1
-
-/*
- * Allows the use of an ACL to control access to the proxy by IP address.
- */
-#define FEATURE_ACL 1
-
-/*
- * Enables the web-based configuration (actionsfile) editor.  If you
- * have a shared proxy, you might want to turn this off.
- */
-#define FEATURE_CGI_EDIT_ACTIONS 1
-
-/*
- * Allows the use of jar files to capture cookies.
- */
-#define FEATURE_COOKIE_JAR 1
-
-/*
- * Locally redirect remote script-redirect URLs
- */
-#define FEATURE_FAST_REDIRECTS 1
-
-/*
- * Bypass filtering for 1 page only
- */
-#define FEATURE_FORCE_LOAD 1
-
-/*
- * Allow blocking using images as well as HTML.
- * If you do not define this then everything is blocked as HTML.
- *
- * Note that this is required if you want to use FEATURE_IMAGE_DETECT_MSIE.
- */
-#define FEATURE_IMAGE_BLOCKING 1
-
-/*
- * Detect image requests automatically for MSIE.  Will fall back to
- * other image-detection methods (i.e. "+image" permission) for other
- * browsers.
- *
- * You must also define FEATURE_IMAGE_BLOCKING to use this feature.
- *
- * It detects the following header pair as an image request:
- *
- * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
- * Accept: * / *
- *
- * And the following as a HTML request:
- *
- * User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
- * Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, * / *
- *
- * And no, I haven't got that backwards - IE is being wierd.
- *
- * Known limitations: 
- * 1) If you press shift-reload on a blocked HTML page, you get
- *    the image "blocked" page, not the HTML "blocked" page.
- * 2) Once an image "blocked" page has been sent, viewing it 
- *    in it's own browser window *should* bring up the HTML
- *    "blocked" page, but it doesn't.  You need to clear the 
- *    browser cache to get the HTML version again.
- *
- * These limitations are due to IE making inconsistent choices
- * about which "Accept:" header to send.
- */
-#define FEATURE_IMAGE_DETECT_MSIE 1
-
-/*
- * Kills JavaScript popups - window.open, onunload, etc.
- */
-#define FEATURE_KILL_POPUPS 1
-
-/*
- * Use POSIX threads instead of native threads.
- */
-/* #define FEATURE_PTHREAD 1 */
-
-/*
- * Enables statistics function.
- */
-#define FEATURE_STATISTICS 1
-
-/*
- * Allow JunkBuster to be "disabled" so it is just a normal non-blocking
- * non-anonymizing proxy.  This is useful if you're trying to access a
- * blocked or broken site - just change the setting in the config file,
- * or use the handy "Disable" menu option in the Windows GUI.
- */
-#define FEATURE_TOGGLE 1
-
-/*
- * Allows the use of trust files.
- */
-#define FEATURE_TRUST 1
-
-
-/****************************************************************************
- * The following values are correct for MS VC++97.
- * You should normally not change them.
- ***************************************************************************/
-
-
-/*
- * Defined on Solaris only.  Makes the system libraries thread safe.
- */
-/* #define _REENTRANT 1 */
-
-/*
- * Defined on Solaris only.  Without this, many important functions are not
- * defined in the system headers.
- */
-/* #define __EXTENSIONS__ 1 */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with MultiThreading?)
- */
-#define __MT__ 1
-
-
-/* Define if you have the `bcopy' function. */
-/* #define HAVE_BCOPY 1 */
-
-/* Define if you have the <inttypes.h> header file. */
-/* #define HAVE_INTTYPES_H 1 */
-
-/* Define if you have the `memmove' function. */
-#define HAVE_MEMMOVE 1
-
-/* Define if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define if you have the <stdint.h> header file. */
-/* #define HAVE_STDINT_H 1 */
-
-/* Define if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the `strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if you have the <unistd.h> header file. */
-/* #define HAVE_UNISTD_H 1 */
-
-/* The size of a `char *', as computed by sizeof. */
-#define SIZEOF_CHAR_P 4
-
-/* The size of a `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of a `long', as computed by sizeof. */
-#define SIZEOF_LONG 4
-
-/* The size of a `long long', as computed by sizeof. */
-/* #define SIZEOF_LONG_LONG ---not supported--- */
-
-/* The size of a `size_t', as computed by sizeof. */
-#define SIZEOF_SIZE_T 4
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #define const */
-
-/* Define to `unsigned' if <sys/types.h> does not define. */
-/* #define size_t unsigned */
-
-/*
- * Defined always.
- * FIXME: Don't know what it does or why we need it.
- * (presumably something to do with ANSI Standard C?)
- */
-/* Don't define for MS VC++ or you don't get strdup() declared.
-#ifndef __STDC__
-#define __STDC__ 1
-#endif
-*/
-
-/*
- * Need to set up this define only for the Pthreads library for
- * Win32, available from http://sources.redhat.com/pthreads-win32/
- */
-#if defined(FEATURE_PTHREAD) && defined(_WIN32)
-#define __CLEANUP_C
-#endif /* defined(FEATURE_PTHREAD) && defined(_WIN32) */
-
-/*
- * BEOS does not currently support POSIX threads.
- * This *should* be detected by ./configure, but let's be sure.
- */
-#if defined(FEATURE_PTHREAD) && defined(__BEOS__)
-#error BEOS does not support pthread - please run ./configure again with "--disable-pthread"
-
-#endif /* defined(FEATURE_PTHREAD) && defined(__BEOS__) */
-
-
-#if (!defined(_MSC_VER)) && (!defined(RC_INVOKED))
-#error This file is only intended for MS VC++ on Win32.  For other compilers, please run configure.
-#endif /* (!defined(_MSC_VER)) && (!defined(RC_INVOKED)) */
-
-#pragma warning ( disable: 4100 4115 4201 4214 4244 4514 )
-
-/*
- * C4100 : unreferenced formal parameter
- * Very common, not a bug
- * 
- * C4115 : named type definition in parentheses
- * #include <windows.h> causes a warning about one of these.
- *
- * C4201 : nonstandard extension used : nameless struct/union
- * Endemic in <windows.h>
- *
- * C4214 nonstandard extension used : bit field types other than int
- * Endemic in <windows.h>
- *
- * C4244 conversion from 'int' to 'char', possible loss of data
- * Should really fix this one.  Throughout the JB code.
- *
- * C4514 unreferenced inline/local function has been removed
- * Caused by #include <windows.h>
- */
-
-
-#endif /* CONFIG_H_INCLUDED */
-
diff --git a/config.sub b/config.sub
deleted file mode 100755 (executable)
index 12ebc78..0000000
+++ /dev/null
@@ -1,1410 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-#   Free Software Foundation, Inc.
-
-timestamp='2001-08-13'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
-    --version | -v )
-       echo "$version" ; exit 0 ;;
-    --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit 0;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-       -sun*os*)
-               # Prevent following clause from handling this invalid input.
-               ;;
-       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis)
-               os=
-               basic_machine=$1
-               ;;
-       -sim | -cisco | -oki | -wec | -winbond)
-               os=
-               basic_machine=$1
-               ;;
-       -scout)
-               ;;
-       -wrs)
-               os=-vxworks
-               basic_machine=$1
-               ;;
-       -chorusos*)
-               os=-chorusos
-               basic_machine=$1
-               ;;
-       -chorusrdb)
-               os=-chorusrdb
-               basic_machine=$1
-               ;;
-       -hiux*)
-               os=-hiuxwe2
-               ;;
-       -sco5)
-               os=-sco3.2v5
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco4)
-               os=-sco3.2v4
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2.[4-9]*)
-               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2v[4-9]*)
-               # Don't forget version if it is 3.2v4 or newer.
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco*)
-               os=-sco3.2v2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -udk*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -isc)
-               os=-isc2.2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -clix*)
-               basic_machine=clipper-intergraph
-               ;;
-       -isc*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -lynx*)
-               os=-lynxos
-               ;;
-       -ptx*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-               ;;
-       -windowsnt*)
-               os=`echo $os | sed -e 's/windowsnt/winnt/'`
-               ;;
-       -psos*)
-               os=-psos
-               ;;
-       -mint | -mint[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-       # Recognize the basic CPU types without company name.
-       # Some are omitted here because they have special meanings below.
-       1750a | 580 \
-       | a29k \
-       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
-       | c4x | clipper \
-       | d10v | d30v | dsp16xx \
-       | fr30 \
-       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-       | i370 | i860 | i960 | ia64 \
-       | m32r | m68000 | m68k | m88k | mcore \
-       | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
-       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
-       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
-       | mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \
-       | mn10200 | mn10300 \
-       | ns16k | ns32k \
-       | openrisc \
-       | pdp10 | pdp11 | pj | pjl \
-       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-       | pyramid \
-       | s390 | s390x \
-       | sh | sh[34] | sh[34]eb | shbe | shle \
-       | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
-       | strongarm \
-       | tahoe | thumb | tic80 | tron \
-       | v850 \
-       | we32k \
-       | x86 | xscale \
-       | z8k)
-               basic_machine=$basic_machine-unknown
-               ;;
-       m6811 | m68hc11 | m6812 | m68hc12)
-               # Motorola 68HC11/12.
-               basic_machine=$basic_machine-unknown
-               os=-none
-               ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-               ;;
-
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
-       i*86 | x86_64)
-         basic_machine=$basic_machine-pc
-         ;;
-       # Object if more than one company name word.
-       *-*-*)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-       # Recognize the basic CPU types with company name.
-       580-* \
-       | a29k-* \
-       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-       | alphapca5[67]-* | arc-* \
-       | arm-*  | armbe-* | armle-* | armv*-* \
-       | bs2000-* \
-       | c[123]* | c30-* | [cjt]90-* | c54x-* \
-       | clipper-* | cray2-* | cydra-* \
-       | d10v-* | d30v-* \
-       | elxsi-* \
-       | f30[01]-* | f700-* | fr30-* | fx80-* \
-       | h8300-* | h8500-* \
-       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-       | i*86-* | i860-* | i960-* | ia64-* \
-       | m32r-* \
-       | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
-       | m88110-* | m88k-* | mcore-* \
-       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
-       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
-       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \
-       | mipsle-* | mipstx39-* | mipstx39el-* \
-       | none-* | np1-* | ns16k-* | ns32k-* \
-       | orion-* \
-       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-       | pyramid-* \
-       | romp-* | rs6000-* \
-       | s390-* | s390x-* \
-       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
-       | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
-       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \
-       | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
-       | v850-* | vax-* \
-       | we32k-* \
-       | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
-       | ymp-* \
-       | z8k-*)
-               ;;
-       # Recognize the various machine names and aliases which stand
-       # for a CPU type and a company and sometimes even an OS.
-       386bsd)
-               basic_machine=i386-unknown
-               os=-bsd
-               ;;
-       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-               basic_machine=m68000-att
-               ;;
-       3b*)
-               basic_machine=we32k-att
-               ;;
-       a29khif)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       adobe68k)
-               basic_machine=m68010-adobe
-               os=-scout
-               ;;
-       alliant | fx80)
-               basic_machine=fx80-alliant
-               ;;
-       altos | altos3068)
-               basic_machine=m68k-altos
-               ;;
-       am29k)
-               basic_machine=a29k-none
-               os=-bsd
-               ;;
-       amdahl)
-               basic_machine=580-amdahl
-               os=-sysv
-               ;;
-       amiga | amiga-*)
-               basic_machine=m68k-unknown
-               ;;
-       amigaos | amigados)
-               basic_machine=m68k-unknown
-               os=-amigaos
-               ;;
-       amigaunix | amix)
-               basic_machine=m68k-unknown
-               os=-sysv4
-               ;;
-       apollo68)
-               basic_machine=m68k-apollo
-               os=-sysv
-               ;;
-       apollo68bsd)
-               basic_machine=m68k-apollo
-               os=-bsd
-               ;;
-       aux)
-               basic_machine=m68k-apple
-               os=-aux
-               ;;
-       balance)
-               basic_machine=ns32k-sequent
-               os=-dynix
-               ;;
-       convex-c1)
-               basic_machine=c1-convex
-               os=-bsd
-               ;;
-       convex-c2)
-               basic_machine=c2-convex
-               os=-bsd
-               ;;
-       convex-c32)
-               basic_machine=c32-convex
-               os=-bsd
-               ;;
-       convex-c34)
-               basic_machine=c34-convex
-               os=-bsd
-               ;;
-       convex-c38)
-               basic_machine=c38-convex
-               os=-bsd
-               ;;
-       cray | ymp)
-               basic_machine=ymp-cray
-               os=-unicos
-               ;;
-       cray2)
-               basic_machine=cray2-cray
-               os=-unicos
-               ;;
-       [cjt]90)
-               basic_machine=${basic_machine}-cray
-               os=-unicos
-               ;;
-       crds | unos)
-               basic_machine=m68k-crds
-               ;;
-       cris | cris-* | etrax*)
-               basic_machine=cris-axis
-               ;;
-       da30 | da30-*)
-               basic_machine=m68k-da30
-               ;;
-       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-               basic_machine=mips-dec
-               ;;
-       delta | 3300 | motorola-3300 | motorola-delta \
-             | 3300-motorola | delta-motorola)
-               basic_machine=m68k-motorola
-               ;;
-       delta88)
-               basic_machine=m88k-motorola
-               os=-sysv3
-               ;;
-       dpx20 | dpx20-*)
-               basic_machine=rs6000-bull
-               os=-bosx
-               ;;
-       dpx2* | dpx2*-bull)
-               basic_machine=m68k-bull
-               os=-sysv3
-               ;;
-       ebmon29k)
-               basic_machine=a29k-amd
-               os=-ebmon
-               ;;
-       elxsi)
-               basic_machine=elxsi-elxsi
-               os=-bsd
-               ;;
-       encore | umax | mmax)
-               basic_machine=ns32k-encore
-               ;;
-       es1800 | OSE68k | ose68k | ose | OSE)
-               basic_machine=m68k-ericsson
-               os=-ose
-               ;;
-       fx2800)
-               basic_machine=i860-alliant
-               ;;
-       genix)
-               basic_machine=ns32k-ns
-               ;;
-       gmicro)
-               basic_machine=tron-gmicro
-               os=-sysv
-               ;;
-       go32)
-               basic_machine=i386-pc
-               os=-go32
-               ;;
-       h3050r* | hiux*)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       h8300hms)
-               basic_machine=h8300-hitachi
-               os=-hms
-               ;;
-       h8300xray)
-               basic_machine=h8300-hitachi
-               os=-xray
-               ;;
-       h8500hms)
-               basic_machine=h8500-hitachi
-               os=-hms
-               ;;
-       harris)
-               basic_machine=m88k-harris
-               os=-sysv3
-               ;;
-       hp300-*)
-               basic_machine=m68k-hp
-               ;;
-       hp300bsd)
-               basic_machine=m68k-hp
-               os=-bsd
-               ;;
-       hp300hpux)
-               basic_machine=m68k-hp
-               os=-hpux
-               ;;
-       hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k2[0-9][0-9] | hp9k31[0-9])
-               basic_machine=m68000-hp
-               ;;
-       hp9k3[2-9][0-9])
-               basic_machine=m68k-hp
-               ;;
-       hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k78[0-9] | hp78[0-9])
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][13679] | hp8[0-9][13679])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hppa-next)
-               os=-nextstep3
-               ;;
-       hppaosf)
-               basic_machine=hppa1.1-hp
-               os=-osf
-               ;;
-       hppro)
-               basic_machine=hppa1.1-hp
-               os=-proelf
-               ;;
-       i370-ibm* | ibm*)
-               basic_machine=i370-ibm
-               ;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-       i*86v32)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
-               ;;
-       i*86v4*)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
-               ;;
-       i*86v)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv
-               ;;
-       i*86sol2)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-       i386mach)
-               basic_machine=i386-mach
-               os=-mach
-               ;;
-       i386-vsta | vsta)
-               basic_machine=i386-unknown
-               os=-vsta
-               ;;
-       iris | iris4d)
-               basic_machine=mips-sgi
-               case $os in
-                   -irix*)
-                       ;;
-                   *)
-                       os=-irix4
-                       ;;
-               esac
-               ;;
-       isi68 | isi)
-               basic_machine=m68k-isi
-               os=-sysv
-               ;;
-       m88k-omron*)
-               basic_machine=m88k-omron
-               ;;
-       magnum | m3230)
-               basic_machine=mips-mips
-               os=-sysv
-               ;;
-       merlin)
-               basic_machine=ns32k-utek
-               os=-sysv
-               ;;
-       mingw32)
-               basic_machine=i386-pc
-               os=-mingw32
-               ;;
-       miniframe)
-               basic_machine=m68000-convergent
-               ;;
-       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-       mipsel*-linux*)
-               basic_machine=mipsel-unknown
-               os=-linux-gnu
-               ;;
-       mips*-linux*)
-               basic_machine=mips-unknown
-               os=-linux-gnu
-               ;;
-       mips3*-*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-               ;;
-       mips3*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-               ;;
-       mmix*)
-               basic_machine=mmix-knuth
-               os=-mmixware
-               ;;
-       monitor)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       msdos)
-               basic_machine=i386-pc
-               os=-msdos
-               ;;
-       mvs)
-               basic_machine=i370-ibm
-               os=-mvs
-               ;;
-       ncr3000)
-               basic_machine=i486-ncr
-               os=-sysv4
-               ;;
-       netbsd386)
-               basic_machine=i386-unknown
-               os=-netbsd
-               ;;
-       netwinder)
-               basic_machine=armv4l-rebel
-               os=-linux
-               ;;
-       news | news700 | news800 | news900)
-               basic_machine=m68k-sony
-               os=-newsos
-               ;;
-       news1000)
-               basic_machine=m68030-sony
-               os=-newsos
-               ;;
-       news-3600 | risc-news)
-               basic_machine=mips-sony
-               os=-newsos
-               ;;
-       necv70)
-               basic_machine=v70-nec
-               os=-sysv
-               ;;
-       next | m*-next )
-               basic_machine=m68k-next
-               case $os in
-                   -nextstep* )
-                       ;;
-                   -ns2*)
-                     os=-nextstep2
-                       ;;
-                   *)
-                     os=-nextstep3
-                       ;;
-               esac
-               ;;
-       nh3000)
-               basic_machine=m68k-harris
-               os=-cxux
-               ;;
-       nh[45]000)
-               basic_machine=m88k-harris
-               os=-cxux
-               ;;
-       nindy960)
-               basic_machine=i960-intel
-               os=-nindy
-               ;;
-       mon960)
-               basic_machine=i960-intel
-               os=-mon960
-               ;;
-       nonstopux)
-               basic_machine=mips-compaq
-               os=-nonstopux
-               ;;
-       np1)
-               basic_machine=np1-gould
-               ;;
-       nsr-tandem)
-               basic_machine=nsr-tandem
-               ;;
-       op50n-* | op60c-*)
-               basic_machine=hppa1.1-oki
-               os=-proelf
-               ;;
-       OSE68000 | ose68000)
-               basic_machine=m68000-ericsson
-               os=-ose
-               ;;
-       os68k)
-               basic_machine=m68k-none
-               os=-os68k
-               ;;
-       pa-hitachi)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       paragon)
-               basic_machine=i860-intel
-               os=-osf
-               ;;
-       pbd)
-               basic_machine=sparc-tti
-               ;;
-       pbb)
-               basic_machine=m68k-tti
-               ;;
-        pc532 | pc532-*)
-               basic_machine=ns32k-pc532
-               ;;
-       pentium | p5 | k5 | k6 | nexgen)
-               basic_machine=i586-pc
-               ;;
-       pentiumpro | p6 | 6x86 | athlon)
-               basic_machine=i686-pc
-               ;;
-       pentiumii | pentium2)
-               basic_machine=i686-pc
-               ;;
-       pentium-* | p5-* | k5-* | k6-* | nexgen-*)
-               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumpro-* | p6-* | 6x86-* | athlon-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumii-* | pentium2-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pn)
-               basic_machine=pn-gould
-               ;;
-       power)  basic_machine=power-ibm
-               ;;
-       ppc)    basic_machine=powerpc-unknown
-               ;;
-       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppcle | powerpclittle | ppc-le | powerpc-little)
-               basic_machine=powerpcle-unknown
-               ;;
-       ppcle-* | powerpclittle-*)
-               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64)  basic_machine=powerpc64-unknown
-               ;;
-       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-               basic_machine=powerpc64le-unknown
-               ;;
-       ppc64le-* | powerpc64little-*)
-               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ps2)
-               basic_machine=i386-ibm
-               ;;
-       pw32)
-               basic_machine=i586-unknown
-               os=-pw32
-               ;;
-       rom68k)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       rm[46]00)
-               basic_machine=mips-siemens
-               ;;
-       rtpc | rtpc-*)
-               basic_machine=romp-ibm
-               ;;
-       sa29200)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       sequent)
-               basic_machine=i386-sequent
-               ;;
-       sh)
-               basic_machine=sh-hitachi
-               os=-hms
-               ;;
-       sparclite-wrs)
-               basic_machine=sparclite-wrs
-               os=-vxworks
-               ;;
-       sps7)
-               basic_machine=m68k-bull
-               os=-sysv2
-               ;;
-       spur)
-               basic_machine=spur-unknown
-               ;;
-       st2000)
-               basic_machine=m68k-tandem
-               ;;
-       stratus)
-               basic_machine=i860-stratus
-               os=-sysv4
-               ;;
-       sun2)
-               basic_machine=m68000-sun
-               ;;
-       sun2os3)
-               basic_machine=m68000-sun
-               os=-sunos3
-               ;;
-       sun2os4)
-               basic_machine=m68000-sun
-               os=-sunos4
-               ;;
-       sun3os3)
-               basic_machine=m68k-sun
-               os=-sunos3
-               ;;
-       sun3os4)
-               basic_machine=m68k-sun
-               os=-sunos4
-               ;;
-       sun4os3)
-               basic_machine=sparc-sun
-               os=-sunos3
-               ;;
-       sun4os4)
-               basic_machine=sparc-sun
-               os=-sunos4
-               ;;
-       sun4sol2)
-               basic_machine=sparc-sun
-               os=-solaris2
-               ;;
-       sun3 | sun3-*)
-               basic_machine=m68k-sun
-               ;;
-       sun4)
-               basic_machine=sparc-sun
-               ;;
-       sun386 | sun386i | roadrunner)
-               basic_machine=i386-sun
-               ;;
-       sv1)
-               basic_machine=sv1-cray
-               os=-unicos
-               ;;
-       symmetry)
-               basic_machine=i386-sequent
-               os=-dynix
-               ;;
-       t3e)
-               basic_machine=t3e-cray
-               os=-unicos
-               ;;
-       tic54x | c54x*)
-               basic_machine=tic54x-unknown
-               os=-coff
-               ;;
-       tx39)
-               basic_machine=mipstx39-unknown
-               ;;
-       tx39el)
-               basic_machine=mipstx39el-unknown
-               ;;
-       tower | tower-32)
-               basic_machine=m68k-ncr
-               ;;
-       udi29k)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       ultra3)
-               basic_machine=a29k-nyu
-               os=-sym1
-               ;;
-       v810 | necv810)
-               basic_machine=v810-nec
-               os=-none
-               ;;
-       vaxv)
-               basic_machine=vax-dec
-               os=-sysv
-               ;;
-       vms)
-               basic_machine=vax-dec
-               os=-vms
-               ;;
-       vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
-               ;;
-       vxworks960)
-               basic_machine=i960-wrs
-               os=-vxworks
-               ;;
-       vxworks68)
-               basic_machine=m68k-wrs
-               os=-vxworks
-               ;;
-       vxworks29k)
-               basic_machine=a29k-wrs
-               os=-vxworks
-               ;;
-       w65*)
-               basic_machine=w65-wdc
-               os=-none
-               ;;
-       w89k-*)
-               basic_machine=hppa1.1-winbond
-               os=-proelf
-               ;;
-       windows32)
-               basic_machine=i386-pc
-               os=-windows32-msvcrt
-               ;;
-       xmp)
-               basic_machine=xmp-cray
-               os=-unicos
-               ;;
-        xps | xps100)
-               basic_machine=xps100-honeywell
-               ;;
-       z8k-*-coff)
-               basic_machine=z8k-unknown
-               os=-sim
-               ;;
-       none)
-               basic_machine=none-none
-               os=-none
-               ;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-       w89k)
-               basic_machine=hppa1.1-winbond
-               ;;
-       op50n)
-               basic_machine=hppa1.1-oki
-               ;;
-       op60c)
-               basic_machine=hppa1.1-oki
-               ;;
-       mips)
-               if [ x$os = x-linux-gnu ]; then
-                       basic_machine=mips-unknown
-               else
-                       basic_machine=mips-mips
-               fi
-               ;;
-       romp)
-               basic_machine=romp-ibm
-               ;;
-       rs6000)
-               basic_machine=rs6000-ibm
-               ;;
-       vax)
-               basic_machine=vax-dec
-               ;;
-       pdp10)
-               # there are many clones, so DEC is not a safe bet
-               basic_machine=pdp10-unknown
-               ;;
-       pdp11)
-               basic_machine=pdp11-dec
-               ;;
-       we32k)
-               basic_machine=we32k-att
-               ;;
-       sh3 | sh4 | sh3eb | sh4eb)
-               basic_machine=sh-unknown
-               ;;
-       sparc | sparcv9 | sparcv9b)
-               basic_machine=sparc-sun
-               ;;
-        cydra)
-               basic_machine=cydra-cydrome
-               ;;
-       orion)
-               basic_machine=orion-highlevel
-               ;;
-       orion105)
-               basic_machine=clipper-highlevel
-               ;;
-       mac | mpw | mac-mpw)
-               basic_machine=m68k-apple
-               ;;
-       pmac | pmac-mpw)
-               basic_machine=powerpc-apple
-               ;;
-       c4x*)
-               basic_machine=c4x-none
-               os=-coff
-               ;;
-       *-unknown)
-               # Make sure to match an already-canonicalized machine name.
-               ;;
-       *)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-       *-digital*)
-               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-               ;;
-       *-commodore*)
-               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-               ;;
-       *)
-               ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-       # -solaris* is a basic system type, with this one exception.
-       -solaris1 | -solaris1.*)
-               os=`echo $os | sed -e 's|solaris1|sunos4|'`
-               ;;
-       -solaris)
-               os=-solaris2
-               ;;
-       -svr4*)
-               os=-sysv4
-               ;;
-       -unixware*)
-               os=-sysv4.2uw
-               ;;
-       -gnu/linux*)
-               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-               ;;
-       # First accept the basic system types.
-       # The portable systems comes first.
-       # Each alternative MUST END IN A *, to match a version number.
-       # -sysv* is not here because it comes later, after sysvr4.
-       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* \
-             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
-             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-             | -chorusos* | -chorusrdb* \
-             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
-             | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
-             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-             | -os2* | -vos*)
-       # Remember, each alternative MUST END IN *, to match a version number.
-               ;;
-       -qnx*)
-               case $basic_machine in
-                   x86-* | i*86-*)
-                       ;;
-                   *)
-                       os=-nto$os
-                       ;;
-               esac
-               ;;
-       -nto*)
-               os=-nto-qnx
-               ;;
-       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
-             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-               ;;
-       -mac*)
-               os=`echo $os | sed -e 's|mac|macos|'`
-               ;;
-       -linux*)
-               os=`echo $os | sed -e 's|linux|linux-gnu|'`
-               ;;
-       -sunos5*)
-               os=`echo $os | sed -e 's|sunos5|solaris2|'`
-               ;;
-       -sunos6*)
-               os=`echo $os | sed -e 's|sunos6|solaris3|'`
-               ;;
-       -opened*)
-               os=-openedition
-               ;;
-       -wince*)
-               os=-wince
-               ;;
-       -osfrose*)
-               os=-osfrose
-               ;;
-       -osf*)
-               os=-osf
-               ;;
-       -utek*)
-               os=-bsd
-               ;;
-       -dynix*)
-               os=-bsd
-               ;;
-       -acis*)
-               os=-aos
-               ;;
-       -386bsd)
-               os=-bsd
-               ;;
-       -ctix* | -uts*)
-               os=-sysv
-               ;;
-       -ns2 )
-               os=-nextstep2
-               ;;
-       -nsk*)
-               os=-nsk
-               ;;
-       # Preserve the version number of sinix5.
-       -sinix5.*)
-               os=`echo $os | sed -e 's|sinix|sysv|'`
-               ;;
-       -sinix*)
-               os=-sysv4
-               ;;
-       -triton*)
-               os=-sysv3
-               ;;
-       -oss*)
-               os=-sysv3
-               ;;
-       -svr4)
-               os=-sysv4
-               ;;
-       -svr3)
-               os=-sysv3
-               ;;
-       -sysvr4)
-               os=-sysv4
-               ;;
-       # This must come after -sysvr4.
-       -sysv*)
-               ;;
-       -ose*)
-               os=-ose
-               ;;
-       -es1800*)
-               os=-ose
-               ;;
-       -xenix)
-               os=-xenix
-               ;;
-        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-               os=-mint
-               ;;
-       -none)
-               ;;
-       *)
-               # Get rid of the `-' at the beginning of $os.
-               os=`echo $os | sed 's/[^-]*-//'`
-               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-       *-acorn)
-               os=-riscix1.2
-               ;;
-       arm*-rebel)
-               os=-linux
-               ;;
-       arm*-semi)
-               os=-aout
-               ;;
-       pdp10-*)
-               os=-tops20
-               ;;
-        pdp11-*)
-               os=-none
-               ;;
-       *-dec | vax-*)
-               os=-ultrix4.2
-               ;;
-       m68*-apollo)
-               os=-domain
-               ;;
-       i386-sun)
-               os=-sunos4.0.2
-               ;;
-       m68000-sun)
-               os=-sunos3
-               # This also exists in the configure program, but was not the
-               # default.
-               # os=-sunos4
-               ;;
-       m68*-cisco)
-               os=-aout
-               ;;
-       mips*-cisco)
-               os=-elf
-               ;;
-       mips*-*)
-               os=-elf
-               ;;
-       *-tti)  # must be before sparc entry or we get the wrong os.
-               os=-sysv3
-               ;;
-       sparc-* | *-sun)
-               os=-sunos4.1.1
-               ;;
-       *-be)
-               os=-beos
-               ;;
-       *-ibm)
-               os=-aix
-               ;;
-       *-wec)
-               os=-proelf
-               ;;
-       *-winbond)
-               os=-proelf
-               ;;
-       *-oki)
-               os=-proelf
-               ;;
-       *-hp)
-               os=-hpux
-               ;;
-       *-hitachi)
-               os=-hiux
-               ;;
-       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-               os=-sysv
-               ;;
-       *-cbm)
-               os=-amigaos
-               ;;
-       *-dg)
-               os=-dgux
-               ;;
-       *-dolphin)
-               os=-sysv3
-               ;;
-       m68k-ccur)
-               os=-rtu
-               ;;
-       m88k-omron*)
-               os=-luna
-               ;;
-       *-next )
-               os=-nextstep
-               ;;
-       *-sequent)
-               os=-ptx
-               ;;
-       *-crds)
-               os=-unos
-               ;;
-       *-ns)
-               os=-genix
-               ;;
-       i370-*)
-               os=-mvs
-               ;;
-       *-next)
-               os=-nextstep3
-               ;;
-        *-gould)
-               os=-sysv
-               ;;
-        *-highlevel)
-               os=-bsd
-               ;;
-       *-encore)
-               os=-bsd
-               ;;
-        *-sgi)
-               os=-irix
-               ;;
-        *-siemens)
-               os=-sysv4
-               ;;
-       *-masscomp)
-               os=-rtu
-               ;;
-       f30[01]-fujitsu | f700-fujitsu)
-               os=-uxpv
-               ;;
-       *-rom68k)
-               os=-coff
-               ;;
-       *-*bug)
-               os=-coff
-               ;;
-       *-apple)
-               os=-macos
-               ;;
-       *-atari*)
-               os=-mint
-               ;;
-       *)
-               os=-none
-               ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-       *-unknown)
-               case $os in
-                       -riscix*)
-                               vendor=acorn
-                               ;;
-                       -sunos*)
-                               vendor=sun
-                               ;;
-                       -aix*)
-                               vendor=ibm
-                               ;;
-                       -beos*)
-                               vendor=be
-                               ;;
-                       -hpux*)
-                               vendor=hp
-                               ;;
-                       -mpeix*)
-                               vendor=hp
-                               ;;
-                       -hiux*)
-                               vendor=hitachi
-                               ;;
-                       -unos*)
-                               vendor=crds
-                               ;;
-                       -dgux*)
-                               vendor=dg
-                               ;;
-                       -luna*)
-                               vendor=omron
-                               ;;
-                       -genix*)
-                               vendor=ns
-                               ;;
-                       -mvs* | -opened*)
-                               vendor=ibm
-                               ;;
-                       -ptx*)
-                               vendor=sequent
-                               ;;
-                       -vxsim* | -vxworks*)
-                               vendor=wrs
-                               ;;
-                       -aux*)
-                               vendor=apple
-                               ;;
-                       -hms*)
-                               vendor=hitachi
-                               ;;
-                       -mpw* | -macos*)
-                               vendor=apple
-                               ;;
-                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-                               vendor=atari
-                               ;;
-                       -vos*)
-                               vendor=stratus
-                               ;;
-               esac
-               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-               ;;
-esac
-
-echo $basic_machine$os
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
old mode 100644 (file)
new mode 100755 (executable)
similarity index 73%
rename from pcre/configure
rename to configure
index fbd3831..e06d48a
+++ b/configure
@@ -12,9 +12,44 @@ ac_help=
 ac_default_prefix=/usr/local
 # Any additions from configure.in:
 ac_help="$ac_help
-  --disable-shared        build PCRE as a static library"
+  --enable-mingw32        Use mingw32 for a Windows GUI"
 ac_help="$ac_help
-  --enable-utf8           enable UTF8 support (incomplete)"
+  --disable-regex         Don't allow regular expressions in the blockfile"
+ac_help="$ac_help
+  --disable-pcre-regex    Use old, slow GNU Regex instead of PCRE."
+ac_help="$ac_help
+  --disable-toggle        Don't support temporary disable"
+ac_help="$ac_help
+  --disable-pcrs          Don't support arbitrary content modification"
+ac_help="$ac_help
+  --disable-force         Don't allow blockfle to be bypassed"
+ac_help="$ac_help
+  --disable-fast-redirects Don't support fast redirects"
+ac_help="$ac_help
+  --disable-killpopup     Never block popups"
+ac_help="$ac_help
+  --disable-stats         Don't keep statistics"
+ac_help="$ac_help
+  --disable-split-proxy-args  One big show-proxy-args page, not one per file."
+ac_help="$ac_help
+  --disable-webdav        Don't support WebDAV.  This option stops MS Outlook
+                          Express from accessing HotMail e-mail."
+ac_help="$ac_help
+  --disable-ie-images     Don't auto-detect whether a request from MS Internet
+                          Explorer is for an image or HTML."
+ac_help="$ac_help
+  --disable-image-blocking  Don't try to figure out whether a request is 
+                            for an image or HTML - assume HTML."
+ac_help="$ac_help
+  --disable-acl-files     Prevents the use of ACL files to control access to
+                          the proxy by IP address."
+ac_help="$ac_help
+  --disable-trust-files   Prevents the use of trust files."
+ac_help="$ac_help
+  --disable-jar-files     Prevents the use of jar files to capture cookies."
+ac_help="$ac_help
+  --disable-static-pcre   Link dynamically with the pcre and pcreposix
+                          libraries.  You must build the libraries seperately."
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -137,18 +172,9 @@ do
 
   -help | --help | --hel | --he)
     # Omit some internal or obsolete options to make the list less imposing.
-    # The list generated by autoconf has been trimmed to remove many
-    # options that are totally irrelevant to PCRE (e.g. relating to X),
-    # or are not supported by its Makefile.
-    # The list generated by autoconf has been trimmed to remove many
-    # options that are totally irrelevant to PCRE (e.g. relating to X),
-    # or are not supported by its Makefile.
-    # The list generated by autoconf has been trimmed to remove many
-    # options that are totally irrelevant to PCRE (e.g. relating to X),
-    # or are not supported by its Makefile.
     # This message is too long to be a string in the A/UX 3.1 sh.
     cat << EOF
-Usage: ./configure [options]
+Usage: configure [options] [host]
 Options: [defaults in brackets after descriptions]
 Configuration:
   --cache-file=FILE       cache test results in FILE
@@ -162,11 +188,37 @@ Directory and file names:
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                           [same as prefix]
   --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
   --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
   --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
   --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
 EOF
     cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
 EOF
     if test -n "$ac_help"; then
       echo "--enable and --with options recognized:$ac_help"
@@ -415,7 +467,7 @@ do
   | --no-cr | --no-c) ;;
   -no-recursion | --no-recursion | --no-recursio | --no-recursi \
   | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  *" "*|*"   "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
   ac_configure_args="$ac_configure_args '$ac_arg'" ;;
   *) ac_configure_args="$ac_configure_args $ac_arg" ;;
   esac
@@ -438,7 +490,7 @@ echo > confdefs.h
 
 # A filename unique to this package, relative to the directory that
 # configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=dftables.c
+ac_unique_file=jcc.c
 
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
@@ -499,7 +551,7 @@ if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
   # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
   if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
     ac_n= ac_c='
-' ac_t='       '
+' ac_t='   '
   else
     ac_n=-n ac_c= ac_t=
   fi
@@ -510,29 +562,47 @@ fi
 
 
 
+VERSION_MAJOR=2
+VERSION_MINOR=9
+VERSION_POINT=4
+
 
 
-PCRE_MAJOR=3
-PCRE_MINOR=4
-PCRE_DATE=22-Aug-2000
-PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
 
 
-PCRE_LIB_VERSION=0:1:0
-PCRE_POSIXLIB_VERSION=0:0:0
+cat >> confdefs.h <<\EOF
+#define CODE_STATUS "alpha"
+EOF
+
+
+cat >> confdefs.h <<EOF
+#define VERSION_MAJOR ${VERSION_MAJOR}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION_MINOR ${VERSION_MINOR}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION_POINT ${VERSION_POINT}
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_POINT}"
+EOF
 
 
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:546: checking for $ac_word" >&5
+echo "configure:599: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  IFS="${IFS=    }"; ac_save_ifs="$IFS"; IFS=":"
   ac_dummy="$PATH"
   for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
@@ -555,14 +625,14 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:576: checking for $ac_word" >&5
+echo "configure:629: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  IFS="${IFS=    }"; ac_save_ifs="$IFS"; IFS=":"
   ac_prog_rejected=no
   ac_dummy="$PATH"
   for ac_dir in $ac_dummy; do
@@ -570,7 +640,7 @@ else
     if test -f $ac_dir/$ac_word; then
       if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
         ac_prog_rejected=yes
-       continue
+   continue
       fi
       ac_cv_prog_CC="cc"
       break
@@ -606,14 +676,14 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:627: checking for $ac_word" >&5
+echo "configure:680: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  IFS="${IFS=    }"; ac_save_ifs="$IFS"; IFS=":"
   ac_dummy="$PATH"
   for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
@@ -638,7 +708,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:659: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:712: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -649,12 +719,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 670 "configure"
+#line 723 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:675: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -680,12 +750,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:701: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:754: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:706: checking whether we are using GNU C" >&5
+echo "configure:759: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -694,7 +764,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:715: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:768: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -713,7 +783,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:734: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:787: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -744,40 +814,8 @@ else
   fi
 fi
 
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:768: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:798: checking how to run the C preprocessor" >&5
+echo "configure:819: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -792,13 +830,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 813 "configure"
+#line 834 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -809,13 +847,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 830 "configure"
+#line 851 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:836: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:857: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -826,13 +864,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 847 "configure"
+#line 868 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:853: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -856,13 +894,135 @@ else
 fi
 echo "$ac_t""$CPP" 1>&6
 
+
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:900: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 905 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:912: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mingw32=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:929: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 934 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:945: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_cygwin=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:964: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+  ac_cv_exeext=.exe
+else
+  rm -f conftest*
+  echo 'int main () { return 0; }' > conftest.$ac_ext
+  ac_cv_exeext=
+  if { (eval echo configure:974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+    for file in conftest.*; do
+      case $file in
+      *.c | *.o | *.obj) ;;
+      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+      esac
+    done
+  else
+    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+  fi
+  rm -f conftest*
+  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:995: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:1001: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:878: checking for ANSI C header files" >&5
+echo "configure:1021: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 883 "configure"
+#line 1026 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -870,7 +1030,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1034: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -887,7 +1047,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 908 "configure"
+#line 1051 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -905,7 +1065,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 926 "configure"
+#line 1069 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -926,7 +1086,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 947 "configure"
+#line 1090 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -937,7 +1097,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -960,55 +1120,14 @@ EOF
 
 fi
 
-for ac_hdr in limits.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:985: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 990 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:995: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:1024: checking for working const" >&5
+echo "configure:1126: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1029 "configure"
+#line 1131 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1057,7 +1176,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:1078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1180: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -1078,12 +1197,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:1099: checking for size_t" >&5
+echo "configure:1201: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1104 "configure"
+#line 1206 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -1111,16 +1230,15 @@ EOF
 fi
 
 
-
-for ac_func in bcopy memmove strerror
+for ac_func in strerror bcopy memmove
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1136: checking for $ac_func" >&5
+echo "configure:1237: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1141 "configure"
+#line 1242 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -1143,7 +1261,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -1169,39 +1287,342 @@ done
 
 
 
-LIBTOOL=./libtool
-LIBSUFFIX=la
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  if test "$enableval" = "no"; then
-  LIBTOOL=
-  LIBSUFFIX=a
+# Check whether --enable-mingw32 or --disable-mingw32 was given.
+if test "${enable_mingw32+set}" = set; then
+  enableval="$enable_mingw32"
+  if test $enableval = yes; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+    fi
+  fi
+else
+  if test "$MINGW32" = "yes"; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+    fi
+  fi
 fi
 
+
+
+
+
+SOLARIS_ONLY=#
+
+
+
+
+GNU_REGEX_ONLY=
+PCRE_REGEX_ONLY=
+NO_REGEX_ONLY=#
+
+# Check whether --enable-regex or --disable-regex was given.
+if test "${enable_regex+set}" = set; then
+  enableval="$enable_regex"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define REGEX 1
+EOF
+
+else
+  NO_REGEX_ONLY=
+  GNU_REGEX_ONLY=#
+  PCRE_REGEX_ONLY=#
 fi
+else
+  cat >> confdefs.h <<\EOF
+#define REGEX 1
+EOF
+
+fi
+
+
+# Check whether --enable-pcre-regex or --disable-pcre-regex was given.
+if test "${enable_pcre_regex+set}" = set; then
+  enableval="$enable_pcre_regex"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define PCRE 1
+EOF
+
+  GNU_REGEX_ONLY=#
+else
+  PCRE_REGEX_ONLY=#
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define PCRE 1
+EOF
+
+  GNU_REGEX_ONLY=#
+
+fi
+
+
+
+
+
+
+
+
+# Check whether --enable-toggle or --disable-toggle was given.
+if test "${enable_toggle+set}" = set; then
+  enableval="$enable_toggle"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define TOGGLE 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define TOGGLE 1
+EOF
+
+fi
+
+
+PCRS_ONLY=
+# Check whether --enable-pcrs or --disable-pcrs was given.
+if test "${enable_pcrs+set}" = set; then
+  enableval="$enable_pcrs"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define PCRS 1
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define DENY_GZIP 1
+EOF
+
+else
+  PCRS_ONLY=#
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define PCRS 1
+EOF
+ cat >> confdefs.h <<\EOF
+#define DENY_GZIP 1
+EOF
+
+fi
+
+
+
+# Check whether --enable-force or --disable-force was given.
+if test "${enable_force+set}" = set; then
+  enableval="$enable_force"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define FORCE_LOAD 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define FORCE_LOAD 1
+EOF
+
+fi
+
+
+# Check whether --enable-fast-redirects or --disable-fast-redirects was given.
+if test "${enable_fast_redirects+set}" = set; then
+  enableval="$enable_fast_redirects"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define FAST_REDIRECTS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define FAST_REDIRECTS 1
+EOF
+
+fi
+
+
+# Check whether --enable-killpopup or --disable-killpopup was given.
+if test "${enable_killpopup+set}" = set; then
+  enableval="$enable_killpopup"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define KILLPOPUPS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define KILLPOPUPS 1
+EOF
+
+fi
+
+
+# Check whether --enable-stats or --disable-stats was given.
+if test "${enable_stats+set}" = set; then
+  enableval="$enable_stats"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define STATISTICS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define STATISTICS 1
+EOF
+
+fi
+
+
+# Check whether --enable-split-proxy-args or --disable-split-proxy-args was given.
+if test "${enable_split_proxy_args+set}" = set; then
+  enableval="$enable_split_proxy_args"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define SPLIT_PROXY_ARGS 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define SPLIT_PROXY_ARGS 1
+EOF
+
+fi
+
+
+# Check whether --enable-webdav or --disable-webdav was given.
+if test "${enable_webdav+set}" = set; then
+  enableval="$enable_webdav"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define WEBDAV 1
+EOF
+
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define WEBDAV 1
+EOF
+
+fi
+
+
+# Check whether --enable-ie-images or --disable-ie-images was given.
+if test "${enable_ie_images+set}" = set; then
+  enableval="$enable_ie_images"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define DETECT_MSIE_IMAGES 1
+EOF
 
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define DETECT_MSIE_IMAGES 1
+EOF
+
+fi
+
+
+# Check whether --enable-image-blocking or --disable-image-blocking was given.
+if test "${enable_image_blocking+set}" = set; then
+  enableval="$enable_image_blocking"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define IMAGE_BLOCKING 1
+EOF
 
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define IMAGE_BLOCKING 1
+EOF
 
-# Check whether --enable-utf8 or --disable-utf8 was given.
-if test "${enable_utf8+set}" = set; then
-  enableval="$enable_utf8"
-  if test "$enableval" = "yes"; then
-  UTF8=-DSUPPORT_UTF8
 fi
 
+
+# Check whether --enable-acl-files or --disable-acl-files was given.
+if test "${enable_acl_files+set}" = set; then
+  enableval="$enable_acl_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define ACL_FILES 1
+EOF
+
 fi
+else
+  cat >> confdefs.h <<\EOF
+#define ACL_FILES 1
+EOF
 
+fi
 
 
+# Check whether --enable-trust-files or --disable-trust-files was given.
+if test "${enable_trust_files+set}" = set; then
+  enableval="$enable_trust_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define TRUST_FILES 1
+EOF
 
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define TRUST_FILES 1
+EOF
 
+fi
 
 
+# Check whether --enable-jar-files or --disable-jar-files was given.
+if test "${enable_jar_files+set}" = set; then
+  enableval="$enable_jar_files"
+  if test $enableval = yes; then
+  cat >> confdefs.h <<\EOF
+#define JAR_FILES 1
+EOF
 
+fi
+else
+  cat >> confdefs.h <<\EOF
+#define JAR_FILES 1
+EOF
 
+fi
 
 
+LIBRARY_PCRE_ONLY=#
+STATIC_PCRE_ONLY=
+# Check whether --enable-static-pcre or --disable-static-pcre was given.
+if test "${enable_static_pcre+set}" = set; then
+  enableval="$enable_static_pcre"
+  if test $enableval = no; then
+  LIBRARY_PCRE_ONLY=
+  STATIC_PCRE_ONLY=#
+fi
+fi
 
 
 
@@ -1264,7 +1685,7 @@ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
 # the first set of double-colon rules, so remove it if not needed.
 # If there is a colon in the path, we need to keep it.
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+  ac_vpsub='/^[    ]*VPATH[    ]*=[^:]*$/d'
 fi
 
 trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
@@ -1306,7 +1727,7 @@ done
 
 ac_given_srcdir=$srcdir
 
-trap 'rm -fr `echo "Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in config.h:config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 EOF
 cat >> $CONFIG_STATUS <<EOF
 
@@ -1338,20 +1759,22 @@ s%@includedir@%$includedir%g
 s%@oldincludedir@%$oldincludedir%g
 s%@infodir@%$infodir%g
 s%@mandir@%$mandir%g
+s%@VERSION_MAJOR@%$VERSION_MAJOR%g
+s%@VERSION_MINOR@%$VERSION_MINOR%g
+s%@VERSION_POINT@%$VERSION_POINT%g
 s%@CC@%$CC%g
-s%@RANLIB@%$RANLIB%g
 s%@CPP@%$CPP%g
-s%@HAVE_MEMMOVE@%$HAVE_MEMMOVE%g
-s%@HAVE_STRERROR@%$HAVE_STRERROR%g
-s%@LIBTOOL@%$LIBTOOL%g
-s%@LIBSUFFIX@%$LIBSUFFIX%g
-s%@UTF8@%$UTF8%g
-s%@PCRE_MAJOR@%$PCRE_MAJOR%g
-s%@PCRE_MINOR@%$PCRE_MINOR%g
-s%@PCRE_DATE@%$PCRE_DATE%g
-s%@PCRE_VERSION@%$PCRE_VERSION%g
-s%@PCRE_LIB_VERSION@%$PCRE_LIB_VERSION%g
-s%@PCRE_POSIXLIB_VERSION@%$PCRE_POSIXLIB_VERSION%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
+s%@WIN_ONLY@%$WIN_ONLY%g
+s%@CYGWIN_FLAGS@%$CYGWIN_FLAGS%g
+s%@SOLARIS_ONLY@%$SOLARIS_ONLY%g
+s%@GNU_REGEX_ONLY@%$GNU_REGEX_ONLY%g
+s%@PCRE_REGEX_ONLY@%$PCRE_REGEX_ONLY%g
+s%@NO_REGEX_ONLY@%$NO_REGEX_ONLY%g
+s%@PCRS_ONLY@%$PCRS_ONLY%g
+s%@LIBRARY_PCRE_ONLY@%$LIBRARY_PCRE_ONLY%g
+s%@STATIC_PCRE_ONLY@%$STATIC_PCRE_ONLY%g
 
 CEOF
 EOF
@@ -1393,7 +1816,7 @@ EOF
 
 cat >> $CONFIG_STATUS <<EOF
 
-CONFIG_FILES=\${CONFIG_FILES-"Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in"}
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
 EOF
 cat >> $CONFIG_STATUS <<\EOF
 for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
@@ -1451,17 +1874,17 @@ rm -f conftest.s*
 # NAME is the cpp macro being defined and VALUE is the value it is being given.
 #
 # ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
-ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dA='s%^\([    ]*\)#\([      ]*define[       ][      ]*\)'
+ac_dB='\([    ][       ]*\)[^  ]*%\1#\2'
 ac_dC='\3'
 ac_dD='%g'
 # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
-ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
-ac_uB='\([     ]\)%\1#\2define\3'
+ac_uA='s%^\([    ]*\)#\([      ]*\)undef\([    ][      ]*\)'
+ac_uB='\([    ]\)%\1#\2define\3'
 ac_uC=' '
 ac_uD='\4%g'
 # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eA='s%^\([    ]*\)#\([      ]*\)undef\([    ][      ]*\)'
 ac_eB='$%\1#\2define\3'
 ac_eC=' '
 ac_eD='%g'
@@ -1469,7 +1892,7 @@ ac_eD='%g'
 if test "${CONFIG_HEADERS+set}" != set; then
 EOF
 cat >> $CONFIG_STATUS <<EOF
-  CONFIG_HEADERS="config.h:config.in"
+  CONFIG_HEADERS="config.h"
 EOF
 cat >> $CONFIG_STATUS <<\EOF
 fi
@@ -1508,7 +1931,7 @@ rm -f conftest.hdr
 # example, in the case of _POSIX_SOURCE, which is predefined and required
 # on some systems where configure will not decide to define it.
 cat >> conftest.vals <<\EOF
-s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+s%^[    ]*#[   ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
 EOF
 
 # Break up conftest.vals because some shells have a limit on
@@ -1559,10 +1982,11 @@ cat >> $CONFIG_STATUS <<EOF
 
 EOF
 cat >> $CONFIG_STATUS <<\EOF
-chmod a+x RunTest pcre-config
+
 exit 0
 EOF
 chmod +x $CONFIG_STATUS
 rm -fr confdefs* $ac_clean_files
 test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
 
+
index 1fe8d99..e1dcf24 100644 (file)
@@ -1,9 +1,9 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl 
-dnl $Id: configure.in,v 1.49 2002/03/27 02:19:52 david__schmidt Exp $
+dnl $Id: configure.in,v 1.4 2001/05/29 09:50:24 jongfoster Exp $
 dnl 
-dnl Written by and Copyright (C) 2001, 2002 the SourceForge
-dnl Privoxy team. http://www.privoxy.org/
+dnl Written by and Copyright (C) 2001 the SourceForge
+dnl IJBSWA team.  http://ijbswa.sourceforge.net
 dnl
 dnl Based on the Internet Junkbuster originally written
 dnl by and Copyright (C) 1997 Anonymous Coders and 
@@ -28,191 +28,6 @@ dnl or write to the Free Software Foundation, Inc., 59
 dnl Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 dnl 
 dnl $Log: configure.in,v $
-dnl Revision 1.49  2002/03/27 02:19:52  david__schmidt
-dnl More Mac OSX support:
-dnl - Get rid of extraneous, noisy -pthread warnings
-dnl - Define unix so we get oes' unix-tagged changes
-dnl
-dnl Revision 1.48  2002/03/26 22:29:54  swa
-dnl we have a new homepage!
-dnl
-dnl Revision 1.47  2002/03/26 16:41:00  hal9
-dnl Upped RPM Release to 3 (need to build new RH packages)
-dnl
-dnl Revision 1.46  2002/03/24 18:55:06  jongfoster
-dnl Making Docbook work under Windows
-dnl
-dnl Revision 1.45  2002/03/24 14:19:55  swa
-dnl set rpm package release in configure.in. nowhere else.
-dnl
-dnl Revision 1.44  2002/03/24 13:25:43  swa
-dnl name change related issues
-dnl
-dnl Revision 1.43  2002/03/24 12:56:21  swa
-dnl name change related issues.
-dnl
-dnl Revision 1.42  2002/03/22 18:11:37  jongfoster
-dnl Bumping version number to 2.9.12
-dnl
-dnl Revision 1.41  2002/03/19 19:30:04  morcego
-dnl - Fixing stylesheet checking on configure. If it is found, no further checks
-dnl   should be done
-dnl
-dnl - configure will now check for db2html or docbook2html (should work now
-dnl   on SuSe without the docbktls package)
-dnl
-dnl Revision 1.40  2002/03/09 14:33:30  oes
-dnl Fixing the (harmless) AC_CHECK_FILE warnings
-dnl
-dnl Revision 1.39  2002/03/08 16:46:13  oes
-dnl Added --enable-no-gifs
-dnl
-dnl Revision 1.38  2002/03/08 14:13:50  morcego
-dnl Fixing configure, to remove a command not found error.
-dnl
-dnl Revision 1.37  2002/03/08 12:58:21  oes
-dnl Tiny bugfix in AC_ARG_WITH(debug)
-dnl
-dnl Revision 1.36  2002/03/06 23:50:36  morcego
-dnl Will not test for a text browser if we are not using docbook.
-dnl
-dnl Revision 1.35  2002/03/06 21:55:52  morcego
-dnl New configure option: --with-docbook=(yes|no|directory)
-dnl Preliminary new platform detection code included. Will work with the
-dnl old one for now. No use just trowing it away
-dnl
-dnl Revision 1.34  2002/03/06 20:57:00  morcego
-dnl Fixing detection of stylesheets on SuSe.
-dnl
-dnl Revision 1.33  2002/03/05 17:31:11  morcego
-dnl Search for docbook.dsl. Should solve portability problems for SuSe.
-dnl
-dnl Revision 1.32  2002/03/05 14:07:43  morcego
-dnl configure now detects rpm topdir, and change GNUmakefile acordingly
-dnl    (based on sugestion by Sarantis Paskalis)
-dnl
-dnl Revision 1.31  2002/03/05 13:43:28  morcego
-dnl Checking for text browser, so redhat-dok can work.
-dnl
-dnl Revision 1.30  2002/03/04 17:58:01  oes
-dnl Deleted _DEBUG and PID_FILE_PATH
-dnl
-dnl Revision 1.29  2002/02/28 14:20:53  oes
-dnl Fixed detection of gethost*_r functions on Solaris
-dnl
-dnl Revision 1.28  2002/02/27 15:02:38  oes
-dnl Incremented version number
-dnl
-dnl Revision 1.27  2002/01/10 12:35:18  oes
-dnl Added cross-compile defaults to the AC_CHECK_SIZEOF macros
-dnl to silence autoconf warnings. Numbers are for Intel/Linux.
-dnl Is there a better way?
-dnl
-dnl Revision 1.26  2002/01/09 14:29:49  oes
-dnl - Added AC_CHECK_FUNC tests for the availability of
-dnl   gethostbyname_r, gethostbyaddr_r, gmtime_r and
-dnl   localtime_r, as well as AC_TRY_COMPILE tests to
-dnl   determine their signatures.
-dnl
-dnl - Fixed a bug with the init of CFLAGS that was
-dnl   reported by barsnick
-dnl
-dnl Revision 1.25  2002/01/04 15:27:18  oes
-dnl Changed quoting of CODE_STATUS for use in make
-dnl
-dnl Revision 1.24  2001/12/30 14:07:31  steudten
-dnl - Add signal handling (unix)
-dnl - Add SIGHUP handler (unix)
-dnl - Add creation of pidfile (unix)
-dnl - Add action 'top' in rc file (RH)
-dnl - Add entry 'SIGNALS' to manpage
-dnl - Add exit message to logfile (unix)
-dnl
-dnl Revision 1.23  2001/12/09 20:24:42  david__schmidt
-dnl Change from "alpha" to "beta" in configure.in
-dnl
-dnl Revision 1.22  2001/12/01 11:24:01  jongfoster
-dnl Renaming Makefile.in to GNUmakefile.in so that non-GNU versions of
-dnl make break in a more obvious way.
-dnl
-dnl Revision 1.21  2001/11/30 21:35:54  jongfoster
-dnl Bumping version number to 2.9.10
-dnl
-dnl Revision 1.20  2001/10/23 21:24:09  jongfoster
-dnl Support for FEATURE_CGI_EDIT_ACTIONS
-dnl
-dnl Revision 1.19  2001/10/07 15:33:14  oes
-dnl Removed FEATURE_DENY_GZIP
-dnl Bumped up version number
-dnl
-dnl Revision 1.18  2001/09/13 13:10:24  steudten
-dnl
-dnl PreWork for Debug Interface.
-dnl Add new option "--with-debug" to enable debugging (flags aso.)
-dnl
-dnl Revision 1.17  2001/09/12 23:44:55  david__schmidt
-dnl Mac OSX (Darwin) support added.
-dnl
-dnl Revision 1.16  2001/09/12 22:55:45  joergs
-dnl AmigaOS support added.
-dnl
-dnl Revision 1.15  2001/09/12 17:28:59  david__schmidt
-dnl
-dnl OS/2 port: update autoconf'd support for the platform.
-dnl
-dnl Revision 1.14  2001/07/30 22:12:11  jongfoster
-dnl Fixing Solaris build (I hope) and tidying up #defines:
-dnl - All feature #defines are now of the form FEATURE_xxx
-dnl - Permanently turned off WIN_GUI_EDIT
-dnl - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
-dnl
-dnl Revision 1.13  2001/07/29 17:09:17  jongfoster
-dnl Major changes to build system in order to fix these bugs:
-dnl - pthreads under Linux was broken - changed -lpthread to -pthread
-dnl - Compiling in MinGW32 mode under CygWin now correctly detects
-dnl   which shared libraries are available
-dnl - Solaris support (?) (Not tested under Solaris yet)
-dnl
-dnl Revision 1.12  2001/07/25 19:16:27  oes
-dnl Bumping version number to 2.9.8
-dnl
-dnl Revision 1.11  2001/07/21 18:00:07  jongfoster
-dnl Bumping version number to 2.9.7
-dnl
-dnl Revision 1.10  2001/07/18 17:25:04  oes
-dnl Fixed a typo
-dnl
-dnl Revision 1.9  2001/07/15 19:45:13  jongfoster
-dnl Added support for linking with POSIX threads library
-dnl
-dnl Revision 1.8  2001/07/15 17:54:29  jongfoster
-dnl Renaming #define STATIC to STATIC_PCRE
-dnl Adding new #define FEATURE_PTHREAD that will be used to enable
-dnl POSIX threads support.
-dnl
-dnl Revision 1.7  2001/07/13 13:58:05  oes
-dnl    Completely reorganized the selection scheme for
-dnl    pcre, pcreposix, pcrs and gnu_regex:
-dnl
-dnl    The presence of shared pcre, pcreposix or pcrs
-dnl    libraried is now autodetected. Additionally, the
-dnl    user can enforce using the built-in static variants
-dnl    by specifying --disable-dynamic-(pcre|pcrs).
-dnl    Care is taken to avoid that pcre is dyn, while pcreposix
-dnl    is static, if both are used and that pcrs is static if
-dnl    pcrs is.
-dnl
-dnl    The choice between pcre, gnu or no regex for actionsfile
-dnl    URL matching is now via
-dnl    --(enable|disable)-regex-matching[=(gnu|pcre|no)] with the
-dnl    default being pcre.
-dnl
-dnl Revision 1.6  2001/06/29 21:56:40  oes
-dnl Version -> 2.9.5
-dnl
-dnl Revision 1.5  2001/06/29 13:26:27  oes
-dnl Introduced #define CODE_STATUS
-dnl
 dnl Revision 1.4  2001/05/29 09:50:24  jongfoster
 dnl Unified blocklist/imagelist/permissionslist.
 dnl File format is still under discussion, but the internal changes
@@ -297,497 +112,56 @@ dnl Revision 1.1.1.1  2001/05/15 13:58:50  oes
 dnl Initial import of version 2.9.3 source tree
 dnl
 dnl 
-
-
-dnl =================================================================
-dnl AutoConf Initialization
-dnl =================================================================
-
-AC_REVISION($Revision: 1.49 $)
 AC_INIT(jcc.c)
 AC_CONFIG_HEADER(config.h)
-AC_CANONICAL_HOST
-
-dodk=auto
-DKPREFIX=none
-AC_ARG_WITH(docbook, dnl
-  --with-docbook=[[yes|no|directory]]  
-                           Enable docbook documentation creation 
-                          (default = yes, for gnu and linux),[dnl
-case "$with_docbook" in
-yes) dodk=yes;;
-no) dodk=no;;
-*) 
-       dodk=no
-       DKPREFIX=$withval
-       ;;
-esac
-])
-DB2HTML=false
-AC_ARG_WITH(db2html, dnl
-  --with-db2html=<path/executable>
-                          Set the location of the docbook to html converter
-                          (default = search),[dnl
-DB2HTML=$withval
-])
-
-dnl =================================================================
-dnl Application version number
-dnl =================================================================
 
 VERSION_MAJOR=2
 VERSION_MINOR=9
-VERSION_POINT=13
-VERSION_RPM_PACKAGE=3
-CODE_STATUS="beta"
-
-dnl CODE_STATUS can be "alpha", "beta", or "stable", and will be
-dnl used for CGI output
-
-dnl =================================================================
-dnl Substitute the version numbers
-dnl =================================================================
+VERSION_POINT=4
 
 AC_SUBST(VERSION_MAJOR)
 AC_SUBST(VERSION_MINOR)
 AC_SUBST(VERSION_POINT)
-AC_SUBST(VERSION_RPM_PACKAGE)
-AC_SUBST(CODE_STATUS)
 
+dnl This can be "alpha", "beta", or "stable"
+dnl and will be used for CGI output
 dnl
+AC_DEFINE(CODE_STATUS, "alpha")
+
 AC_DEFINE_UNQUOTED(VERSION_MAJOR,${VERSION_MAJOR})
 AC_DEFINE_UNQUOTED(VERSION_MINOR,${VERSION_MINOR})
 AC_DEFINE_UNQUOTED(VERSION_POINT,${VERSION_POINT})
-AC_DEFINE_UNQUOTED(VERSION_RPM_PACKAGE,${VERSION_RPM_PACKAGE})
 AC_DEFINE_UNQUOTED(VERSION,"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_POINT}")
-AC_DEFINE_UNQUOTED(CODE_STATUS,"${CODE_STATUS}")
 
-dnl =================================================================
-dnl Checks for programs needed to build.
-dnl =================================================================
+dnl Checks for programs.
+dnl AC_PROG_CXX
 AC_PROG_CC
 AC_PROG_CPP
-dnl AC_PROG_CXX
 dnl AC_PROG_INSTALL
 dnl AC_PROG_LN_S
 dnl AC_PROG_MAKE_SET
 dnl RANLIB is for PCRE:
 dnl AC_PROG_RANLIB
 
-AC_CHECK_PROG(GDB,gdb,yes,no)
-
-dnl =================================================================
-dnl debug, gcc and gdb support 
-dnl =================================================================
-
-AC_ARG_WITH(debug,
-        [  --with-debug            Enable debug mode],
-        [
-                if test "x$withval" != "xno" ; then
-                   if test $ac_cv_prog_cc_g = yes; then
-                     if test "$GCC" = yes; then
-                       if test "$GDB"; then
-                         CFLAGS="-ggdb"
-                       else
-                         CFLAGS="-g"
-                       fi
-                       CFLAGS="$CFLAGS -Wshadow  -Wconversion"
-                     else
-                       CFLAGS="-g"
-                     fi
-                  fi
-                fi
-        ],
-       [
-           if test "X$CFLAGS" = "X"; then # if CFLAGS are unset
-             if test "$GCC" = yes; then
-               CFLAGS="-O2"
-             else
-               CFLAGS=
-             fi
-           fi
-       ]
-)
-
-dnl =================================================================
-dnl additional gcc flags
-dnl =================================================================
-dnl 
-if test "$GCC"; then
-  CFLAGS="-pipe $CFLAGS"
-fi
-
-
-dnl =================================================================
-dnl Build type
-dnl =================================================================
-dnl
-dnl Must do this first.
-dnl
-dnl Reason: This sets CFLAGS in order to switch the Cygwin compiler
-dnl into Cygwin or MinGW32 modes.  Depending on the mode selected,
-dnl the compiler will use completely different sets of library
-dnl and include files.
-dnl 
-dnl =================================================================
-
 AC_MINGW32
 AC_CYGWIN
-
-if test "$MINGW32" = "yes"; then
-  target_type=mingw
-else
-  if test "$CYGWIN" = "yes"; then
-    target_type=cygwin
-  else
-    target_type=unix
-  fi
-fi
-
-if test $dodk = auto; then
-       dodk=no
-       if test $target_type = unix; then
-               case "$host_os" in
-               linux* | gnu*)
-                       dodk=yes
-               ;;
-               esac
-       fi
-fi
-
-dnl Decide what to do based on target_type
-dnl Note: PTHREAD_LIB is always set, even if pthread is disabled.
-dnl This is because we don't know yet whether pthread is enabled.
-
-AC_ARG_ENABLE(mingw32,
-[  --enable-mingw32        Use mingw32 for a Windows GUI],
-[if test $enableval = yes; then
-  target_type=mingw
-fi])
-
-if test $target_type = mingw; then
-  WIN_ONLY=
-  SPECIAL_CFLAGS="-mwindows -mno-cygwin"
-  PTHREAD_LIB=-lpthreadGC
-  echo "Using mingw32 (Win32 GUI)"
-else
-  WIN_ONLY=#
-  if test $target_type = cygwin; then
-    SPECIAL_CFLAGS="-mno-win32"
-    PTHREAD_LIB=
-    echo "Using Cygnus (Win32 command line)"
-  else
-    SPECIAL_CFLAGS=
-    PTHREAD_LIB=-lpthread
-  fi
-fi
-AC_SUBST(WIN_ONLY)
-
-dnl Checking which text html browser we have avaliable
-if test $dodk != no; then
-       AC_CHECK_PROGS(WDUMP,w3m lynx links,false)
-       if test "$WDUMP" = false; then
-               AC_MSG_ERROR(You need some kind of text browser to continue \(w3m, lynx and links are supported\))
-       fi
-       if test $DB2HTML = false; then
-               dnl We need to clean the variable, otherwise AC_CHECK_PROGS
-               dnl will fail   
-               DB2HTML=""
-               AC_CHECK_PROGS(DB2HTML,db2html docbook2html,false)
-       fi
-fi
-AC_SUBST(WDUMP)
-AC_SUBST(DB2HTML)
-
-dnl If we use rpm, we need to check where %_topdir is
-AC_CHECK_PROGS(RPMBIN,rpm,false)
-if test $RPMBIN != false; then
-               RPM_BASE=`rpm --eval "%{_topdir}"`
-               if test "$RPM_BASE" = ""; then
-                       RPM_BASE=/usr/src/redhat
-               fi
-fi
-AC_SUBST(RPM_BASE)
-
-dnl Check for jade, so we can build the documentation
-AC_CHECK_PROGS(JADEBIN,jade openjade,false)
-AC_SUBST(JADEBIN)
-
-dnl Check for man2html for docs.
-AC_CHECK_PROGS(MAN2HTML,man2html,false)
-AC_SUBST(MAN2HTML)
-
-dnl Checking for the docbook.dsl stylesheet file
-dnl It is still not portable (directory slash)
-if test $dodk = yes; then
-  if test $DKPREFIX = none; then
-    for i in /usr/share/sgml/docbook/dsssl-stylesheets /usr/share/sgml/docbkdsl /usr/share/sgml/docbook-dsssl; do
-      echo -n "checking for $i/html/docbook.dsl..."
-      if test -f $i/html/docbook.dsl; then
-        echo "yes"
-        DKPREFIX=$i
-        break
-      else
-        echo "no"
-      fi
-    done
-  fi
-fi
-AC_SUBST(DKPREFIX)
-
-dnl Save old CFLAGS so we can restore them later, then add SPECIAL_CFLAGS
-old_CFLAGS_nospecial=$CFLAGS
-CFLAGS="$CFLAGS $SPECIAL_CFLAGS"
-
-# Hack to force AutoConf to use the CFLAGS we just set
-dnl Warning: This may break with a future version of Autoconf
-dnl          Tested with autoconf 2.13
-ac_cpp='$CPP $CPPFLAGS $SPECIAL_CFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-
-
-dnl =================================================================
-dnl Thread support
-dnl =================================================================
-
-AC_CHECK_HEADER(pthread.h, [have_pthread=yes], [have_pthread=no])
-
-AC_ARG_ENABLE(pthread,
-[  --disable-pthread       Don't use POSIX threads (pthreads)],
-[if test $enableval = no; then
-  # Disable pthreads
-  have_pthread=no
-fi])
-
-if test $have_pthread = yes; then
-  PTHREAD_ONLY=
-  AC_DEFINE(FEATURE_PTHREAD)
-  echo Using POSIX threads
-  if test "$GCC" = "yes"; then
-    # Set a GCC specific switch:
-    if test "$target_type" = "unix"; then
-      # This compiler switch makes Linux thread-safe
-      # Don't know about other OS's?  Is this switch
-      # supported?
-      PTHREAD_LIB=
-      SPECIAL_CFLAGS="-pthread"
-    fi
-  fi
-else
-  PTHREAD_ONLY=#
-  echo Using native threads
-fi
-
-AC_SUBST(PTHREAD_ONLY)
-
-dnl =================================================================
-dnl Support for thread-safe versions of gethostbyaddr, gethostbyname,
-dnl gmtime and localtime
-dnl =================================================================
-
-dnl Next line needed to find the gethost*_r functions on Solaris
-AC_CHECK_LIB(nsl, gethostbyname)
-
-AC_CHECK_FUNC(gethostbyaddr_r, [
-  AC_MSG_CHECKING([signature of gethostbyaddr_r])
-  AC_TRY_COMPILE([
-#   include <netdb.h>
-  ], [
-    struct hostent *h, *hp;
-    char *a, *b;
-    int l, bl, t, e;
-    (void) gethostbyaddr_r(a, l, t, h, b, bl, &hp, &e)
-  ], [
-    AC_DEFINE(HAVE_GETHOSTBYADDR_R_8_ARGS)
-    AC_MSG_RESULT([8 args])
-  ], [
-    AC_TRY_COMPILE([
-#     include <netdb.h>
-    ], [
-      struct hostent *h;
-      char *a, *b;
-      int l, bl, t, e;
-      (void) gethostbyaddr_r(a, l, t, h, b, bl, &e)
-    ], [
-      AC_DEFINE(HAVE_GETHOSTBYADDR_R_7_ARGS)
-      AC_MSG_RESULT([7 args])
-    ], [
-      AC_TRY_COMPILE([
-#       include <netdb.h>
-      ], [
-        struct hostent_data *d;
-        struct hostent *h;
-        char a,
-        int l, t;
-        (void) gethostbyaddr_r(a, l, t, h, d)
-      ], [
-        AC_DEFINE(HAVE_GETHOSTBYADDR_R_5_ARGS)
-        AC_MSG_RESULT([5 args])
-      ], [
-        AC_MSG_RESULT(unrecognised)
-      ])
-    ])
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(gethostbyname_r, [
-  AC_MSG_CHECKING([signature of gethostbyname_r])
-  AC_TRY_COMPILE([
-#   include <netdb.h>
-  ], [
-    struct hostent *h, *r;
-    char *n, *b;
-    int bl, e;
-    (void) gethostbyname_r(n, h, b, bl, &r, &e)
-  ], [
-    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARGS)
-    AC_MSG_RESULT([6 args])
-  ], [
-    AC_TRY_COMPILE([
-#     include <netdb.h>
-    ], [
-      struct hostent *h;
-      char *n, *b;
-      int bl, e;
-      (void) gethostbyname_r(n, h, b, bl, &e)
-    ], [
-      AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARGS)
-      AC_MSG_RESULT([5 args])
-    ], [
-      AC_TRY_COMPILE([
-#       include <netdb.h>
-      ], [
-        struct hostent_data *d;
-        struct hostent *h;
-        char *n,
-        (void) gethostbyname_r(n, h, d)
-      ], [
-        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARGS)
-        AC_MSG_RESULT([3 args])
-      ], [
-        AC_MSG_RESULT(unrecognised)
-      ])
-    ])
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(gmtime_r, [
-  AC_MSG_CHECKING([signature of gmtime_r])
-  AC_TRY_COMPILE([
-#   include <time.h>
-  ], [
-    struct time *t;
-    struct tm *tm;
-    (void) gmtime_r(t, tm)
-  ], [
-    AC_MSG_RESULT(ok)
-    AC_DEFINE(HAVE_GMTIME_R)
-  ], [
-    AC_MSG_RESULT(unrecognised)
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-AC_CHECK_FUNC(localtime_r, [
-  AC_MSG_CHECKING([signature of localtime_r])
-  AC_TRY_COMPILE([
-#   include <time.h>
-  ], [
-    struct time *t;
-    struct tm *tm;
-    (void) localtime_r(t, tm)
-  ], [
-    AC_MSG_RESULT(ok)
-    AC_DEFINE(HAVE_LOCALTIME_R)
-  ], [
-    AC_MSG_RESULT(unrecognised)
-  ])
-], [
-  AC_MSG_RESULT(no)
-])
-
-dnl =================================================================
-dnl Solaris specific
-dnl FIXME: Not tested on Solaris yet...
-dnl =================================================================
-
-
-SOCKET_LIB=
-
-case "$host" in
-*-solaris*) SOCKET_LIB="-lsocket -lnsl"
-            AC_DEFINE(__EXTENSIONS__)
-            if test "$GCC" = "yes"; then
-              # Set a GCC specific switch:
-              # This compiler switch makes Solaris thread-safe
-              PTHREAD_LIB=
-              SPECIAL_CFLAGS="-pthreads"
-            else
-              # What do we do without GCC? Guess this:
-              SPECIAL_CFLAGS="-D_REENTRANT"
-            fi
-;;
-esac
-
-AC_SUBST(SOCKET_LIB)
-
-dnl =================================================================
-dnl OS/2 specific
-dnl =================================================================
-
-case "$host" in
-*-os2-emx*) SOCKET_LIB=-lsocket
-;;
-esac
-
-AC_SUBST(SOCKET_LIB)
-
-dnl =================================================================
-dnl Mac OSX specific
-dnl =================================================================
-    
-case "$host" in
-*-apple-darwin*) SPECIAL_CFLAGS="-Dunix"
-;;  
-esac
-
-dnl =================================================================
-dnl AmigaOS specific
-dnl =================================================================
-
-AMIGAOS_ONLY=#
-
-case "$host" in
-*-amigaos) AMIGAOS_ONLY=
-;;
-esac
-
-AC_SUBST(AMIGAOS_ONLY)
-
-dnl =================================================================
-dnl Check for standard compiler stuff
-dnl =================================================================
-
 AC_EXEEXT
 AC_OBJEXT
-AC_HEADER_STDC
-AC_C_CONST
-AC_TYPE_SIZE_T
-AC_CHECK_SIZEOF(int, 4)
-AC_CHECK_SIZEOF(char *, 4)
-AC_CHECK_SIZEOF(long, 4)
-AC_CHECK_SIZEOF(long long, 8)
-AC_CHECK_SIZEOF(size_t, 4)
+
+dnl Checks for libraries.
+dnl AC_CHECK_LIB(pcre, pcre_compile)
+dnl AC_CHECK_LIB(pcreposix, regcomp, pcre)
 
 dnl Checks for header files.
+AC_HEADER_STDC
 dnl AC_HEADER_SYS_WAIT
 dnl AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/time.h unistd.h)
+dnl limits.h is for PCRE:
+dnl AC_CHECK_HEADERS(limits.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
 
 dnl Checks for library functions.
 dnl AC_TYPE_SIGNAL
@@ -795,211 +169,183 @@ dnl AC_CHECK_FUNC(strstr)
 dnl bcopy and memmove are for PCRE
 AC_CHECK_FUNCS(strerror bcopy memmove)
 
+dnl Build type
 
-dnl =================================================================
-dnl Checks for libraries.
-dnl =================================================================
-dnl Note: Some systems may have the library but not the system header
-dnl       file, so we must check for both.
-AC_CHECK_LIB(pcre, pcre_compile, [AC_CHECK_HEADER(pcre.h, [have_pcre=yes], [have_pcre=no])], [have_pcre=no])
-AC_CHECK_LIB(pcreposix, regcomp, [AC_CHECK_HEADER(pcreposix.h, [have_pcreposix=yes], [have_pcreposix=no])], [have_pcreposix=no], -lpcre)
-AC_CHECK_LIB(pcrs, pcrs_compile, [AC_CHECK_HEADER(pcrs.h, [have_pcrs=yes], [have_pcrs=no])], [have_pcrs=no])
-
+AC_ARG_ENABLE(mingw32,
+[  --enable-mingw32        Use mingw32 for a Windows GUI],
+[if test $enableval = yes; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+    fi
+  fi],
+[if test "$MINGW32" = "yes"; then
+    WIN_ONLY=
+    CYGWIN_FLAGS="-mwindows -mno-cygwin"
+    echo "Using mingw32 (Win32 GUI)"
+  else
+    WIN_ONLY=#
+    if test "$CYGWIN" = "yes"; then
+      CYGWIN_FLAGS="-mno-win32"
+      echo "Using Cygnus (Win32 command line)"
+    else
+      CYGWIN_FLAGS=
+    fi
+  fi])
 
-dnl =================================================================
-dnl Always defined
-dnl =================================================================
+AC_SUBST(WIN_ONLY)
+AC_SUBST(CYGWIN_FLAGS)
 
-AC_DEFINE(__MT__)
+SOLARIS_ONLY=#
+AC_SUBST(SOLARIS_ONLY)
 
-dnl =================================================================
 dnl Features
-dnl =================================================================
+
+dnl Regex engine:
+
+GNU_REGEX_ONLY=
+PCRE_REGEX_ONLY=
+NO_REGEX_ONLY=#
+
+AC_ARG_ENABLE(regex,
+[  --disable-regex         Don't allow regular expressions in the blockfile],
+[if test $enableval = yes; then
+  AC_DEFINE(REGEX)
+else
+  NO_REGEX_ONLY=
+  GNU_REGEX_ONLY=#
+  PCRE_REGEX_ONLY=#
+fi],AC_DEFINE(REGEX))
+
+AC_ARG_ENABLE(pcre-regex,
+[  --disable-pcre-regex    Use old, slow GNU Regex instead of PCRE.],
+[if test $enableval = yes; then
+  AC_DEFINE(PCRE)
+  GNU_REGEX_ONLY=#
+else
+  PCRE_REGEX_ONLY=#
+fi],[AC_DEFINE(PCRE)
+  GNU_REGEX_ONLY=#
+])
+
+AC_SUBST(GNU_REGEX_ONLY)
+AC_SUBST(PCRE_REGEX_ONLY)
+AC_SUBST(NO_REGEX_ONLY)
+
+
+dnl Other features:
 
 AC_ARG_ENABLE(toggle,
-[  --disable-toggle         Don't support temporary disable],
+[  --disable-toggle        Don't support temporary disable],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_TOGGLE)
-fi],AC_DEFINE(FEATURE_TOGGLE))
+  AC_DEFINE(TOGGLE)
+fi],AC_DEFINE(TOGGLE))
+
+PCRS_ONLY=
+AC_ARG_ENABLE(pcrs,
+[  --disable-pcrs          Don't support arbitrary content modification],
+[if test $enableval = yes; then
+  AC_DEFINE(PCRS)
+  AC_DEFINE(DENY_GZIP)
+else
+  PCRS_ONLY=#
+fi],[AC_DEFINE(PCRS) AC_DEFINE(DENY_GZIP)])
+AC_SUBST(PCRS_ONLY)
 
 AC_ARG_ENABLE(force,
-[  --disable-force          Don't allow single-page disable],
+[  --disable-force         Don't allow blockfle to be bypassed],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_FORCE_LOAD)
-fi],AC_DEFINE(FEATURE_FORCE_LOAD))
+  AC_DEFINE(FORCE_LOAD)
+fi],AC_DEFINE(FORCE_LOAD))
 
 AC_ARG_ENABLE(fast-redirects,
 [  --disable-fast-redirects Don't support fast redirects],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_FAST_REDIRECTS)
-fi], AC_DEFINE(FEATURE_FAST_REDIRECTS))
+  AC_DEFINE(FAST_REDIRECTS)
+fi], AC_DEFINE(FAST_REDIRECTS))
 
 AC_ARG_ENABLE(killpopup,
-[  --disable-killpopup      Never block popups],
+[  --disable-killpopup     Never block popups],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_KILL_POPUPS)
-fi],AC_DEFINE(FEATURE_KILL_POPUPS))
+  AC_DEFINE(KILLPOPUPS)
+fi],AC_DEFINE(KILLPOPUPS))
 
 AC_ARG_ENABLE(stats,
-[  --disable-stats          Don't keep statistics],
+[  --disable-stats         Don't keep statistics],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_STATISTICS)
-fi],AC_DEFINE(FEATURE_STATISTICS))
+  AC_DEFINE(STATISTICS)
+fi],AC_DEFINE(STATISTICS))
+
+AC_ARG_ENABLE(split-proxy-args,
+[  --disable-split-proxy-args  One big show-proxy-args page, not one per file.],
+[if test $enableval = yes; then
+  AC_DEFINE(SPLIT_PROXY_ARGS)
+fi],AC_DEFINE(SPLIT_PROXY_ARGS))
+
+AC_ARG_ENABLE(webdav,
+[  --disable-webdav        Don't support WebDAV.  This option stops MS Outlook
+                          Express from accessing HotMail e-mail.],
+[if test $enableval = yes; then
+  AC_DEFINE(WEBDAV)
+fi],
+AC_DEFINE(WEBDAV))
 
 AC_ARG_ENABLE(ie-images,
-[  --disable-ie-images      Don't auto-detect whether a request from MS Internet
-                           Explorer is for an image or HTML.],
+[  --disable-ie-images     Don't auto-detect whether a request from MS Internet
+                          Explorer is for an image or HTML.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_IMAGE_DETECT_MSIE)
+  AC_DEFINE(DETECT_MSIE_IMAGES)
 fi],
-AC_DEFINE(FEATURE_IMAGE_DETECT_MSIE))
+AC_DEFINE(DETECT_MSIE_IMAGES))
 
 AC_ARG_ENABLE(image-blocking,
-[  --disable-image-blocking Don't try to figure out whether a request is 
-                           for an image or HTML - assume HTML.],
+[  --disable-image-blocking  Don't try to figure out whether a request is 
+                            for an image or HTML - assume HTML.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_IMAGE_BLOCKING)
+  AC_DEFINE(IMAGE_BLOCKING)
 fi],
-AC_DEFINE(FEATURE_IMAGE_BLOCKING))
+AC_DEFINE(IMAGE_BLOCKING))
 
 AC_ARG_ENABLE(acl-files,
-[  --disable-acl-files      Prevents the use of ACL files to control access to
-                           the proxy by IP address.],
+[  --disable-acl-files     Prevents the use of ACL files to control access to
+                          the proxy by IP address.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_ACL)
+  AC_DEFINE(ACL_FILES)
 fi],
-AC_DEFINE(FEATURE_ACL))
+AC_DEFINE(ACL_FILES))
 
 AC_ARG_ENABLE(trust-files,
-[  --disable-trust-files    Prevents the use of trust files.],
+[  --disable-trust-files   Prevents the use of trust files.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_TRUST)
+  AC_DEFINE(TRUST_FILES)
 fi],
-AC_DEFINE(FEATURE_TRUST))
+AC_DEFINE(TRUST_FILES))
 
 AC_ARG_ENABLE(jar-files,
-[  --disable-jar-files      Prevents the use of jar files to capture cookies.],
+[  --disable-jar-files     Prevents the use of jar files to capture cookies.],
 [if test $enableval = yes; then
-  AC_DEFINE(FEATURE_COOKIE_JAR)
+  AC_DEFINE(JAR_FILES)
 fi],
-AC_DEFINE(FEATURE_COOKIE_JAR))
+AC_DEFINE(JAR_FILES))
 
-AC_ARG_ENABLE(editor,
-[  --disable-editor         Prevents the use of the web-based actions file
-                           editor and web-based temporary disable setting.],
-[if test $enableval = yes; then
-  AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS)
-fi],
-AC_DEFINE(FEATURE_CGI_EDIT_ACTIONS))
-
-AC_ARG_ENABLE(no-gifs,
-[  --enable-no-gifs         Use politically correct PNG format instead of GIF
-                           for built-in images. May not work with all browsers.],
-[if test $enableval = yes; then
-  AC_DEFINE(FEATURE_NO_GIFS)
-fi])
-
-
-dnl pcre/pcrs is needed for CGI anyway, so
-dnl the choice is only between static and
-dnl dynamic:
-
-AC_ARG_ENABLE(regex-matching,
-[  --enable-regex-matching=pcre  Use perl-compatible regex for actionsfile
-                                pattern matching (default)
-  --enable-regex-matching=gnu   Use gnu style regex for actionsfile pattern
-                                matching (-> bigger binary)
-  --disable-regex-matching      Don't use regex matching, compare URL
-                                prefix instead (won't shrink birary)],
-[ regex_matching=$enableval ],
-[ regex_matching=pcre ])
-
-AC_ARG_ENABLE(dynamic-pcre,
-[  --disable-dynamic-pcre        Use the built-in, static pcre, even if
-                                libpcre is available],
-[ if test $enableval = "no"; then have_pcre=no; fi ])
-
-AC_ARG_ENABLE(dynamic-pcrs,
-[  --disable-dynamic-pcrs        Use the built-in, static pcrs, even if
-                                libpcrs is available],
-[ if test $enableval = "no"; then have_pcrs=no; fi ])
-
-
-# Is the regex URL matching based on libpcreposix, but we
-# don't have that library?
-#
-if test $have_pcreposix = "yes" -o $regex_matching != "pcre"; then
-  dont_miss_pcreposix=yes
-else
-  dont_miss_pcreposix=no
-fi
-
-# If we have libpcre and either we also have pcreposix or
-# we don't need pcreposix, then link pcre dynamically; else
-# build it and link statically
-#
-if test $have_pcre = "yes" -a $dont_miss_pcreposix = "yes"; then
-  echo "using libpcre"
-  pcre_dyn=yes
+LIBRARY_PCRE_ONLY=#
+STATIC_PCRE_ONLY=
+AC_ARG_ENABLE(static-pcre,
+[  --disable-static-pcre   Link dynamically with the pcre and pcreposix
+                          libraries.  You must build the libraries seperately.],
+[if test $enableval = no; then
+  LIBRARY_PCRE_ONLY=
   STATIC_PCRE_ONLY=#
-  LIBS="$LIBS -lpcre"
-else
-  echo "using built-in static pcre"
-  pcre_dyn=no
-  AC_DEFINE(STATIC_PCRE)
-  STATIC_PCRE_ONLY=
-fi
-
-# If we have libpcrs and pcre is linked dynamically
-# then also link pcrs dynamically, else build and link
-# pcrs statically
-#
-if test $have_pcrs = "yes" -a $pcre_dyn = "yes"; then
-  echo "using libpcrs"
-  STATIC_PCRS_ONLY=#
-  LIBS="$LIBS -lpcrs"
-else
-  echo "using built-in static pcrs"
-  AC_DEFINE(STATIC_PCRS)
-  STATIC_PCRS_ONLY=
-fi
-
-# Which method should be used for URL matching?
-# pcre, gnu regex or prefix matching?
-#
-if test $regex_matching = "gnu"; then
-  echo "using gnu regex for URL matching"
-  AC_DEFINE(REGEX_GNU)
-  GNU_REGEX_ONLY=
-  PCRE_REGEX_ONLY=#
-elif test $regex_matching = "pcre"; then
-  echo "using pcre regex for URL matching"
-  AC_DEFINE(REGEX_PCRE)
-  GNU_REGEX_ONLY=#
-  PCRE_REGEX_ONLY=
-  if test $pcre_dyn = "yes"; then
-    LIBS="$LIBS -lpcreposix"
-  fi
-else
-  echo -e "using prefix matching for URLs\nHint: This does NOT make the executable any smaller!"
-  GNU_REGEX_ONLY=#
-  PCRE_REGEX_ONLY=#
-fi
-
-AC_SUBST(GNU_REGEX_ONLY)
-AC_SUBST(PCRE_REGEX_ONLY)
+fi])
+AC_SUBST(LIBRARY_PCRE_ONLY)
 AC_SUBST(STATIC_PCRE_ONLY)
-AC_SUBST(STATIC_PCRS_ONLY)
-
-dnl =================================================================
-dnl Final cleanup and output
-dnl =================================================================
-
-dnl Remove the SPECIAL_CFLAGS stuff from CFLAGS, and add it seperately
-dnl in the Makefile
-CFLAGS=$old_CFLAGS_nospecial
-AC_SUBST(SPECIAL_CFLAGS)
 
-AC_SUBST(PTHREAD_LIB)
+AC_OUTPUT(Makefile)
 
-AC_OUTPUT(GNUmakefile)
old mode 100644 (file)
new mode 100755 (executable)
similarity index 58%
rename from vc_console.dsp
rename to console_junkbuster.dsp
index 6e1ee2d..8e56f21
@@ -1,30 +1,26 @@
-# Microsoft Developer Studio Project File - Name="vc_console" - Package Owner=<4>\r
+# Microsoft Developer Studio Project File - Name="console_junkbuster" - Package Owner=<4>\r
 # Microsoft Developer Studio Generated Build File, Format Version 5.00\r
 # ** DO NOT EDIT **\r
 \r
 # TARGTYPE "Win32 (x86) Console Application" 0x0103\r
 \r
-CFG=vc_console - Win32 Debug with Win32 threads\r
+CFG=console_junkbuster - Win32 Debug\r
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
 !MESSAGE use the Export Makefile command and run\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_console.mak".\r
+!MESSAGE NMAKE /f "console_junkbuster.mak".\r
 !MESSAGE \r
 !MESSAGE You can specify a configuration when running NMAKE\r
 !MESSAGE by defining the macro CFG on the command line. For example:\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_console.mak"\\r
- CFG="vc_console - Win32 Debug with Win32 threads"\r
+!MESSAGE NMAKE /f "console_junkbuster.mak"\\r
+ CFG="console_junkbuster - Win32 Debug"\r
 !MESSAGE \r
 !MESSAGE Possible choices for configuration are:\r
 !MESSAGE \r
-!MESSAGE "vc_console - Win32 Release" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Release" (based on\\r
  "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Debug" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Debug with Win32 threads" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_console - Win32 Release with Win32 threads" (based on\\r
+!MESSAGE "console_junkbuster - Win32 Debug" (based on\\r
  "Win32 (x86) Console Application")\r
 !MESSAGE \r
 \r
@@ -34,7 +30,7 @@ CFG=vc_console - Win32 Debug with Win32 threads
 CPP=cl.exe\r
 RSC=rc.exe\r
 \r
-!IF  "$(CFG)" == "vc_console - Win32 Release"\r
+!IF  "$(CFG)" == "console_junkbuster - Win32 Release"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -56,9 +52,9 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:console /machine:I386\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -80,66 +76,14 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-\r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "console_"\r
-# PROP BASE Intermediate_Dir "console_"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "console_debug_winthr"\r
-# PROP Intermediate_Dir "console_debug_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /FR /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
 \r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "console0"\r
-# PROP BASE Intermediate_Dir "console0"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "console_release_winthr"\r
-# PROP Intermediate_Dir "console_release_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_WIN_CONSOLE" /D "STATIC" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:console /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:console /machine:I386\r
-\r
 !ENDIF \r
 \r
 # Begin Target\r
 \r
-# Name "vc_console - Win32 Release"\r
-# Name "vc_console - Win32 Debug"\r
-# Name "vc_console - Win32 Debug with Win32 threads"\r
-# Name "vc_console - Win32 Release with Win32 threads"\r
+# Name "console_junkbuster - Win32 Release"\r
+# Name "console_junkbuster - Win32 Debug"\r
 # Begin Group "JunkBuster"\r
 \r
 # PROP Default_Filter ""\r
@@ -173,34 +117,10 @@ SOURCE=.\cgi.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\cgiedit.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgiedit.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\config.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\deanimate.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\deanimate.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\errlog.c\r
 # End Source File\r
 # Begin Source File\r
@@ -261,16 +181,49 @@ SOURCE=.\project.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.c\r
+SOURCE=.\showargs.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.h\r
+SOURCE=.\showargs.h\r
 # End Source File\r
 # End Group\r
 # Begin Group "Win32"\r
 \r
 # PROP Default_Filter ""\r
+# Begin Group "File Copy"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\config.h.win\r
+\r
+!IF  "$(CFG)" == "console_junkbuster - Win32 Release"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "console_junkbuster - Win32 Debug"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
 # Begin Source File\r
 \r
 SOURCE=.\cygwin.h\r
@@ -290,27 +243,7 @@ SOURCE=.\win32.h
 # Begin Source File\r
 \r
 SOURCE=.\pcre\chartables.c\r
-\r
-!IF  "$(CFG)" == "vc_console - Win32 Release"\r
-\r
 # PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_console - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
 # End Source File\r
 # Begin Source File\r
 \r
diff --git a/contrib.sh b/contrib.sh
deleted file mode 100755 (executable)
index 74d5b72..0000000
+++ /dev/null
@@ -1,4035 +0,0 @@
-#!/bin/bash
-
-echo "This script will create the gen_list contrib files in the current"
-echo "directory.  Do you wish to continue? [y/n]"
-
-typeset ans="n"
-read ans
-
-if [[ ${ans} != [Yy]* ]]; then
-       echo "Goodbye."
-       exit 1
-fi
-
-
-typeset fileList="Makefile README addr_clean.pl gen_list.c gen_list.h isa.c
-isa.h main.c malloc_police.c malloc_police.h rec_char.c rec_char.h
-rec_charptr.c rec_charptr.h rec_double.c rec_double.h rec_long.c
-rec_long.h rec_malloc_police.c rec_malloc_police.h"
-
-
-for i in ${fileList}; do
-
-       echo "creating ${i}"
-
-       ####################################
-       ##  sed explained:
-       ##
-       ##              -e "s/^\(#${i}:\)\(.*\)/\2/"
-       ##                      Find lines belonging to
-       ##                      this file and remove the
-       ##                      filename prefix.
-       ##
-       ##              -e "t print"
-       ##                      Jump to label print if the
-       ##                      above s command matched
-       ##
-       ##              -e "d"
-       ##                      This command is skipped
-       ##                      when the s command fails.
-       ##                      This will remove any
-       ##                      non-matching data.
-       ##
-       ##              -e ":print"
-       ##                      The last thing sed does
-       ##                      is print the data.  So,
-       ##                      by now, we only print
-       ##                      lines belonging to the file.
-       ##
-       ####################################
-
-       sed     -e "s/^\(#${i}:\)\(.*\)/\2/" \
-                       -e "t print" \
-                       -e "d" \
-                       -e ":print" \
-                       ${0} > ${i}
-
-done
-
-echo "done."
-
-exit 0
-
-#Makefile:PROGRAM      = test_list
-#Makefile:CFLAGS       = -g
-#Makefile:SRC          = main.c isa.c gen_list.c rec_char.c rec_charptr.c rec_double.c rec_long.c rec_malloc_police.c malloc_police.c
-#Makefile:OBJS         = main.o isa.o gen_list.o rec_char.o rec_charptr.o rec_double.o rec_long.o rec_malloc_police.o malloc_police.o
-#Makefile:
-#Makefile:all : $(PROGRAM)
-#Makefile:
-#Makefile:$(PROGRAM) : $(OBJS)
-#Makefile:     gcc $(CFLAGS) -o $(PROGRAM) $(OBJS)
-#Makefile:
-#Makefile:clean:
-#Makefile:     rm -f $(OBJS)
-#Makefile:
-#Makefile:clobber: clean
-#Makefile:     rm -f $(PROGRAM)
-
-
-#README:This list supports:
-#README:       copy construction,
-#README:       "virtual" destruction,
-#README:       streaming,
-#README:       comparison (equal comparison currently supported).
-#README:
-#README:With the "object oriented" nature of the list, nodes, and records; it is
-#README:easily concievable that sorted lists and hash tables could be implemented
-#README:with little extra effort.
-#README:
-#README:
-#README:Philosophical point:
-#README:
-#README:I am sure there is room for improvement with this design.  I am
-#README:submitting this as a generic doubly linked list recomendation for IJB.
-#README:Whatever the "collective" decides is fine with me.
-#README:
-#README:This implementation uses the "naming space" of gen_list, derived_rec,
-#README:construct, copy construct, stream, destruct, etc...  These are open to
-#README:argument.  I just used what was familiar to me and others in the "OO"
-#README:community.  If these need changed to be adopted ... "so be it".
-#README:
-#README:
-#README:Implementation point:
-#README:
-#README:I assume this is too late for a "3.0" release.  As I work for an
-#README:airline, the whole past summer has been hectic (not to mention the
-#README:last 4 months); but things have begun to settle down and I am
-#README:following the IJB lists a bit more closely.  And I would like to say
-#README:"HOLY CRAP!" .. you guys have accompolished a lot!  Way to go.
-#README:
-#README:But, the adoption of a better linked list package should at least be
-#README:high on the next release list (if not the current one).  If you choose
-#README:this submission or not, so be it.  But as a "data structure" man, I
-#README:think IJB's linked lists need addressing.
-#README:
-#README:
-#README:List/Enlist note:
-#README:
-#README:I have noticed the list.c file.  If this generic list is adopted, I
-#README:think all existing functionallity could be duplicated with the
-#README:"copy_contruct", "equal", and "destruct" `virtuals'.  This would also
-#README:eliminate and/or enhance the other manually maintained lists in IJB.
-#README:
-#README:
-#README:Debug note:
-#README:
-#README:Since the generic list defined a "stream" virtual, it could be programmed
-#README:that the list could print itself whenever a FATAL error occurs.  A user (or
-#README:programmer) could read the list and hopefully determine the cause of the
-#README:abend.
-#README:
-#README:
-#README:Potential note:
-#README:
-#README:Think of the possibilites of a linked list, sorted list, and/or a hash
-#README:list.  Think of a request to a web site that has been referenced
-#README:before.  If a hash list keep track of all block requests and regexp
-#README:change commands, then a site could be blocked and/or modified without
-#README:ever consulting the actions lists again.  What a speed up!
-#README:
-#README:What if some of the current lists were kept in sorted lists?  Then a
-#README:search for a particular record could be a binary search instead of a
-#README:linear search.
-#README:
-#README:The actions file(s) and regexp files(s) could be inserted into the
-#README:list from front to back order (or visa versa) and the processing would
-#README:take place in actual file order (which is more natural); rather than
-#README:in reverse order (as it is today).
-#README:
-#README:
-#README:Thank you for you time and attention to this contribution.  If it is
-#README:"blessed" by the group, I am available to give time to integrating
-#README:this into IJB.
-#README:
-#README:Let me know what y'all think about this package.
-#README:
-#README:-- 
-#README:Rodney
-
-
-#addr_clean.pl:#!/usr/bin/perl
-#addr_clean.pl:
-#addr_clean.pl:##      *********************************************************************
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * File                  :       $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Purpose               :       Cleans addresses out of ./test_list and replaces
-#addr_clean.pl:##      *                                               them with "english" replacements.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Usage                 :       ./test_list | ./addr_clean.pl
-#addr_clean.pl:##      *
-#addr_clean.pl:##      * Copyright             :       This program is free software; you can redistribute it 
-#addr_clean.pl:##      *                                               and/or modify it under the terms of the GNU General
-#addr_clean.pl:##      *                                               Public License as published by the Free Software
-#addr_clean.pl:##      *                                               Foundation; either version 2 of the License, or (at
-#addr_clean.pl:##      *                                               your option) any later version.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      *                                               This program is distributed in the hope that it will
-#addr_clean.pl:##      *                                               be useful, but WITHOUT ANY WARRANTY; without even the
-#addr_clean.pl:##      *                                               implied warranty of MERCHANTABILITY or FITNESS FOR A
-#addr_clean.pl:##      *                                               PARTICULAR PURPOSE.     See the GNU General Public
-#addr_clean.pl:##      *                                               License for more details.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      *                                               The GNU General Public License should be included with
-#addr_clean.pl:##      *                                               this file.      If not, you can view it at
-#addr_clean.pl:##      *                                               http://www.gnu.org/copyleft/gpl.html
-#addr_clean.pl:##      *                                               or write to the Free Software Foundation, Inc., 59
-#addr_clean.pl:##      *                                               Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#addr_clean.pl:##      *
-#addr_clean.pl:##      **********************************************************************/
-#addr_clean.pl:
-#addr_clean.pl:use strict;
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:my $nMaxList = 0;
-#addr_clean.pl:my $nMaxNode = 0;
-#addr_clean.pl:my $nMaxRec = 0;
-#addr_clean.pl:my %aaTranslation;
-#addr_clean.pl:my $strLine;
-#addr_clean.pl:
-#addr_clean.pl:while ( $strLine = <STDIN> )
-#addr_clean.pl:{
-#addr_clean.pl:        if ( $strLine =~ m!(list.*=\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(list.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(node.*=\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(node.*=\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $3;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(rec.*=\s*(iter_. \.\.\. )?)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        ## Catch the copy constuct syntax
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(list.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "list" . ++ $nMaxList;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(list.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(node.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "node" . ++ $nMaxNode;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(node.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:
-#addr_clean.pl:        if ( $strLine =~ m!(rec.*=>\s*)(0x[0-9a-f]+)! )
-#addr_clean.pl:        {
-#addr_clean.pl:                my $str1 = $1;
-#addr_clean.pl:                my $str2 = $2;
-#addr_clean.pl:
-#addr_clean.pl:                if ( ! defined $aaTranslation{$str2} )
-#addr_clean.pl:                {
-#addr_clean.pl:                        $aaTranslation{$str2} = "rec" . ++ $nMaxRec;
-#addr_clean.pl:                }
-#addr_clean.pl:                $strLine =~ s!(rec.*=>\s*)(0x[0-9a-f]+)!$str1($aaTranslation{$str2})!;
-#addr_clean.pl:        }
-#addr_clean.pl:
-#addr_clean.pl:        print( $strLine );
-#addr_clean.pl:
-#addr_clean.pl:}
-
-
-#gen_list.c:const char gen_list_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#gen_list.c: *
-#gen_list.c: * Purpose     :  To create some functions to do generic doubly linked
-#gen_list.c: *                                         list management.
-#gen_list.c: *
-#gen_list.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#gen_list.c: *                Privoxy team. http://www.privoxy.org/
-#gen_list.c: *
-#gen_list.c: *                This program is free software; you can redistribute it
-#gen_list.c: *                and/or modify it under the terms of the GNU General
-#gen_list.c: *                Public License as published by the Free Software
-#gen_list.c: *                Foundation; either version 2 of the License, or (at
-#gen_list.c: *                your option) any later version.
-#gen_list.c: *
-#gen_list.c: *                This program is distributed in the hope that it will
-#gen_list.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#gen_list.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#gen_list.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#gen_list.c: *                License for more details.
-#gen_list.c: *
-#gen_list.c: *                The GNU General Public License should be included with
-#gen_list.c: *                this file.  If not, you can view it at
-#gen_list.c: *                http://www.gnu.org/copyleft/gpl.html
-#gen_list.c: *                or write to the Free Software Foundation, Inc., 59
-#gen_list.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#gen_list.c: *
-#gen_list.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#gen_list.c: *                                         and edit IJB, correctly.
-#gen_list.c: *
-#gen_list.c: * Revisions   :
-#gen_list.c: *    $Log: contrib.sh,v $
-#gen_list.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#gen_list.c: *    name change related issues
-#gen_list.c: *
-#gen_list.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#gen_list.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#gen_list.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#gen_list.c: *    contrib directory and I cannot upload a tarball ... it gets
-#gen_list.c: *    corrupted).  This script will expand all files needed to create the
-#gen_list.c: *    linked list modules and an example program.  Please see the README.
-#gen_list.c: *    Feed back is welcomed.  Enjoy.
-#gen_list.c: *
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:\f
-#gen_list.c:
-#gen_list.c:#include <malloc.h>
-#gen_list.c:#include <stdio.h>
-#gen_list.c:#include <stdlib.h>
-#gen_list.c:#include <string.h>
-#gen_list.c:
-#gen_list.c:#include "gen_list.h"
-#gen_list.c:#include "malloc_police.h"
-#gen_list.c:
-#gen_list.c:const char gen_list_h_rcs[] = GEN_LIST_H_VERSION;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/* This is used (for the moment) to cut out all the        */
-#gen_list.c:/* extra verbige of the malloc_police module.  After       */
-#gen_list.c:/* all, we do not want to see construct/destruct of a      */
-#gen_list.c:/* class that is supposed to be "in the background".       */
-#gen_list.c:
-#gen_list.c:/* But it could lead to broader usage.                                             */
-#gen_list.c:
-#gen_list.c:int list_is_quiet = 0;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:#define CALL_VT_REC_COPY_CONSTRUCT(rec)    (((rec_copy_construct)(rec)->vtable[ VT_REC_COPY_CONSTRUCT ])( rec ))
-#gen_list.c:#define CALL_VT_REC_DESTRUCT(rec)                  (((rec_destruct)(rec)->vtable[ VT_REC_DESTRUCT ])( rec ))
-#gen_list.c:#define CALL_VT_REC_STREAM(rec)                            (((rec_stream)(rec)->vtable[ VT_REC_STREAM ])( rec ))
-#gen_list.c:#define CALL_VT_REC_EQUAL(rec,eq_rec)              (((rec_equal)((rec)->vtable[ VT_REC_EQUAL ]))( rec, eq_rec ))
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Called from a derived list record class ONLY.
-#gen_list.c: *                                         This function "construct" a classs: malloc_ed,
-#gen_list.c: *                                         vtable, isa, and sizeof_rec "attributes".
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.  If NULL, malloc is called.
-#gen_list.c: *                         2       :       isa (prounced "is a") ... type of the record.
-#gen_list.c: *                         3       :       Memory image size of this record.
-#gen_list.c: *                  ...    :       The "virtuals" for this record.  NOTE: this list
-#gen_list.c: *                                         may increase if more "virtuals" are added.
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the record (either the orig record
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_rec *this_rec = (struct gen_list_rec *)MALLOC( sizeof_rec );
-#gen_list.c:   this_rec->vtable                = _vtable;
-#gen_list.c:   this_rec->isa                   = isa;
-#gen_list.c:   this_rec->sizeof_rec    = sizeof_rec;
-#gen_list.c:
-#gen_list.c:   return( this_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current existing record.  All
-#gen_list.c: *                                         inherited properties (isa, vtable, malloc_ed, ...)
-#gen_list.c: *                                         are kept in tact after the copy.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing record.
-#gen_list.c: *                         2       :  New record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_copy_construct( const struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_rec *copy_rec = (struct gen_list_rec *)MALLOC( this_rec->sizeof_rec );
-#gen_list.c:   copy_rec->vtable                = this_rec->vtable;
-#gen_list.c:   copy_rec->isa                   = this_rec->isa;
-#gen_list.c:   copy_rec->sizeof_rec    = this_rec->sizeof_rec;
-#gen_list.c:
-#gen_list.c:   return( copy_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the record.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_rec_destruct( struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   FREE( this_rec );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_rec *gen_list_rec_stream( const struct gen_list_rec *this_rec )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\t\tstream rec isa = %s\n", isa_ra[ this_rec->isa ] ) );
-#gen_list.c:   return( this_rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_rec_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two records to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A record.
-#gen_list.c: *          2  :  Another record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_rec && NULL == eq_rec )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == this_rec && NULL != eq_rec )  ||
-#gen_list.c:                   ( NULL != this_rec && NULL == eq_rec ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( this_rec->isa != eq_rec->isa ) ||
-#gen_list.c:                   ( this_rec->sizeof_rec != eq_rec->sizeof_rec ) )
-#gen_list.c:   {
-#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different rec types is unsupported at this time.\n" ) );
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( 1 );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*\f*********************************************************************/
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:struct gen_list_node
-#gen_list.c:{
-#gen_list.c:   /* private: */
-#gen_list.c:   struct gen_list_node    *next;
-#gen_list.c:   struct gen_list_node    *prev;
-#gen_list.c:
-#gen_list.c:   struct gen_list_rec     *rec;
-#gen_list.c:};
-#gen_list.c:/* public: */
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_construct( struct gen_list_rec *_rec );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_copy_construct( const struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_destruct( struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_remove( struct gen_list_node *this_node );
-#gen_list.c:
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev );
-#gen_list.c:
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_next( const struct gen_list_node *this_node );
-#gen_list.c:extern struct gen_list_node *                      gen_list_node_get_prev( const struct gen_list_node *this_node );
-#gen_list.c:
-#gen_list.c:extern const struct gen_list_rec   *       gen_list_node_stream( const struct gen_list_node *this_node );
-#gen_list.c:extern int                                                                 gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node );
-#gen_list.c:
-#gen_list.c:/* struct/class COMPLETE */
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Constructs a generic list node and sets its record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.  If NULL, malloc is called.
-#gen_list.c: *          2  :  The nodes record contents.
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the node (either the orig node
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_construct( struct gen_list_rec *_rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *this_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tconstruct new node\t\t= %p
-#gen_list.c:\tconstruct new node->rec\t= %p\n\n", (const void *)this_node, (const void *)_rec ) );
-#gen_list.c:
-#gen_list.c:   this_node->rec          = _rec;
-#gen_list.c:   this_node->next = NULL;
-#gen_list.c:   this_node->prev = NULL;
-#gen_list.c:
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current node.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing node.
-#gen_list.c: *                         2       :  New node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_copy_construct( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *copy_node = (struct gen_list_node *)MALLOC( sizeof( struct gen_list_node ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\tcopy construct new node = %p => %p\n\n", (const void *)this_node, (const void *)copy_node ) );
-#gen_list.c:
-#gen_list.c:   copy_node->rec          = CALL_VT_REC_COPY_CONSTRUCT( this_node->rec );
-#gen_list.c:   copy_node->next = NULL;
-#gen_list.c:   copy_node->prev = NULL;
-#gen_list.c:
-#gen_list.c:   return( copy_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_destruct( struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tdestruct this_node\t\t\t= %p
-#gen_list.c:\tdestruct this_node->rec\t\t= %p
-#gen_list.c:\tdestruct this_node->next\t= %p
-#gen_list.c:\tdestruct this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   if ( NULL != this_node->rec )
-#gen_list.c:   {
-#gen_list.c:           CALL_VT_REC_DESTRUCT( this_node->rec );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   FREE( this_node );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_remove
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the node.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_remove( struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tremove this_node\t\t\t= %p
-#gen_list.c:\tremove this_node->rec\t= %p
-#gen_list.c:\tremove this_node->next\t= %p
-#gen_list.c:\tremove this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   FREE( this_node );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_set_next
-#gen_list.c: *
-#gen_list.c: * Description :  Sets the next node in the list series.  Used mainly
-#gen_list.c: *                                         when constructing and adding/removing nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *          2  :  The next node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_set_next( struct gen_list_node *this_node, struct gen_list_node *_next )
-#gen_list.c:{
-#gen_list.c:   this_node->next = _next;
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_set_prev
-#gen_list.c: *
-#gen_list.c: * Description :  Sets the previous node in the list series.  Used mainly
-#gen_list.c: *                                         when constructing and adding/removing nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *          2  :  The previous node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_set_prev( struct gen_list_node *this_node, struct gen_list_node *_prev )
-#gen_list.c:{
-#gen_list.c:   this_node->prev = _prev;
-#gen_list.c:   return( this_node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_get_next
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the next node in the list series.  Used mainly
-#gen_list.c: *                                         for traversing a list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The next node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_get_next( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   return( this_node->next );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_get_prev
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the previous node in the list series.  Used mainly
-#gen_list.c: *                                         for traversing a list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The previous node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_node *gen_list_node_get_prev( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   return( this_node->prev );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
-#gen_list.c: *                                         including the contents of the nodes record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The record.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The result of streaming the nodes record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_rec *gen_list_node_stream( const struct gen_list_node *this_node )
-#gen_list.c:{
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:\tstream this_node\t\t\t= %p
-#gen_list.c:\tstream this_node->rec\t= %p
-#gen_list.c:\tstream this_node->next\t= %p
-#gen_list.c:\tstream this_node->prev\t= %p\n\n", (const void *)this_node, (const void *)this_node->rec, (const void *)this_node->next, (const void *)this_node->prev ) );
-#gen_list.c:
-#gen_list.c:   return( CALL_VT_REC_STREAM( this_node->rec ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_node_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two nodes (and their records) to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A node.
-#gen_list.c: *          2  :  Another node.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_node_equal( const struct gen_list_node *this_node, const struct gen_list_node *eq_node )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_node && NULL == eq_node )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == this_node && NULL != eq_node ) ||
-#gen_list.c:                   ( NULL != this_node && NULL == eq_node ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( gen_list_rec_equal( this_node->rec, eq_node->rec ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*\f*********************************************************************/
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/* private: */
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_insert_node
-#gen_list.c: *
-#gen_list.c: * Description :  Inserts a node (not a record!) into a list.  This
-#gen_list.c: *                                         is (currently) only used in copy construction.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  A new node to insert into the list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_node *gen_list_insert_node( struct gen_list *this_list, struct gen_list_node *node )
-#gen_list.c:{
-#gen_list.c:   gen_list_node_set_next( node, NULL );
-#gen_list.c:
-#gen_list.c:   if ( NULL == this_list->first )
-#gen_list.c:   {
-#gen_list.c:           this_list->first = node;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == this_list->last )
-#gen_list.c:   {
-#gen_list.c:           this_list->last = node;
-#gen_list.c:   }
-#gen_list.c:   else
-#gen_list.c:   {
-#gen_list.c:           gen_list_node_set_next( this_list->last, node );
-#gen_list.c:           gen_list_node_set_prev( node, this_list->last );
-#gen_list.c:           this_list->last = node;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   this_list->last = node;
-#gen_list.c:
-#gen_list.c:   return( node );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Constructs a generic list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :   None
-#gen_list.c: *
-#gen_list.c: * Returns     :  A pointer to the list (either the orig list
-#gen_list.c: *                                         or the malloc_ed copy.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_construct()
-#gen_list.c:{
-#gen_list.c:   struct gen_list *this_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
-#gen_list.c:   LIST_SHOW( printf( "construct new list = %p\n\n", (const void *)this_list ) );
-#gen_list.c:
-#gen_list.c:   this_list->first        = NULL;
-#gen_list.c:   this_list->last = NULL;
-#gen_list.c:
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_copy_construct
-#gen_list.c: *
-#gen_list.c: * Description :  Makes a copy of the current list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  Existing list.
-#gen_list.c: *                         2       :  New list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The newly constructed copy list.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_copy_construct( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:   struct gen_list *copy_list = (struct gen_list *)MALLOC( sizeof( struct gen_list ) );
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "copy construct new list = %p => %p\n\n", (const void *)this_list, (const void *)copy_list ) );
-#gen_list.c:
-#gen_list.c:   copy_list->first        = NULL;
-#gen_list.c:   copy_list->last = NULL;
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *copy_node = gen_list_node_copy_construct( curr );
-#gen_list.c:           gen_list_insert_node( copy_list, copy_node );
-#gen_list.c:           curr = gen_list_node_get_next( curr );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( copy_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_destruct
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_destruct( struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:destruct this_list\t\t\t= %p
-#gen_list.c:destruct this_list->first\t= %p
-#gen_list.c:destruct this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_destruct( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   FREE( this_list );
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_remove_all
-#gen_list.c: *
-#gen_list.c: * Description :  Destruct the list.  Including free_ing the memory
-#gen_list.c: *                                         if applicable.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list *gen_list_remove_all( struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:remove_all this_list\t\t\t\t= %p
-#gen_list.c:remove_all this_list->first\t= %p
-#gen_list.c:remove_all this_list->last\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_remove( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   this_list->first = this_list->last = NULL;
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_remove
-#gen_list.c: *
-#gen_list.c: * Description :  A record from the list and return it if found.  This
-#gen_list.c: *                                         will allow a futher call to rec_destruct.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The record to be removed.
-#gen_list.c: *
-#gen_list.c: * Returns     :  rec if found and removed, NULL otherwise.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_remove( struct gen_list *this_list, struct gen_list_rec *rec )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node    *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:remove this_list\t\t\t= %p
-#gen_list.c:remove this_list->first\t= %p
-#gen_list.c:remove this_list->last\t= %p
-#gen_list.c:remove rec\t\t\t\t\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last, rec ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Grab these values before the are destroyed. */
-#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:
-#gen_list.c:           /* Access to rec, next, prev of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           if ( curr->rec == rec )
-#gen_list.c:           {
-#gen_list.c:                   /* Destruct the node, but not the record. */
-#gen_list.c:                   gen_list_node_remove( curr );
-#gen_list.c:
-#gen_list.c:                   if ( NULL == prev )
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is the first node in the list.                          */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [first] ---------------------> [next]                        */
-#gen_list.c:                           /* [NULL] <---------------------- [next->prev]  */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           this_list->first = next;
-#gen_list.c:
-#gen_list.c:                           if ( NULL == next )
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since next is NULL, then this is an empty list. */
-#gen_list.c:                                   this_list->last = NULL;
-#gen_list.c:                           }
-#gen_list.c:                           else
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since next is not NULL, then there is another node to make first. */
-#gen_list.c:                                   gen_list_node_set_prev( next, NULL );
-#gen_list.c:                           }
-#gen_list.c:                   }
-#gen_list.c:                   else if ( NULL == next )
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is the last node in the list.                           */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [last] ----------------------> [prev]                        */
-#gen_list.c:                           /* [prev->next] ----------------> [NULL]                        */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           this_list->last = prev;
-#gen_list.c:
-#gen_list.c:                           if ( NULL == prev )
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since prev is NULL, then this is an empty list. */
-#gen_list.c:                                   this_list->first = NULL;
-#gen_list.c:                           }
-#gen_list.c:                           else
-#gen_list.c:                           {
-#gen_list.c:                                   /* Since prev is NULL, then there is another node to make last. */
-#gen_list.c:                                   gen_list_node_set_next( prev, NULL );
-#gen_list.c:                           }
-#gen_list.c:                   }
-#gen_list.c:                   else
-#gen_list.c:                   {
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           /* This is a middle node in the list.                           */
-#gen_list.c:                           /*      Picture:                                                                                                */
-#gen_list.c:                           /* [prev->next] ----------------> [next]                        */
-#gen_list.c:                           /*                                      [removing middle]                                               */
-#gen_list.c:                           /* [prev] <---------------------- [next->prev]  */
-#gen_list.c:                           /************************************************/
-#gen_list.c:                           gen_list_node_set_next( prev, next );
-#gen_list.c:                           gen_list_node_set_prev( next, prev );
-#gen_list.c:                   }
-#gen_list.c:
-#gen_list.c:                   return( rec );
-#gen_list.c:           }
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_get_first
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the first record in the list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The first node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_get_first( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_list->first )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   return( this_list->first->rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_get_last
-#gen_list.c: *
-#gen_list.c: * Description :  Gets the last record in the list.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The last node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_get_last( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   if ( NULL == this_list->last )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   return( this_list->last->rec );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_insert
-#gen_list.c: *
-#gen_list.c: * Description :  Inserts a record into the list.  This is the
-#gen_list.c: *                                         primary API interface for inserting a record.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  A new record to insert into the list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The node.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list_node *gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec )
-#gen_list.c:{
-#gen_list.c:   return( gen_list_insert_node( this_list, gen_list_node_construct( _rec ) ) );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_stream
-#gen_list.c: *
-#gen_list.c: * Description :  Displays all attributes on the STDOUT stream,
-#gen_list.c: *                                         including the contents of the nodes.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  The list.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:const struct gen_list *gen_list_stream( const struct gen_list *this_list )
-#gen_list.c:{
-#gen_list.c:   const struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   LIST_SHOW( printf( "\
-#gen_list.c:stream this_list\t\t\t= %p
-#gen_list.c:stream this_list->first\t= %p
-#gen_list.c:stream this_list->last\t= %p\n\n", (const void *)this_list, (const void *)this_list->first, (const void *)this_list->last ) );
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:           gen_list_node_stream( curr );
-#gen_list.c:           curr = next;
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( this_list );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_equal
-#gen_list.c: *
-#gen_list.c: * Description :  Compares two lists (and their nodes) to see if they are equal.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  A list.
-#gen_list.c: *          2  :  Another list.
-#gen_list.c: *
-#gen_list.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:int gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *c1 = this_list->first;
-#gen_list.c:   struct gen_list_node *c2 = eq_list->first;
-#gen_list.c:   int eq = 1;
-#gen_list.c:
-#gen_list.c:   if ( ( NULL == c1 && NULL != c2 ) || ( NULL != c1 && NULL == c2 ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( ( eq ) && ( NULL != c1 ) && ( NULL != c2 ) )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           eq = CALL_VT_REC_EQUAL( c1->rec, c2->rec );
-#gen_list.c:           if ( NULL != c1 )
-#gen_list.c:           {
-#gen_list.c:                   c1 = gen_list_node_get_next( c1 );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           if ( NULL != c2 )
-#gen_list.c:           {
-#gen_list.c:                   c2 = gen_list_node_get_next( c2 );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == c1 && NULL == c2 )
-#gen_list.c:   {
-#gen_list.c:           return( 1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( eq );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_find
-#gen_list.c: *
-#gen_list.c: * Description :  Find a record that matches the one passed to this
-#gen_list.c: *                                         function.
-#gen_list.c: *                                         NOTE: this function receives a RECORD and not a NODE.
-#gen_list.c: *                                         Some implementation issues might be easier addressed
-#gen_list.c: *                                         if a node was passed ... but for the time being, I
-#gen_list.c: *                                         would like to keep the use/programmer isolated from
-#gen_list.c: *                                         the node structure/class.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The record to find.
-#gen_list.c: *
-#gen_list.c: * Returns     :  NULL => none found, anything else is a pointer to the record.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec )
-#gen_list.c:{
-#gen_list.c:   const struct gen_list_node *curr = this_list->first;
-#gen_list.c:   int eq = 0;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr && NULL == rec )
-#gen_list.c:   {
-#gen_list.c:           return( (struct gen_list_rec *)1 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if (    ( NULL == curr && NULL != rec ) ||
-#gen_list.c:                   ( NULL != curr && NULL == rec ) )
-#gen_list.c:   {
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:   if ( curr->rec->isa != rec->isa )
-#gen_list.c:   {
-#gen_list.c:           LIST_SHOW( printf( "INFORMATION: sorry, but comparing different list types is unsupported at this time.\n" ) );
-#gen_list.c:           return( 0 );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:   while ( ( !eq ) && ( NULL != curr ) )
-#gen_list.c:   {
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:
-#gen_list.c:           eq = CALL_VT_REC_EQUAL( curr->rec, rec );
-#gen_list.c:
-#gen_list.c:           if ( eq )
-#gen_list.c:           {
-#gen_list.c:                   return( curr->rec );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = next;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_iterate
-#gen_list.c: *
-#gen_list.c: * Description :  Pass over the list, calling "iter" for every record.
-#gen_list.c: *                                         If the "iter" function returns a non-NULL value,
-#gen_list.c: *                                         return it and stop iterating.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The iterator function.
-#gen_list.c: *
-#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
-#gen_list.c: *                                         list was processed.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_iterate( struct gen_list *this_list, rec_iterate iter )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->first;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           struct gen_list_node    *next = gen_list_node_get_next( curr );
-#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
-#gen_list.c:
-#gen_list.c:           if ( NULL != r )
-#gen_list.c:           {
-#gen_list.c:                   return( r );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = next;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-#gen_list.c:
-#gen_list.c:
-#gen_list.c:/*********************************************************************
-#gen_list.c: *
-#gen_list.c: * Function    :  gen_list_iterate
-#gen_list.c: *
-#gen_list.c: * Description :  Pass over the list (in reverse order), calling "iter"
-#gen_list.c: *                                         for every record.  If the "iter" function returns
-#gen_list.c: *                                         a non-NULL value, return it and stop iterating.
-#gen_list.c: *
-#gen_list.c: * Parameters  :
-#gen_list.c: *          1  :  The list.
-#gen_list.c: *          2  :  The iterator function.
-#gen_list.c: *
-#gen_list.c: * Returns     :  Whatever the iterator does, or NULL if the entire
-#gen_list.c: *                                         list was processed.
-#gen_list.c: *
-#gen_list.c: *********************************************************************/
-#gen_list.c:struct gen_list_rec *gen_list_iterate_reverse( struct gen_list *this_list, rec_iterate iter )
-#gen_list.c:{
-#gen_list.c:   struct gen_list_node *curr = this_list->last;
-#gen_list.c:
-#gen_list.c:   if ( NULL == curr )
-#gen_list.c:   {
-#gen_list.c:           return( NULL );
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   while ( NULL != curr )
-#gen_list.c:   {
-#gen_list.c:           /* Access to rec of gen_list_node is allowed since it is private to gen_list */
-#gen_list.c:           struct gen_list_node    *prev = gen_list_node_get_prev( curr );
-#gen_list.c:           struct gen_list_rec *r = iter( curr->rec );
-#gen_list.c:
-#gen_list.c:           if ( NULL != r )
-#gen_list.c:           {
-#gen_list.c:                   return( r );
-#gen_list.c:           }
-#gen_list.c:
-#gen_list.c:           curr = prev;
-#gen_list.c:
-#gen_list.c:   }
-#gen_list.c:
-#gen_list.c:   return( NULL );
-#gen_list.c:
-#gen_list.c:}
-
-
-#gen_list.h:#ifndef GEN_LIST_H_INCLUDED
-#gen_list.h:#define GEN_LIST_H_INCLUDED
-#gen_list.h:#define GEN_LIST_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#gen_list.h:/*********************************************************************
-#gen_list.h: *
-#gen_list.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#gen_list.h: *
-#gen_list.h: * Purpose     :  To create some functions to do generic doubly linked
-#gen_list.h: *                                         list management.
-#gen_list.h: *
-#gen_list.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#gen_list.h: *                Privoxy team. http://www.privoxy.org/
-#gen_list.h: *
-#gen_list.h: *                This program is free software; you can redistribute it
-#gen_list.h: *                and/or modify it under the terms of the GNU General
-#gen_list.h: *                Public License as published by the Free Software
-#gen_list.h: *                Foundation; either version 2 of the License, or (at
-#gen_list.h: *                your option) any later version.
-#gen_list.h: *
-#gen_list.h: *                This program is distributed in the hope that it will
-#gen_list.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#gen_list.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#gen_list.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#gen_list.h: *                License for more details.
-#gen_list.h: *
-#gen_list.h: *                The GNU General Public License should be included with
-#gen_list.h: *                this file.  If not, you can view it at
-#gen_list.h: *                http://www.gnu.org/copyleft/gpl.html
-#gen_list.h: *                or write to the Free Software Foundation, Inc., 59
-#gen_list.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#gen_list.h: *
-#gen_list.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#gen_list.h: *                                         and edit IJB, correctly.
-#gen_list.h: *
-#gen_list.h: * Revisions   :
-#gen_list.h: *    $Log: contrib.sh,v $
-#gen_list.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#gen_list.h: *    name change related issues
-#gen_list.h: *
-#gen_list.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#gen_list.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#gen_list.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#gen_list.h: *    contrib directory and I cannot upload a tarball ... it gets
-#gen_list.h: *    corrupted).  This script will expand all files needed to create the
-#gen_list.h: *    linked list modules and an example program.  Please see the README.
-#gen_list.h: *    Feed back is welcomed.  Enjoy.
-#gen_list.h: *
-#gen_list.h: *
-#gen_list.h: *********************************************************************/
-#gen_list.h:\f
-#gen_list.h:
-#gen_list.h:#ifdef __cplusplus
-#gen_list.h:extern "C" {
-#gen_list.h:#endif
-#gen_list.h:
-#gen_list.h:#include "isa.h"
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:extern int list_is_quiet;
-#gen_list.h:
-#gen_list.h:#define LIST_SHOW(stmt)  if ( ! list_is_quiet ) { stmt; }
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list_rec;
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_copy_construct)( struct gen_list_rec *copy_rec );
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_destruct)( struct gen_list_rec *this_rec );
-#gen_list.h:typedef const struct gen_list_rec *        (*rec_stream)( const struct gen_list_rec *this_rec );
-#gen_list.h:typedef int                                                                        (*rec_equal)( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
-#gen_list.h:typedef struct gen_list_rec *                      (*rec_iterate)( struct gen_list_rec *this_rec );
-#gen_list.h:
-#gen_list.h:typedef void * (*rec_method)( void *this_rec, ... );
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:enum VT_ENTRIES
-#gen_list.h:{
-#gen_list.h:   VT_REC_COPY_CONSTRUCT,
-#gen_list.h:   VT_REC_DESTRUCT,
-#gen_list.h:   VT_REC_STREAM,
-#gen_list.h:   VT_REC_EQUAL,
-#gen_list.h:   VT_REC_MAX
-#gen_list.h:};
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:typedef const rec_method *t_vtable;
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list_rec
-#gen_list.h:{
-#gen_list.h:   /* private: */
-#gen_list.h:   t_vtable vtable;
-#gen_list.h:   enum GEN_LIST_ISA isa;
-#gen_list.h:   int sizeof_rec;
-#gen_list.h:   /* contents HERE */
-#gen_list.h:};
-#gen_list.h:/* public: */
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_construct( enum GEN_LIST_ISA isa, int sizeof_rec, const t_vtable _vtable );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_copy_construct( const struct gen_list_rec *this_rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_rec_destruct( struct gen_list_rec *this_rec );
-#gen_list.h:extern const struct gen_list_rec * gen_list_rec_stream( const struct gen_list_rec *this_rec );
-#gen_list.h:extern int                                                                 gen_list_rec_equal( const struct gen_list_rec *this_rec, const struct gen_list_rec *eq_rec );
-#gen_list.h:
-#gen_list.h:/* struct/class COMPLETE */
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:/*\f*********************************************************************/
-#gen_list.h:
-#gen_list.h:/* private: to gen_list */
-#gen_list.h:struct gen_list_node;
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:struct gen_list
-#gen_list.h:{
-#gen_list.h:   /* private: */
-#gen_list.h:   struct gen_list_node *first;
-#gen_list.h:   struct gen_list_node *last;
-#gen_list.h:};
-#gen_list.h:/* gen_list_insert_node */
-#gen_list.h:
-#gen_list.h:/* public: */
-#gen_list.h:extern struct gen_list *                           gen_list_construct();
-#gen_list.h:extern struct gen_list *                           gen_list_copy_construct( const struct gen_list *this_list );
-#gen_list.h:extern struct gen_list *                           gen_list_destruct( struct gen_list *this_list );
-#gen_list.h:extern struct gen_list *                           gen_list_remove_all( struct gen_list *this_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_remove( struct gen_list *this_list, struct gen_list_rec *_rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_get_first( const struct gen_list *this_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_get_last( const struct gen_list *this_list );
-#gen_list.h:extern const struct gen_list_node *        gen_list_insert( struct gen_list *this_list, struct gen_list_rec *_rec );
-#gen_list.h:extern const struct gen_list *             gen_list_stream( const struct gen_list *this_list );
-#gen_list.h:extern int                                                                 gen_list_equal( const struct gen_list *this_list, const struct gen_list *eq_list );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_find( const struct gen_list *this_list, struct gen_list_rec *rec );
-#gen_list.h:extern struct gen_list_rec *                       gen_list_iterate( struct gen_list *this_list, rec_iterate iter );
-#gen_list.h:/* struct/class COMPLETE */
-#gen_list.h:
-#gen_list.h:
-#gen_list.h:#ifdef __cplusplus
-#gen_list.h:} /* extern "C" */
-#gen_list.h:#endif
-#gen_list.h:
-#gen_list.h:#endif /* ndef GEN_LIST_H_INCLUDED */
-#gen_list.h:
-#gen_list.h:/*
-#gen_list.h:  Local Variables:
-#gen_list.h:  tab-width: 3
-#gen_list.h:  end:
-#gen_list.h:*/
-
-
-#isa.c:const char isa_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#isa.c:/*********************************************************************
-#isa.c: *
-#isa.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#isa.c: *
-#isa.c: * Purpose     :  Pronounced "is a".  To create "english" translations
-#isa.c: *                                              for all linked "classes".
-#isa.c: *
-#isa.c: *                                              NOTE:   this header file must appear once and only once
-#isa.c: *                                                              per project.
-#isa.c: *
-#isa.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#isa.c: *                Privoxy team. http://www.privoxy.org/
-#isa.c: *
-#isa.c: *                This program is free software; you can redistribute it
-#isa.c: *                and/or modify it under the terms of the GNU General
-#isa.c: *                Public License as published by the Free Software
-#isa.c: *                Foundation; either version 2 of the License, or (at
-#isa.c: *                your option) any later version.
-#isa.c: *
-#isa.c: *                This program is distributed in the hope that it will
-#isa.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#isa.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#isa.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#isa.c: *                License for more details.
-#isa.c: *
-#isa.c: *                The GNU General Public License should be included with
-#isa.c: *                this file.  If not, you can view it at
-#isa.c: *                http://www.gnu.org/copyleft/gpl.html
-#isa.c: *                or write to the Free Software Foundation, Inc., 59
-#isa.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#isa.c: *
-#isa.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#isa.c: *                                              and edit IJB, correctly.
-#isa.c: *
-#isa.c: * Revisions   :
-#isa.c: *    $Log: contrib.sh,v $
-#isa.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#isa.c: *    name change related issues
-#isa.c: *
-#isa.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#isa.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#isa.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#isa.c: *    contrib directory and I cannot upload a tarball ... it gets
-#isa.c: *    corrupted).  This script will expand all files needed to create the
-#isa.c: *    linked list modules and an example program.  Please see the README.
-#isa.c: *    Feed back is welcomed.  Enjoy.
-#isa.c: *
-#isa.c: *    Revision 1.1  2001/11/30 21:55:51  rodney
-#isa.c: *    Initial revision
-#isa.c: *
-#isa.c: *
-#isa.c: *********************************************************************/
-#isa.c:\f
-#isa.c:
-#isa.c:#include <malloc.h>
-#isa.c:#include <stdio.h>
-#isa.c:#include <stdlib.h>
-#isa.c:#include <string.h>
-#isa.c:
-#isa.c:#include "gen_list.h"
-#isa.c:#include "isa.h"
-#isa.c:
-#isa.c:const char isa_h_rcs[] = ISA_H_VERSION;
-#isa.c:
-#isa.c:
-#isa.c:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
-#isa.c:char *isa_ra[] =
-#isa.c:{
-#isa.c:        "GEN_LIST_REC",
-#isa.c:        "REC_MALLOC_POLICE",
-#isa.c:        "REC_CHAR",
-#isa.c:        "REC_CHARPTR",
-#isa.c:        "REC_DOUBLE",
-#isa.c:        "REC_LONG",
-#isa.c:        NULL
-#isa.c:};
-
-
-#isa.h:#ifndef ISA_H_INCLUDED
-#isa.h:#define ISA_H_INCLUDED
-#isa.h:#define ISA_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#isa.h:/*********************************************************************
-#isa.h: *
-#isa.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#isa.h: *
-#isa.h: * Purpose     :  Pronounced "is a".  To create "english" translations
-#isa.h: *                                              for all linked "classes".
-#isa.h: *
-#isa.h: *                                              NOTE:   this header file must appear once and only once
-#isa.h: *                                                              per project.
-#isa.h: *
-#isa.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#isa.h: *                Privoxy team. http://www.privoxy.org/
-#isa.h: *
-#isa.h: *                This program is free software; you can redistribute it
-#isa.h: *                and/or modify it under the terms of the GNU General
-#isa.h: *                Public License as published by the Free Software
-#isa.h: *                Foundation; either version 2 of the License, or (at
-#isa.h: *                your option) any later version.
-#isa.h: *
-#isa.h: *                This program is distributed in the hope that it will
-#isa.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#isa.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#isa.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#isa.h: *                License for more details.
-#isa.h: *
-#isa.h: *                The GNU General Public License should be included with
-#isa.h: *                this file.  If not, you can view it at
-#isa.h: *                http://www.gnu.org/copyleft/gpl.html
-#isa.h: *                or write to the Free Software Foundation, Inc., 59
-#isa.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#isa.h: *
-#isa.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#isa.h: *                                              and edit IJB, correctly.
-#isa.h: *
-#isa.h: * Revisions   :
-#isa.h: *    $Log: contrib.sh,v $
-#isa.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#isa.h: *    name change related issues
-#isa.h: *
-#isa.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#isa.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#isa.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#isa.h: *    contrib directory and I cannot upload a tarball ... it gets
-#isa.h: *    corrupted).  This script will expand all files needed to create the
-#isa.h: *    linked list modules and an example program.  Please see the README.
-#isa.h: *    Feed back is welcomed.  Enjoy.
-#isa.h: *
-#isa.h: *
-#isa.h: *********************************************************************/
-#isa.h:\f
-#isa.h:
-#isa.h:#ifdef __cplusplus
-#isa.h:extern "C" {
-#isa.h:#endif
-#isa.h:
-#isa.h:
-#isa.h:enum GEN_LIST_ISA
-#isa.h:{
-#isa.h:        ISA_GEN_LIST_REC,
-#isa.h:        ISA_MALLOC_POLICE,
-#isa.h:        ISA_CHAR,
-#isa.h:        ISA_CHARPTR,
-#isa.h:        ISA_DOUBLE,
-#isa.h:        ISA_LONG,
-#isa.h:        ISA_MAX
-#isa.h:};
-#isa.h:
-#isa.h:
-#isa.h:/* Pronounce "ra" phonectically and you get "array", which this variable is. */
-#isa.h:extern char *isa_ra[];
-#isa.h:
-#isa.h:
-#isa.h:#ifdef __cplusplus
-#isa.h:} /* extern "C" */
-#isa.h:#endif
-#isa.h:
-#isa.h:#endif /* ndef ISA_H_INCLUDED */
-#isa.h:
-#isa.h:/*
-#isa.h:  Local Variables:
-#isa.h:  tab-width: 3
-#isa.h:  end:
-#isa.h:*/
-
-
-#main.c:const char main_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#main.c: *
-#main.c: * Purpose     :  To test "generic list" creation and manipulation.
-#main.c: *
-#main.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#main.c: *                Privoxy team. http://www.privoxy.org/
-#main.c: *
-#main.c: *                This program is free software; you can redistribute it
-#main.c: *                and/or modify it under the terms of the GNU General
-#main.c: *                Public License as published by the Free Software
-#main.c: *                Foundation; either version 2 of the License, or (at
-#main.c: *                your option) any later version.
-#main.c: *
-#main.c: *                This program is distributed in the hope that it will
-#main.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#main.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#main.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#main.c: *                License for more details.
-#main.c: *
-#main.c: *                The GNU General Public License should be included with
-#main.c: *                this file.  If not, you can view it at
-#main.c: *                http://www.gnu.org/copyleft/gpl.html
-#main.c: *                or write to the Free Software Foundation, Inc., 59
-#main.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#main.c: *
-#main.c: * VI users            :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#main.c: *                                             and edit IJB, correctly.
-#main.c: *
-#main.c: * Note                        :       This output assumes (per IJB standards) that tabs are
-#main.c: *                                             set to 3 characters.  If you run this in a terminal,
-#main.c: *                                             you may want to run this as so:
-#main.c: *                                                     >./test_list 2>&1 | expand -t3 | ./addr_clean.pl
-#main.c: *                                             This will expand the tab to 3 columns and then replace
-#main.c: *                                             "0x" style addresses with more human readable ones.
-#main.c: *
-#main.c: * Revisions   :
-#main.c: *    $Log: contrib.sh,v $
-#main.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#main.c: *    name change related issues
-#main.c: *
-#main.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#main.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#main.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#main.c: *    contrib directory and I cannot upload a tarball ... it gets
-#main.c: *    corrupted).  This script will expand all files needed to create the
-#main.c: *    linked list modules and an example program.  Please see the README.
-#main.c: *    Feed back is welcomed.  Enjoy.
-#main.c: *
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:\f
-#main.c:
-#main.c:#include <malloc.h>
-#main.c:#include <stdio.h>
-#main.c:#include <stdlib.h>
-#main.c:#include <string.h>
-#main.c:
-#main.c:#include "gen_list.h"
-#main.c:#include "rec_char.h"
-#main.c:#include "rec_charptr.h"
-#main.c:#include "rec_double.h"
-#main.c:#include "rec_long.h"
-#main.c:#include "malloc_police.h"
-#main.c:
-#main.c:
-#main.c:extern const char isa_rcs[];
-#main.c:extern const char isa_h_rcs[];
-#main.c:extern const char gen_list_rcs[];
-#main.c:extern const char gen_list_h_rcs[];
-#main.c:extern const char malloc_police_rcs[];
-#main.c:extern const char malloc_police_h_rcs[];
-#main.c:extern const char rec_charptr_rcs[];
-#main.c:extern const char rec_charptr_h_rcs[];
-#main.c:extern const char rec_long_rcs[];
-#main.c:extern const char rec_long_h_rcs[];
-#main.c:extern const char rec_double_rcs[];
-#main.c:extern const char rec_double_h_rcs[];
-#main.c:extern const char rec_char_rcs[];
-#main.c:extern const char rec_char_h_rcs[];
-#main.c:extern const char rec_malloc_police_rcs[];
-#main.c:extern const char rec_malloc_police_h_rcs[];
-#main.c:extern const char main_rcs[];
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  my_custom_charptr_iterator_1
-#main.c: *
-#main.c: * Description :  This funtion is called once for every record in a
-#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
-#main.c: *                                             this function always returns NULL, thus it will
-#main.c: *                                             iterate over the entire list.
-#main.c: *
-#main.c: * Parameters  :
-#main.c: *          1  :  The record.
-#main.c: *
-#main.c: * Returns     :  NULL
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_1( struct derived_rec_charptr *this_rec )
-#main.c:{
-#main.c:       printf( "\
-#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_1 ... %p
-#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_1 ... %s\n\n", (const void *)this_rec, this_rec->contents );
-#main.c:       return( NULL );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  my_custom_charptr_iterator_2
-#main.c: *
-#main.c: * Description :  This funtion is called once for every record in a
-#main.c: *                                             list.  Or at least until we return non-NULL.  BTW,
-#main.c: *                                             this function always returns non-NULL, thus it will
-#main.c: *                                             iterate over only 1 record.
-#main.c: *
-#main.c: * Parameters  :
-#main.c: *          1  :  The record.
-#main.c: *
-#main.c: * Returns     :  The record.
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:struct derived_rec_charptr *my_custom_charptr_iterator_2( struct derived_rec_charptr *this_rec )
-#main.c:{
-#main.c:       printf( "\
-#main.c:\t\tcharptr iterator_1 this_rec\t\t\t\t= iter_2 ... %p
-#main.c:\t\tcharptr iterator_1 this_rec->contents\t= iter_2 ... %s\n\n", (const void *)this_rec, this_rec->contents );
-#main.c:       return( this_rec );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*********************************************************************
-#main.c: *
-#main.c: * Function    :  main
-#main.c: *
-#main.c: * Description :  Test the doubly linked list as it is so far.
-#main.c: *
-#main.c: * Parameters  :  None
-#main.c: *
-#main.c: * Returns     :  N/A
-#main.c: *
-#main.c: *********************************************************************/
-#main.c:int main( int argc, const char **argv )
-#main.c:{
-#main.c:       struct gen_list *lcharptr;
-#main.c:       struct gen_list *llong;
-#main.c:       struct gen_list *ldouble;
-#main.c:       struct gen_list *lchar;
-#main.c:
-#main.c:       struct gen_list *lcharptr_c;
-#main.c:       struct gen_list *llong_c;
-#main.c:       struct gen_list *ldouble_c;
-#main.c:       struct gen_list *lchar_c;
-#main.c:
-#main.c:       struct gen_list_rec *f_rec;
-#main.c:
-#main.c:       struct gen_list *no_own_list;
-#main.c:       struct gen_list_rec *no_own_rec1;
-#main.c:       struct gen_list_rec *no_own_rec2;
-#main.c:       struct gen_list_rec *no_own_rec3;
-#main.c:
-#main.c:       printf( "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n",
-#main.c:                         gen_list_rcs,
-#main.c:                         gen_list_h_rcs,
-#main.c:                         isa_rcs,
-#main.c:                         isa_h_rcs,
-#main.c:                         malloc_police_rcs,
-#main.c:                         malloc_police_h_rcs,
-#main.c:                         rec_char_rcs,
-#main.c:                         rec_char_h_rcs,
-#main.c:                         rec_charptr_rcs,
-#main.c:                         rec_charptr_h_rcs,
-#main.c:                         rec_long_rcs,
-#main.c:                         rec_long_h_rcs,
-#main.c:                         rec_double_rcs,
-#main.c:                         rec_double_h_rcs,
-#main.c:                         rec_malloc_police_rcs,
-#main.c:                         rec_malloc_police_h_rcs,
-#main.c:                         main_rcs );
-#main.c:
-#main.c:
-#main.c:       /* Force a memory leak to test the strdup/malloc/free police. */
-#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
-#main.c:       strcpy( MALLOC( 60 ), "Force a memory leak to test the strdup/malloc/free police." );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a charptr list -- **\n" );
-#main.c:       lcharptr = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "Rodney Stromlund" ) );
-#main.c:       gen_list_insert( lcharptr, f_rec = (struct gen_list_rec *)derived_rec_charptr_construct( "RJS" ) );
-#main.c:       gen_list_insert( lcharptr, (struct gen_list_rec *)derived_rec_charptr_construct( "jammin!" ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a charptr list -- **\n" );
-#main.c:       gen_list_stream( lcharptr );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_find to find the 2nd charptr record -- **\n" );
-#main.c:       f_rec = gen_list_find( lcharptr, f_rec );
-#main.c:       printf( "Found rec = %p\n", f_rec );
-#main.c:       derived_rec_charptr_stream( (const struct derived_rec_charptr *)f_rec );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the charptr list -- **\n" );
-#main.c:       lcharptr_c = gen_list_copy_construct( lcharptr );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig -- **
-#main.c:** -- NOTE: they will NOT be because the charptr copy constructor changes the string contents -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, lcharptr_c ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied charptr list -- **\n" );
-#main.c:       gen_list_stream( lcharptr_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a long list -- **\n" );
-#main.c:       llong = gen_list_construct();
-#main.c:
-#main.c:
-#main.c:       gen_list_insert( llong, no_own_rec1 = (struct gen_list_rec *)derived_rec_long_construct( 1 ) );
-#main.c:       gen_list_insert( llong, no_own_rec2 = (struct gen_list_rec *)derived_rec_long_construct( 100 ) );
-#main.c:       gen_list_insert( llong, no_own_rec3 = (struct gen_list_rec *)derived_rec_long_construct( 200 ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a long list -- **\n" );
-#main.c:       gen_list_stream( llong );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the long list -- **\n" );
-#main.c:       llong_c = gen_list_copy_construct( llong );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied long list -- **\n" );
-#main.c:       gen_list_stream( llong_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to test a no-owner long list -- **\n" );
-#main.c:       no_own_list = gen_list_construct();
-#main.c:       gen_list_insert( no_own_list, no_own_rec1 );
-#main.c:       gen_list_insert( no_own_list, no_own_rec2 );
-#main.c:       gen_list_insert( no_own_list, no_own_rec3 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a no-owner list -- **\n" );
-#main.c:       gen_list_stream( no_own_list );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if list and no-owner list are equal  NOTE: they should be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( llong, no_own_list ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a double list -- **\n" );
-#main.c:       ldouble = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.0 ) );
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.1 ) );
-#main.c:       gen_list_insert( ldouble, (struct gen_list_rec *)derived_rec_double_construct( 3.14 ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a double list -- **\n" );
-#main.c:       gen_list_stream( ldouble );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the double list -- **\n" );
-#main.c:       ldouble_c = gen_list_copy_construct( ldouble );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied double list -- **\n" );
-#main.c:       gen_list_stream( ldouble_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_construct to constuct a char list -- **\n" );
-#main.c:       lchar = gen_list_construct();
-#main.c:
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( '1' ) );
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'A' ) );
-#main.c:       gen_list_insert( lchar, (struct gen_list_rec *)derived_rec_char_construct( 'a' ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to test streaming a char list -- **\n" );
-#main.c:       gen_list_stream( lchar );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_copy_construct to test copy construct the char list -- **\n" );
-#main.c:       lchar_c = gen_list_copy_construct( lchar );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if the copied list is the same as the orig  NOTE: they should be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lchar, lchar_c ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_stream to stream a copied char list -- **\n" );
-#main.c:       gen_list_stream( lchar_c );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate to iterate a charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
-#main.c:       gen_list_iterate( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate to iterate a copied charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
-#main.c:       gen_list_iterate( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_1) will iterate the whole list. -- **\n" );
-#main.c:       gen_list_iterate_reverse( lcharptr,     (rec_iterate)my_custom_charptr_iterator_1 );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_iterate_reverse to iterate a copied charptr list -- **
-#main.c:** -- NOTE: this iterator (my_custom_charptr_iterator_2) will return after the first iteration. -- **\n" );
-#main.c:       gen_list_iterate_reverse( lcharptr_c,   (rec_iterate)my_custom_charptr_iterator_2 );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_equal to see if 2 different typed lists are equal  NOTE: they should not be. -- **\n" );
-#main.c:       printf( "Are these 2 equal? => %d\n\n", gen_list_equal( lcharptr, llong ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove_all to erase a no-owner list -- **\n" );
-#main.c:       no_own_list = gen_list_remove_all( no_own_list );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct a no-owner list -- **\n" );
-#main.c:       no_own_list = gen_list_destruct( no_own_list );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the first record of a copied charptr list -- **\n" );
-#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr_c, gen_list_get_first( lcharptr_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the last record of a copied long list -- **\n" );
-#main.c:       derived_rec_long_destruct( (struct derived_rec_long *)gen_list_remove( llong_c, gen_list_get_last( llong_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the middle record of an original charptr list -- **\n" );
-#main.c:       derived_rec_charptr_destruct( (struct derived_rec_charptr *)gen_list_remove( lcharptr, f_rec ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of a copied char list (first to last) -- **\n" );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar_c, gen_list_get_first( lchar_c ) ) );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_remove to remove the all 3 records of the original char list (last to first) -- **\n" );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:       derived_rec_char_destruct( (struct derived_rec_char *)gen_list_remove( lchar, gen_list_get_last( lchar ) ) );
-#main.c:
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original charptr list (less the middle record) -- **\n" );
-#main.c:       lcharptr = gen_list_destruct( lcharptr );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied charptr list (less the first record) -- **\n" );
-#main.c:       lcharptr_c = gen_list_destruct( lcharptr_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original long list -- **\n" );
-#main.c:       llong = gen_list_destruct( llong );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied long list (less the last record) -- **\n" );
-#main.c:       llong_c = gen_list_destruct( llong_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original double list -- **\n" );
-#main.c:       ldouble = gen_list_destruct( ldouble );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied double list -- **\n" );
-#main.c:       ldouble_c = gen_list_destruct( ldouble_c );
-#main.c:
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the original char list (less all records last to first) -- **\n" );
-#main.c:       lchar = gen_list_destruct( lchar );
-#main.c:       printf( "** -- Calling gen_list_destruct to destruct the copied char list (less all records first to last) -- **\n" );
-#main.c:       lchar_c = gen_list_destruct( lchar_c );
-#main.c:
-#main.c:
-#main.c:       /* Force another memory leak to test the strdup/malloc/free police. */
-#main.c:       /* NOTE: this should trigger the alphanum check of allocated memory. */
-#main.c:       STRDUP( "Force another memory leak to test the strdup/malloc/free police." );
-#main.c:
-#main.c:       /* Force a memory leak in a list and also in 2 nodes. */
-#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
-#main.c:       gen_list_construct();
-#main.c:
-#main.c:       /* NOTE: this should trigger 1 NON check (for the node) */
-#main.c:       /* followed by 1 alphanum check for the charptr string. */
-#main.c:       derived_rec_charptr_construct( "Leaky charptr node." );
-#main.c:
-#main.c:       /* NOTE: this should NOT trigger the alphanum check of allocated memory. */
-#main.c:       derived_rec_char_construct( 'Z' );
-#main.c:
-#main.c:
-#main.c:       printf( "\ndone" );
-#main.c:       return( 0 );
-#main.c:
-#main.c:}
-#main.c:
-#main.c:
-#main.c:/*
-#main.c:  Local Variables:
-#main.c:  tab-width: 3
-#main.c:  end:
-#main.c:*/
-
-
-#malloc_police.c:const char malloc_police_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#malloc_police.c: *
-#malloc_police.c: * Purpose     :  This module uses the rec_malloc_police to build a
-#malloc_police.c: *                                            list of allocated and freed memory.  When the
-#malloc_police.c: *                                            program exits, we will print a list of all memory
-#malloc_police.c: *                                            that was allocated, but never freed.  This could
-#malloc_police.c: *                                            be most helpful to developers and debugers.
-#malloc_police.c: *
-#malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#malloc_police.c: *                Privoxy team. http://www.privoxy.org/
-#malloc_police.c: *
-#malloc_police.c: *                This program is free software; you can redistribute it
-#malloc_police.c: *                and/or modify it under the terms of the GNU General
-#malloc_police.c: *                Public License as published by the Free Software
-#malloc_police.c: *                Foundation; either version 2 of the License, or (at
-#malloc_police.c: *                your option) any later version.
-#malloc_police.c: *
-#malloc_police.c: *                This program is distributed in the hope that it will
-#malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#malloc_police.c: *                License for more details.
-#malloc_police.c: *
-#malloc_police.c: *                The GNU General Public License should be included with
-#malloc_police.c: *                this file.  If not, you can view it at
-#malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
-#malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
-#malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#malloc_police.c: *
-#malloc_police.c: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#malloc_police.c: *                                            and edit IJB, correctly.
-#malloc_police.c: *
-#malloc_police.c: * Revisions   :
-#malloc_police.c: *    $Log: contrib.sh,v $
-#malloc_police.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#malloc_police.c: *    name change related issues
-#malloc_police.c: *
-#malloc_police.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#malloc_police.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#malloc_police.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#malloc_police.c: *    contrib directory and I cannot upload a tarball ... it gets
-#malloc_police.c: *    corrupted).  This script will expand all files needed to create the
-#malloc_police.c: *    linked list modules and an example program.  Please see the README.
-#malloc_police.c: *    Feed back is welcomed.  Enjoy.
-#malloc_police.c: *
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:\f
-#malloc_police.c:
-#malloc_police.c:#include <ctype.h>
-#malloc_police.c:#include <malloc.h>
-#malloc_police.c:#include <stdio.h>
-#malloc_police.c:#include <stdlib.h>
-#malloc_police.c:#include <string.h>
-#malloc_police.c:
-#malloc_police.c:#include "gen_list.h"
-#malloc_police.c:#include "malloc_police.h"
-#malloc_police.c:#include "rec_malloc_police.h"
-#malloc_police.c:
-#malloc_police.c:const char malloc_police_h_rcs[] = MALLOC_POLICE_H_VERSION;
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/* When we need to allocate malloc_police records, we */
-#malloc_police.c:/* will do recursion infinately.  This variable will */
-#malloc_police.c:/* stop the STRDUP, MALLOC, and FREE replacements from */
-#malloc_police.c:/* trying to log these allocations. */
-#malloc_police.c:
-#malloc_police.c:char recursion_protect = 0;
-#malloc_police.c:
-#malloc_police.c:struct gen_list *get_police_list();
-#malloc_police.c:static char called_once = 0;
-#malloc_police.c:static const char *leak_report_header = "%s****************************** MEMORY LEAK REPORT %s ******************************%s";
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_list_release_iterator
-#malloc_police.c: *
-#malloc_police.c: * Description :  Iterator for the police list.  We will report
-#malloc_police.c: *                                            "leaked" memory for the developer to correct.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The record.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  NULL
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:struct derived_rec_malloc_police *police_list_release_iterator( struct derived_rec_malloc_police *this_rec )
-#malloc_police.c:{
-#malloc_police.c:      if ( ! called_once )
-#malloc_police.c:      {
-#malloc_police.c:              called_once = 1;
-#malloc_police.c:              fprintf( stderr, leak_report_header, "\n\n", "BEGIN", "\n\n" );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      fprintf( stderr, "\
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec\t\t\t\t\t= %p
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->alloced_addr\t= %p
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->source_where\t= %s
-#malloc_police.c:\t\tmalloc_police leaked memory iterator this_rec->sz\t\t\t\t= %ld\n",
-#malloc_police.c:                              (const void *)this_rec,
-#malloc_police.c:                              this_rec->alloced_addr,
-#malloc_police.c:                              this_rec->source_where,
-#malloc_police.c:                              this_rec->sz
-#malloc_police.c:      );
-#malloc_police.c:
-#malloc_police.c:      if (
-#malloc_police.c:              this_rec->sz >= 3 &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 0 ] ) &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 1 ] ) &&
-#malloc_police.c:              isalnum( ((const char *)this_rec->alloced_addr)[ 2 ] ) )
-#malloc_police.c:      {
-#malloc_police.c:              /* If the memory starts with 3 alpha-numerics,
-#malloc_police.c:               * assume a string was allocated.  This might be
-#malloc_police.c:               * a little dangerous for production code, but I
-#malloc_police.c:               * will take the risk for development payoff
-#malloc_police.c:               * (at least for now ...) */
-#malloc_police.c:                      
-#malloc_police.c:              fprintf( stderr, "\
-#malloc_police.c:\t\tAlpha numeric found, assuming a string was allocated\t\t\t= %s\n",
-#malloc_police.c:                                      this_rec->alloced_addr
-#malloc_police.c:              );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      fprintf( stderr, "\n" );
-#malloc_police.c:
-#malloc_police.c:      return( NULL );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  release_police_list
-#malloc_police.c: *
-#malloc_police.c: * Description :  Iterates the police_list and reports "leaked" memory.
-#malloc_police.c: *                                            It will then free the list itself.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :      None
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  None.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void release_police_list()
-#malloc_police.c:{
-#malloc_police.c:      struct gen_list *police_list = get_police_list();
-#malloc_police.c:      fflush( stdout );
-#malloc_police.c:      gen_list_iterate( police_list, (rec_iterate)police_list_release_iterator );
-#malloc_police.c:
-#malloc_police.c:      if ( called_once )
-#malloc_police.c:      {
-#malloc_police.c:              called_once = 0;
-#malloc_police.c:              fprintf( stderr, leak_report_header, "", "END", "\n" );
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  get_police_list
-#malloc_police.c: *
-#malloc_police.c: * Description :  Get the police malloc/strdup/free list.  Generate
-#malloc_police.c: *                                            a new one if it does not yet exist.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :      None
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  The police list.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:struct gen_list *get_police_list()
-#malloc_police.c:{
-#malloc_police.c:      static struct gen_list *police_list = NULL;
-#malloc_police.c:
-#malloc_police.c:      if ( NULL == police_list )
-#malloc_police.c:      {
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              police_list = gen_list_construct();
-#malloc_police.c:              atexit( release_police_list );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( police_list );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_strdup
-#malloc_police.c: *
-#malloc_police.c: * Description :  Save the results of the strdup into our linked list.
-#malloc_police.c: *                                            This will be checked against latter free(s).
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The string to be duplicated.
-#malloc_police.c: *          2  :  Filename where the strdup occured.
-#malloc_police.c: *          3  :  Line# of where the strdup occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  Pointer to newly allocated memory.
-#malloc_police.c: *
-#malloc_police.c: * NOTE                       :       This could replace the custom strdup for __MINGW32__
-#malloc_police.c: *                                            systems.  We only need to copy the conditionally
-#malloc_police.c: *                                            compiled code here and eliminate the strdup copy.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:char *police_strdup( const char *s, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      char *ret = strdup( s );
-#malloc_police.c:
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              char buffer[ 255 ];
-#malloc_police.c:              sprintf( buffer, "strdup : %s @ %ld for %ld (%s)", filename, lineno, strlen( s ) + 1, s );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              gen_list_insert(
-#malloc_police.c:                      get_police_list(),
-#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, strlen( s ) + 1 )
-#malloc_police.c:              );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( ret );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_malloc
-#malloc_police.c: *
-#malloc_police.c: * Description :  Save the results of the malloc into our linked list.
-#malloc_police.c: *                                            This will be checked against latter free(s).
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  The size of the memory to be malloc(ed).
-#malloc_police.c: *          2  :  Filename where the malloc occured.
-#malloc_police.c: *          3  :  Line# of where the malloc occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void *police_malloc( size_t sz, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      void *ret = malloc( sz );
-#malloc_police.c:
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              char buffer[ 255 ];
-#malloc_police.c:              sprintf( buffer, "malloc : %s @ %ld for %ld", filename, lineno, sz );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              gen_list_insert(
-#malloc_police.c:                      get_police_list(),
-#malloc_police.c:                      (struct gen_list_rec *)derived_rec_malloc_police_construct( ret, buffer, sz )
-#malloc_police.c:              );
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      return( ret );
-#malloc_police.c:
-#malloc_police.c:}
-#malloc_police.c:
-#malloc_police.c:
-#malloc_police.c:/*********************************************************************
-#malloc_police.c: *
-#malloc_police.c: * Function    :  police_free
-#malloc_police.c: *
-#malloc_police.c: * Description :  Frees the memory allocation and removes the address
-#malloc_police.c: *                                            from the linked list.  Anything left in this list
-#malloc_police.c: *                                            is "leaked" memory.
-#malloc_police.c: *
-#malloc_police.c: * Parameters  :
-#malloc_police.c: *          1  :  Pointer to the memory to be freed.
-#malloc_police.c: *          2  :  Filename where the free occured.
-#malloc_police.c: *          3  :  Line# of where the free occured.
-#malloc_police.c: *
-#malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#malloc_police.c: *
-#malloc_police.c: *********************************************************************/
-#malloc_police.c:void police_free( void *ptr, const char *filename, long lineno )
-#malloc_police.c:{
-#malloc_police.c:      if ( 0 == recursion_protect )
-#malloc_police.c:      {
-#malloc_police.c:              struct derived_rec_malloc_police *rec;
-#malloc_police.c:              struct gen_list_rec *fRec;
-#malloc_police.c:              struct gen_list *l = get_police_list();
-#malloc_police.c:
-#malloc_police.c:              recursion_protect ++;
-#malloc_police.c:              list_is_quiet ++;
-#malloc_police.c:
-#malloc_police.c:              rec = derived_rec_malloc_police_construct( ptr, "FREEING POLICE RECORD.", 23 );
-#malloc_police.c:              fRec = gen_list_find( l, (struct gen_list_rec *)rec );
-#malloc_police.c:              derived_rec_malloc_police_destruct( rec );
-#malloc_police.c:
-#malloc_police.c:              if ( NULL == fRec )
-#malloc_police.c:              {
-#malloc_police.c:                      fprintf( stderr, "\nERROR: free failed to find corresponding strdup/malloc : %s @ %ld\n", filename, lineno );
-#malloc_police.c:              }
-#malloc_police.c:              else
-#malloc_police.c:              {
-#malloc_police.c:                      derived_rec_malloc_police_destruct( (struct derived_rec_malloc_police *)gen_list_remove( l, fRec ) );
-#malloc_police.c:              }
-#malloc_police.c:
-#malloc_police.c:              recursion_protect --;
-#malloc_police.c:              list_is_quiet --;
-#malloc_police.c:      }
-#malloc_police.c:
-#malloc_police.c:      free( ptr );
-#malloc_police.c:
-#malloc_police.c:}
-
-
-#malloc_police.h:#ifndef MALLOC_POLICE_H_INCLUDED
-#malloc_police.h:#define MALLOC_POLICE_H_INCLUDED
-#malloc_police.h:#define MALLOC_POLICE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#malloc_police.h:/*********************************************************************
-#malloc_police.h: *
-#malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#malloc_police.h: *
-#malloc_police.h: * Purpose     :  This module uses the rec_malloc_police to build a
-#malloc_police.h: *                                            list of allocated and freed memory.  When the
-#malloc_police.h: *                                            program exits, we will print a list of all memory
-#malloc_police.h: *                                            that was allocated, but never freed.  This could
-#malloc_police.h: *                                            be most helpful to developers and debugers.
-#malloc_police.h: *
-#malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#malloc_police.h: *                Privoxy team. http://www.privoxy.org/
-#malloc_police.h: *
-#malloc_police.h: *                This program is free software; you can redistribute it
-#malloc_police.h: *                and/or modify it under the terms of the GNU General
-#malloc_police.h: *                Public License as published by the Free Software
-#malloc_police.h: *                Foundation; either version 2 of the License, or (at
-#malloc_police.h: *                your option) any later version.
-#malloc_police.h: *
-#malloc_police.h: *                This program is distributed in the hope that it will
-#malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#malloc_police.h: *                License for more details.
-#malloc_police.h: *
-#malloc_police.h: *                The GNU General Public License should be included with
-#malloc_police.h: *                this file.  If not, you can view it at
-#malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
-#malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
-#malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#malloc_police.h: *
-#malloc_police.h: * VI users           :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#malloc_police.h: *                                            and edit IJB, correctly.
-#malloc_police.h: *
-#malloc_police.h: * Revisions   :
-#malloc_police.h: *    $Log: contrib.sh,v $
-#malloc_police.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#malloc_police.h: *    name change related issues
-#malloc_police.h: *
-#malloc_police.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#malloc_police.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#malloc_police.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#malloc_police.h: *    contrib directory and I cannot upload a tarball ... it gets
-#malloc_police.h: *    corrupted).  This script will expand all files needed to create the
-#malloc_police.h: *    linked list modules and an example program.  Please see the README.
-#malloc_police.h: *    Feed back is welcomed.  Enjoy.
-#malloc_police.h: *
-#malloc_police.h: *
-#malloc_police.h: *********************************************************************/
-#malloc_police.h:\f
-#malloc_police.h:
-#malloc_police.h:#ifdef __cplusplus
-#malloc_police.h:extern "C" {
-#malloc_police.h:#endif
-#malloc_police.h:
-#malloc_police.h:
-#malloc_police.h:char *police_strdup( const char *s, const char *filename, long lineno );
-#malloc_police.h:void *police_malloc( size_t sz, const char *filename, long lineno );
-#malloc_police.h:void police_free( void *ptr, const char *filename, long lineno );
-#malloc_police.h:
-#malloc_police.h:#define STRDUP(s)                     police_strdup( s, __FILE__, __LINE__ )
-#malloc_police.h:#define MALLOC(sz)            police_malloc( sz, __FILE__, __LINE__ )
-#malloc_police.h:#define FREE(ptr)                     police_free( ptr, __FILE__, __LINE__ )
-#malloc_police.h:
-#malloc_police.h:
-#malloc_police.h:#ifdef __cplusplus
-#malloc_police.h:} /* extern "C" */
-#malloc_police.h:#endif
-#malloc_police.h:
-#malloc_police.h:#endif /* ndef MALLOC_POLICE_H_INCLUDED */
-#malloc_police.h:
-#malloc_police.h:/*
-#malloc_police.h:  Local Variables:
-#malloc_police.h:  tab-width: 3
-#malloc_police.h:  end:
-#malloc_police.h:*/
-
-
-#rec_char.c:const char rec_char_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_char.c: *
-#rec_char.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_char.c: *
-#rec_char.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_char.c: *                Privoxy team. http://www.privoxy.org/
-#rec_char.c: *
-#rec_char.c: *                This program is free software; you can redistribute it
-#rec_char.c: *                and/or modify it under the terms of the GNU General
-#rec_char.c: *                Public License as published by the Free Software
-#rec_char.c: *                Foundation; either version 2 of the License, or (at
-#rec_char.c: *                your option) any later version.
-#rec_char.c: *
-#rec_char.c: *                This program is distributed in the hope that it will
-#rec_char.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_char.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_char.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_char.c: *                License for more details.
-#rec_char.c: *
-#rec_char.c: *                The GNU General Public License should be included with
-#rec_char.c: *                this file.  If not, you can view it at
-#rec_char.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_char.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_char.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_char.c: *
-#rec_char.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_char.c: *                                         and edit IJB, correctly.
-#rec_char.c: *
-#rec_char.c: * Revisions   :
-#rec_char.c: *    $Log: contrib.sh,v $
-#rec_char.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_char.c: *    name change related issues
-#rec_char.c: *
-#rec_char.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_char.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_char.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_char.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_char.c: *    corrupted).  This script will expand all files needed to create the
-#rec_char.c: *    linked list modules and an example program.  Please see the README.
-#rec_char.c: *    Feed back is welcomed.  Enjoy.
-#rec_char.c: *
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:\f
-#rec_char.c:
-#rec_char.c:#include <malloc.h>
-#rec_char.c:#include <stdio.h>
-#rec_char.c:#include <stdlib.h>
-#rec_char.c:#include <string.h>
-#rec_char.c:
-#rec_char.c:#include "gen_list.h"
-#rec_char.c:#include "rec_char.h"
-#rec_char.c:
-#rec_char.c:const char rec_char_h_rcs[] = REC_CHAR_H_VERSION;
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:static const rec_method rec_char_vtable[] =
-#rec_char.c:{
-#rec_char.c:   (rec_method)derived_rec_char_copy_construct,
-#rec_char.c:   (rec_method)derived_rec_char_destruct,
-#rec_char.c:   (rec_method)derived_rec_char_stream,
-#rec_char.c:   (rec_method)derived_rec_char_equal
-#rec_char.c:};
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_construct
-#rec_char.c: *
-#rec_char.c: * Description :  A simple derived record class that contains 1 string.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record
-#rec_char.c: *          2  :  The string to contain.
-#rec_char.c: *
-#rec_char.c: * Returns     :  A pointer to the constructed record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_construct( const char _contents )
-#rec_char.c:{
-#rec_char.c:   struct derived_rec_char *this_rec = (struct derived_rec_char *)gen_list_rec_construct(
-#rec_char.c:           ISA_CHAR,
-#rec_char.c:           sizeof( struct derived_rec_char ),
-#rec_char.c:           rec_char_vtable
-#rec_char.c:   );
-#rec_char.c:
-#rec_char.c:   this_rec->contents = _contents;
-#rec_char.c:
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar construct new rec\t\t\t\t= %p
-#rec_char.c:\t\tchar construct new rec contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( this_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_copy_construct
-#rec_char.c: *
-#rec_char.c: * Description :  Copies one char record to another.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  Existing record.
-#rec_char.c: *                         2       :  Copy record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  The newly constructed copy record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_copy_construct( const struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   struct derived_rec_char *copy_rec = (struct derived_rec_char *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_char.c:   copy_rec->contents = this_rec->contents;
-#rec_char.c:
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar copy construct new gen rec\t\t\t\t= %p => %p
-#rec_char.c:\t\tchar copy construct new gen rec contents\t= %c\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( copy_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_destruct        
-#rec_char.c: *
-#rec_char.c: * Description :  Destruct the char record.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  NULL
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:struct derived_rec_char *derived_rec_char_destruct( struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar destruct this_rec\t\t\t\t= %p
-#rec_char.c:\t\tchar destruct this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   this_rec->contents = '!';
-#rec_char.c:   return( (struct derived_rec_char *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_stream
-#rec_char.c: *
-#rec_char.c: * Description :  Displays all char attributes on the STDOUT stream.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  The record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  The record.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec )
-#rec_char.c:{
-#rec_char.c:   this_rec = (struct derived_rec_char *)gen_list_rec_stream(
-#rec_char.c:           (struct gen_list_rec *)this_rec
-#rec_char.c:   );
-#rec_char.c:   LIST_SHOW( printf( "\
-#rec_char.c:\t\tchar stream this_rec\t\t\t\t\t= %p
-#rec_char.c:\t\tchar stream this_rec->contents\t= %c\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_char.c:
-#rec_char.c:   return( this_rec );
-#rec_char.c:
-#rec_char.c:}
-#rec_char.c:
-#rec_char.c:
-#rec_char.c:/*********************************************************************
-#rec_char.c: *
-#rec_char.c: * Function    :  derived_rec_char_equal
-#rec_char.c: *
-#rec_char.c: * Description :  Compares two char records to see if they are equal.
-#rec_char.c: *
-#rec_char.c: * Parameters  :
-#rec_char.c: *          1  :  A record.
-#rec_char.c: *          2  :  Another record.
-#rec_char.c: *
-#rec_char.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_char.c: *
-#rec_char.c: *********************************************************************/
-#rec_char.c:int derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec )
-#rec_char.c:{
-#rec_char.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_char.c:   {
-#rec_char.c:           return( 0 );
-#rec_char.c:   }
-#rec_char.c:   return( this_rec->contents == eq_rec->contents );
-#rec_char.c:
-#rec_char.c:}
-
-
-#rec_char.h:#ifndef REC_CHAR_H_INCLUDED
-#rec_char.h:#define REC_CHAR_H_INCLUDED
-#rec_char.h:#define REC_CHAR_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_char.h:/*********************************************************************
-#rec_char.h: *
-#rec_char.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_char.h: *
-#rec_char.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_char.h: *
-#rec_char.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_char.h: *                Privoxy team. http://www.privoxy.org/
-#rec_char.h: *
-#rec_char.h: *                This program is free software; you can redistribute it
-#rec_char.h: *                and/or modify it under the terms of the GNU General
-#rec_char.h: *                Public License as published by the Free Software
-#rec_char.h: *                Foundation; either version 2 of the License, or (at
-#rec_char.h: *                your option) any later version.
-#rec_char.h: *
-#rec_char.h: *                This program is distributed in the hope that it will
-#rec_char.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_char.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_char.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_char.h: *                License for more details.
-#rec_char.h: *
-#rec_char.h: *                The GNU General Public License should be included with
-#rec_char.h: *                this file.  If not, you can view it at
-#rec_char.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_char.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_char.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_char.h: *
-#rec_char.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_char.h: *                                         and edit IJB, correctly.
-#rec_char.h: *
-#rec_char.h: * Revisions   :
-#rec_char.h: *    $Log: contrib.sh,v $
-#rec_char.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_char.h: *    name change related issues
-#rec_char.h: *
-#rec_char.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_char.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_char.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_char.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_char.h: *    corrupted).  This script will expand all files needed to create the
-#rec_char.h: *    linked list modules and an example program.  Please see the README.
-#rec_char.h: *    Feed back is welcomed.  Enjoy.
-#rec_char.h: *
-#rec_char.h: *
-#rec_char.h: *********************************************************************/
-#rec_char.h:\f
-#rec_char.h:
-#rec_char.h:#ifdef __cplusplus
-#rec_char.h:extern "C" {
-#rec_char.h:#endif
-#rec_char.h:
-#rec_char.h:
-#rec_char.h:struct derived_rec_char
-#rec_char.h:{
-#rec_char.h:   /* private: */
-#rec_char.h:   struct gen_list_rec parent_rec;
-#rec_char.h:   char contents;
-#rec_char.h:};
-#rec_char.h:
-#rec_char.h:/* public: */
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_construct( const char _contents );
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_copy_construct( const struct derived_rec_char *this_rec );
-#rec_char.h:extern struct derived_rec_char *   derived_rec_char_destruct( struct derived_rec_char *this_rec );
-#rec_char.h:extern const struct derived_rec_char *derived_rec_char_stream( const struct derived_rec_char *this_rec );
-#rec_char.h:extern int                                                         derived_rec_char_equal( const struct derived_rec_char *this_rec, const struct derived_rec_char *eq_rec );
-#rec_char.h:
-#rec_char.h:/* struct/class COMPLETE */
-#rec_char.h:
-#rec_char.h:
-#rec_char.h:#ifdef __cplusplus
-#rec_char.h:} /* extern "C" */
-#rec_char.h:#endif
-#rec_char.h:
-#rec_char.h:#endif /* ndef REC_CHAR_H_INCLUDED */
-#rec_char.h:
-#rec_char.h:/*
-#rec_char.h:  Local Variables:
-#rec_char.h:  tab-width: 3
-#rec_char.h:  end:
-#rec_char.h:*/
-
-
-#rec_charptr.c:const char rec_charptr_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_charptr.c: *
-#rec_charptr.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_charptr.c: *
-#rec_charptr.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_charptr.c: *                Privoxy team. http://www.privoxy.org/
-#rec_charptr.c: *
-#rec_charptr.c: *                This program is free software; you can redistribute it
-#rec_charptr.c: *                and/or modify it under the terms of the GNU General
-#rec_charptr.c: *                Public License as published by the Free Software
-#rec_charptr.c: *                Foundation; either version 2 of the License, or (at
-#rec_charptr.c: *                your option) any later version.
-#rec_charptr.c: *
-#rec_charptr.c: *                This program is distributed in the hope that it will
-#rec_charptr.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_charptr.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_charptr.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_charptr.c: *                License for more details.
-#rec_charptr.c: *
-#rec_charptr.c: *                The GNU General Public License should be included with
-#rec_charptr.c: *                this file.  If not, you can view it at
-#rec_charptr.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_charptr.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_charptr.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_charptr.c: *
-#rec_charptr.c: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_charptr.c: *                                              and edit IJB, correctly.
-#rec_charptr.c: *
-#rec_charptr.c: * Revisions   :
-#rec_charptr.c: *    $Log: contrib.sh,v $
-#rec_charptr.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_charptr.c: *    name change related issues
-#rec_charptr.c: *
-#rec_charptr.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_charptr.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_charptr.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_charptr.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_charptr.c: *    corrupted).  This script will expand all files needed to create the
-#rec_charptr.c: *    linked list modules and an example program.  Please see the README.
-#rec_charptr.c: *    Feed back is welcomed.  Enjoy.
-#rec_charptr.c: *
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:\f
-#rec_charptr.c:
-#rec_charptr.c:#include <malloc.h>
-#rec_charptr.c:#include <stdio.h>
-#rec_charptr.c:#include <stdlib.h>
-#rec_charptr.c:#include <string.h>
-#rec_charptr.c:
-#rec_charptr.c:#include "gen_list.h"
-#rec_charptr.c:#include "rec_charptr.h"
-#rec_charptr.c:#include "malloc_police.h"
-#rec_charptr.c:
-#rec_charptr.c:const char rec_charptr_h_rcs[] = REC_CHARPTR_H_VERSION;
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:static const rec_method rec_charptr_vtable[] =
-#rec_charptr.c:{
-#rec_charptr.c:        (rec_method)derived_rec_charptr_copy_construct,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_destruct,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_stream,
-#rec_charptr.c:        (rec_method)derived_rec_charptr_equal
-#rec_charptr.c:};
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_construct
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  A simple derived record class that contains 1 string.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record
-#rec_charptr.c: *          2  :  The string to contain.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  A pointer to the constructed record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_construct( const char *_contents )
-#rec_charptr.c:{
-#rec_charptr.c:        struct derived_rec_charptr *this_rec = (struct derived_rec_charptr *)gen_list_rec_construct(
-#rec_charptr.c:                ISA_CHARPTR,
-#rec_charptr.c:                sizeof( struct derived_rec_charptr ),
-#rec_charptr.c:                rec_charptr_vtable
-#rec_charptr.c:        );
-#rec_charptr.c:
-#rec_charptr.c:        this_rec->contents = STRDUP( _contents );
-#rec_charptr.c:
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr construct new rec\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr construct new rec contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        return( this_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_copy_construct
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Copies one charptr record to another.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  Existing record.
-#rec_charptr.c: *                              2       :  Copy record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  The newly constructed copy record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        int len;
-#rec_charptr.c:        char *new_contents;
-#rec_charptr.c:
-#rec_charptr.c:        struct derived_rec_charptr *copy_rec = (struct derived_rec_charptr *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_charptr.c:
-#rec_charptr.c:        len = strlen( this_rec->contents );
-#rec_charptr.c:        len += sizeof( "COPY " );
-#rec_charptr.c:
-#rec_charptr.c:        copy_rec->contents = (char *)MALLOC( len );
-#rec_charptr.c:        strcpy( copy_rec->contents, "COPY " );
-#rec_charptr.c:        strcat( copy_rec->contents, this_rec->contents );
-#rec_charptr.c:
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr copy construct new gen rec\t\t\t\t= %p => %p
-#rec_charptr.c:\t\tcharptr copy construct new gen rec contents\t= %s\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:        return( copy_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_destruct  
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Destruct the charptr record.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  NULL
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:struct derived_rec_charptr *derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr destruct this_rec\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr destruct this_rec->contents\t= %s\n\n", (const void *)this_rec, (const void *)this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        memset( this_rec->contents, '!', strlen( this_rec->contents ) );
-#rec_charptr.c:        FREE( this_rec->contents );
-#rec_charptr.c:        return( (struct derived_rec_charptr *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_stream
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Displays all charptr attributes on the STDOUT stream.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  The record.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        this_rec = (struct derived_rec_charptr *)gen_list_rec_stream(
-#rec_charptr.c:                (struct gen_list_rec *)this_rec
-#rec_charptr.c:        );
-#rec_charptr.c:        LIST_SHOW( printf( "\
-#rec_charptr.c:\t\tcharptr stream this_rec\t\t\t\t\t= %p
-#rec_charptr.c:\t\tcharptr stream this_rec->contents\t= %s\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:        return( this_rec );
-#rec_charptr.c:
-#rec_charptr.c:}
-#rec_charptr.c:
-#rec_charptr.c:
-#rec_charptr.c:/*********************************************************************
-#rec_charptr.c: *
-#rec_charptr.c: * Function    :  derived_rec_charptr_equal
-#rec_charptr.c: *
-#rec_charptr.c: * Description :  Compares two charptr records to see if they are equal.
-#rec_charptr.c: *
-#rec_charptr.c: * Parameters  :
-#rec_charptr.c: *          1  :  A record.
-#rec_charptr.c: *          2  :  Another record.
-#rec_charptr.c: *
-#rec_charptr.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_charptr.c: *
-#rec_charptr.c: *********************************************************************/
-#rec_charptr.c:int derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec )
-#rec_charptr.c:{
-#rec_charptr.c:        if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_charptr.c:        {
-#rec_charptr.c:                return( 0 );
-#rec_charptr.c:        }
-#rec_charptr.c:        return( 0 == strcmp( this_rec->contents, eq_rec->contents ) );
-#rec_charptr.c:
-#rec_charptr.c:}
-
-
-#rec_charptr.h:#ifndef REC_CHARPTR_H_INCLUDED
-#rec_charptr.h:#define REC_CHARPTR_H_INCLUDED
-#rec_charptr.h:#define REC_CHARPTR_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_charptr.h:/*********************************************************************
-#rec_charptr.h: *
-#rec_charptr.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_charptr.h: *
-#rec_charptr.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_charptr.h: *
-#rec_charptr.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_charptr.h: *                Privoxy team. http://www.privoxy.org/
-#rec_charptr.h: *
-#rec_charptr.h: *                This program is free software; you can redistribute it
-#rec_charptr.h: *                and/or modify it under the terms of the GNU General
-#rec_charptr.h: *                Public License as published by the Free Software
-#rec_charptr.h: *                Foundation; either version 2 of the License, or (at
-#rec_charptr.h: *                your option) any later version.
-#rec_charptr.h: *
-#rec_charptr.h: *                This program is distributed in the hope that it will
-#rec_charptr.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_charptr.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_charptr.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_charptr.h: *                License for more details.
-#rec_charptr.h: *
-#rec_charptr.h: *                The GNU General Public License should be included with
-#rec_charptr.h: *                this file.  If not, you can view it at
-#rec_charptr.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_charptr.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_charptr.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_charptr.h: *
-#rec_charptr.h: * VI users             :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_charptr.h: *                                              and edit IJB, correctly.
-#rec_charptr.h: *
-#rec_charptr.h: * Revisions   :
-#rec_charptr.h: *    $Log: contrib.sh,v $
-#rec_charptr.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_charptr.h: *    name change related issues
-#rec_charptr.h: *
-#rec_charptr.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_charptr.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_charptr.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_charptr.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_charptr.h: *    corrupted).  This script will expand all files needed to create the
-#rec_charptr.h: *    linked list modules and an example program.  Please see the README.
-#rec_charptr.h: *    Feed back is welcomed.  Enjoy.
-#rec_charptr.h: *
-#rec_charptr.h: *
-#rec_charptr.h: *********************************************************************/
-#rec_charptr.h:\f
-#rec_charptr.h:
-#rec_charptr.h:#ifdef __cplusplus
-#rec_charptr.h:extern "C" {
-#rec_charptr.h:#endif
-#rec_charptr.h:
-#rec_charptr.h:
-#rec_charptr.h:struct derived_rec_charptr
-#rec_charptr.h:{
-#rec_charptr.h:        /* private: */
-#rec_charptr.h:        struct gen_list_rec parent_rec;
-#rec_charptr.h:        char *contents;
-#rec_charptr.h:};
-#rec_charptr.h:
-#rec_charptr.h:/* public: */
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_construct( const char *_contents );
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_copy_construct( const struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern struct derived_rec_charptr *     derived_rec_charptr_destruct( struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern const struct derived_rec_charptr *derived_rec_charptr_stream( const struct derived_rec_charptr *this_rec );
-#rec_charptr.h:extern int                                                                      derived_rec_charptr_equal( const struct derived_rec_charptr *this_rec, const struct derived_rec_charptr *eq_rec );
-#rec_charptr.h:
-#rec_charptr.h:/* struct/class COMPLETE */
-#rec_charptr.h:
-#rec_charptr.h:
-#rec_charptr.h:#ifdef __cplusplus
-#rec_charptr.h:} /* extern "C" */
-#rec_charptr.h:#endif
-#rec_charptr.h:
-#rec_charptr.h:#endif /* ndef REC_CHARPTR_H_INCLUDED */
-#rec_charptr.h:
-#rec_charptr.h:/*
-#rec_charptr.h:  Local Variables:
-#rec_charptr.h:  tab-width: 3
-#rec_charptr.h:  end:
-#rec_charptr.h:*/
-
-
-#rec_double.c:const char rec_double_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_double.c: *
-#rec_double.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_double.c: *
-#rec_double.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_double.c: *                Privoxy team. http://www.privoxy.org/
-#rec_double.c: *
-#rec_double.c: *                This program is free software; you can redistribute it
-#rec_double.c: *                and/or modify it under the terms of the GNU General
-#rec_double.c: *                Public License as published by the Free Software
-#rec_double.c: *                Foundation; either version 2 of the License, or (at
-#rec_double.c: *                your option) any later version.
-#rec_double.c: *
-#rec_double.c: *                This program is distributed in the hope that it will
-#rec_double.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_double.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_double.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_double.c: *                License for more details.
-#rec_double.c: *
-#rec_double.c: *                The GNU General Public License should be included with
-#rec_double.c: *                this file.  If not, you can view it at
-#rec_double.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_double.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_double.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_double.c: *
-#rec_double.c: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_double.c: *                                               and edit IJB, correctly.
-#rec_double.c: *
-#rec_double.c: * Revisions   :
-#rec_double.c: *    $Log: contrib.sh,v $
-#rec_double.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_double.c: *    name change related issues
-#rec_double.c: *
-#rec_double.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_double.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_double.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_double.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_double.c: *    corrupted).  This script will expand all files needed to create the
-#rec_double.c: *    linked list modules and an example program.  Please see the README.
-#rec_double.c: *    Feed back is welcomed.  Enjoy.
-#rec_double.c: *
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:\f
-#rec_double.c:
-#rec_double.c:#include <malloc.h>
-#rec_double.c:#include <stdio.h>
-#rec_double.c:#include <stdlib.h>
-#rec_double.c:#include <string.h>
-#rec_double.c:
-#rec_double.c:#include "gen_list.h"
-#rec_double.c:#include "rec_double.h"
-#rec_double.c:
-#rec_double.c:const char rec_double_h_rcs[] = REC_DOUBLE_H_VERSION;
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:static const rec_method rec_double_vtable[] =
-#rec_double.c:{
-#rec_double.c: (rec_method)derived_rec_double_copy_construct,
-#rec_double.c: (rec_method)derived_rec_double_destruct,
-#rec_double.c: (rec_method)derived_rec_double_stream,
-#rec_double.c: (rec_method)derived_rec_double_equal
-#rec_double.c:};
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_construct
-#rec_double.c: *
-#rec_double.c: * Description :  A simple derived record class that contains 1 string.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record
-#rec_double.c: *          2  :  The string to contain.
-#rec_double.c: *
-#rec_double.c: * Returns     :  A pointer to the constructed record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_construct( const double _contents )
-#rec_double.c:{
-#rec_double.c: struct derived_rec_double *this_rec = (struct derived_rec_double *)gen_list_rec_construct(
-#rec_double.c:         ISA_DOUBLE,
-#rec_double.c:         sizeof( struct derived_rec_double ),
-#rec_double.c:         rec_double_vtable
-#rec_double.c: );
-#rec_double.c:
-#rec_double.c: this_rec->contents = _contents;
-#rec_double.c:
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble construct new rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble construct new rec contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( this_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_copy_construct
-#rec_double.c: *
-#rec_double.c: * Description :  Copies one double record to another.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  Existing record.
-#rec_double.c: *                               2       :  Copy record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  The newly constructed copy record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_copy_construct( const struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: struct derived_rec_double *copy_rec = (struct derived_rec_double *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_double.c: copy_rec->contents = - this_rec->contents;
-#rec_double.c:
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble copy construct new gen rec\t\t\t\t= %p => %p
-#rec_double.c:\t\tdouble copy construct new gen rec contents\t= %8.2lf\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( copy_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_destruct    
-#rec_double.c: *
-#rec_double.c: * Description :  Destruct the double record.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  NULL
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:struct derived_rec_double *derived_rec_double_destruct( struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble destruct this_rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble destruct this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: this_rec->contents = -1.1111;
-#rec_double.c: return( (struct derived_rec_double *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_stream
-#rec_double.c: *
-#rec_double.c: * Description :  Displays all double attributes on the STDOUT stream.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  The record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  The record.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec )
-#rec_double.c:{
-#rec_double.c: this_rec = (struct derived_rec_double *)gen_list_rec_stream(
-#rec_double.c:         (struct gen_list_rec *)this_rec
-#rec_double.c: );
-#rec_double.c: LIST_SHOW( printf( "\
-#rec_double.c:\t\tdouble stream this_rec\t\t\t\t= %p
-#rec_double.c:\t\tdouble stream this_rec->contents\t= %8.2lf\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_double.c:
-#rec_double.c: return( this_rec );
-#rec_double.c:
-#rec_double.c:}
-#rec_double.c:
-#rec_double.c:
-#rec_double.c:/*********************************************************************
-#rec_double.c: *
-#rec_double.c: * Function    :  derived_rec_double_equal
-#rec_double.c: *
-#rec_double.c: * Description :  Compares two double records to see if they are equal.
-#rec_double.c: *
-#rec_double.c: * Parameters  :
-#rec_double.c: *          1  :  A record.
-#rec_double.c: *          2  :  Another record.
-#rec_double.c: *
-#rec_double.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_double.c: *
-#rec_double.c: *********************************************************************/
-#rec_double.c:int derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec )
-#rec_double.c:{
-#rec_double.c: if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_double.c: {
-#rec_double.c:         return( 0 );
-#rec_double.c: }
-#rec_double.c: return( this_rec->contents == eq_rec->contents );
-#rec_double.c:
-#rec_double.c:}
-
-
-#rec_double.h:#ifndef REC_DOUBLE_H_INCLUDED
-#rec_double.h:#define REC_DOUBLE_H_INCLUDED
-#rec_double.h:#define REC_DOUBLE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_double.h:/*********************************************************************
-#rec_double.h: *
-#rec_double.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_double.h: *
-#rec_double.h: * Purpose     :  gen_A "derived class" of gen_list_rec.
-#rec_double.h: *
-#rec_double.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_double.h: *                Privoxy team. http://www.privoxy.org/
-#rec_double.h: *
-#rec_double.h: *                This program is free software; you can redistribute it
-#rec_double.h: *                and/or modify it under the terms of the GNU General
-#rec_double.h: *                Public License as published by the Free Software
-#rec_double.h: *                Foundation; either version 2 of the License, or (at
-#rec_double.h: *                your option) any later version.
-#rec_double.h: *
-#rec_double.h: *                This program is distributed in the hope that it will
-#rec_double.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_double.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_double.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_double.h: *                License for more details.
-#rec_double.h: *
-#rec_double.h: *                The GNU General Public License should be included with
-#rec_double.h: *                this file.  If not, you can view it at
-#rec_double.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_double.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_double.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_double.h: *
-#rec_double.h: * VI users              :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_double.h: *                                               and edit IJB, correctly.
-#rec_double.h: *
-#rec_double.h: * Revisions   :
-#rec_double.h: *    $Log: contrib.sh,v $
-#rec_double.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_double.h: *    name change related issues
-#rec_double.h: *
-#rec_double.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_double.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_double.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_double.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_double.h: *    corrupted).  This script will expand all files needed to create the
-#rec_double.h: *    linked list modules and an example program.  Please see the README.
-#rec_double.h: *    Feed back is welcomed.  Enjoy.
-#rec_double.h: *
-#rec_double.h: *
-#rec_double.h: *********************************************************************/
-#rec_double.h:\f
-#rec_double.h:
-#rec_double.h:#ifdef __cplusplus
-#rec_double.h:extern "C" {
-#rec_double.h:#endif
-#rec_double.h:
-#rec_double.h:
-#rec_double.h:struct derived_rec_double
-#rec_double.h:{
-#rec_double.h: /* private: */
-#rec_double.h: struct gen_list_rec parent_rec;
-#rec_double.h: double contents;
-#rec_double.h:};
-#rec_double.h:
-#rec_double.h:/* public: */
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_construct( const double _contents );
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_copy_construct( const struct derived_rec_double *this_rec );
-#rec_double.h:extern struct derived_rec_double *       derived_rec_double_destruct( struct derived_rec_double *this_rec );
-#rec_double.h:extern const struct derived_rec_double *derived_rec_double_stream( const struct derived_rec_double *this_rec );
-#rec_double.h:extern int                                                               derived_rec_double_equal( const struct derived_rec_double *this_rec, const struct derived_rec_double *eq_rec );
-#rec_double.h:
-#rec_double.h:/* struct/class COMPLETE */
-#rec_double.h:
-#rec_double.h:
-#rec_double.h:#ifdef __cplusplus
-#rec_double.h:} /* extern "C" */
-#rec_double.h:#endif
-#rec_double.h:
-#rec_double.h:#endif /* ndef REC_DOUBLE_H_INCLUDED */
-#rec_double.h:
-#rec_double.h:/*
-#rec_double.h:  Local Variables:
-#rec_double.h:  tab-width: 3
-#rec_double.h:  end:
-#rec_double.h:*/
-
-
-#rec_long.c:const char rec_long_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_long.c: *
-#rec_long.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_long.c: *
-#rec_long.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_long.c: *                Privoxy team. http://www.privoxy.org/
-#rec_long.c: *
-#rec_long.c: *                This program is free software; you can redistribute it
-#rec_long.c: *                and/or modify it under the terms of the GNU General
-#rec_long.c: *                Public License as published by the Free Software
-#rec_long.c: *                Foundation; either version 2 of the License, or (at
-#rec_long.c: *                your option) any later version.
-#rec_long.c: *
-#rec_long.c: *                This program is distributed in the hope that it will
-#rec_long.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_long.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_long.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_long.c: *                License for more details.
-#rec_long.c: *
-#rec_long.c: *                The GNU General Public License should be included with
-#rec_long.c: *                this file.  If not, you can view it at
-#rec_long.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_long.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_long.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_long.c: *
-#rec_long.c: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_long.c: *                                         and edit IJB, correctly.
-#rec_long.c: *
-#rec_long.c: * Revisions   :
-#rec_long.c: *    $Log: contrib.sh,v $
-#rec_long.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_long.c: *    name change related issues
-#rec_long.c: *
-#rec_long.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_long.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_long.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_long.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_long.c: *    corrupted).  This script will expand all files needed to create the
-#rec_long.c: *    linked list modules and an example program.  Please see the README.
-#rec_long.c: *    Feed back is welcomed.  Enjoy.
-#rec_long.c: *
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:\f
-#rec_long.c:
-#rec_long.c:#include <malloc.h>
-#rec_long.c:#include <stdio.h>
-#rec_long.c:#include <stdlib.h>
-#rec_long.c:#include <string.h>
-#rec_long.c:
-#rec_long.c:#include "gen_list.h"
-#rec_long.c:#include "rec_long.h"
-#rec_long.c:
-#rec_long.c:const char rec_long_h_rcs[] = REC_LONG_H_VERSION;
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:static const rec_method rec_long_vtable[] =
-#rec_long.c:{
-#rec_long.c:   (rec_method)derived_rec_long_copy_construct,
-#rec_long.c:   (rec_method)derived_rec_long_destruct,
-#rec_long.c:   (rec_method)derived_rec_long_stream,
-#rec_long.c:   (rec_method)derived_rec_long_equal
-#rec_long.c:};
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_construct
-#rec_long.c: *
-#rec_long.c: * Description :  A simple derived record class that contains 1 string.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record
-#rec_long.c: *          2  :  The string to contain.
-#rec_long.c: *
-#rec_long.c: * Returns     :  A pointer to the constructed record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_construct( const long _contents )
-#rec_long.c:{
-#rec_long.c:   struct derived_rec_long *this_rec = (struct derived_rec_long *)gen_list_rec_construct(
-#rec_long.c:           ISA_LONG,
-#rec_long.c:           sizeof( struct derived_rec_long ),
-#rec_long.c:           rec_long_vtable
-#rec_long.c:   );
-#rec_long.c:
-#rec_long.c:   this_rec->contents = _contents;
-#rec_long.c:
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong construct new rec\t\t\t\t= %p
-#rec_long.c:\t\tlong construct new rec contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( this_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_copy_construct
-#rec_long.c: *
-#rec_long.c: * Description :  Copies one long record to another.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  Existing record.
-#rec_long.c: *                         2       :  Copy record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  The newly constructed copy record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_copy_construct( const struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   struct derived_rec_long *copy_rec = (struct derived_rec_long *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_long.c:   copy_rec->contents = - this_rec->contents;
-#rec_long.c:
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong copy construct new gen rec\t\t\t\t= %p => %p
-#rec_long.c:\t\tlong copy construct new gen rec contents\t= %d\n\n", (const void *)this_rec, (const void *)copy_rec, copy_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( copy_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_destruct        
-#rec_long.c: *
-#rec_long.c: * Description :  Destruct the long record.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  NULL
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:struct derived_rec_long *derived_rec_long_destruct( struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong destruct this_rec\t\t\t\t= %p
-#rec_long.c:\t\tlong destruct this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   this_rec->contents = -1;
-#rec_long.c:   return( (struct derived_rec_long *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec ) );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_stream
-#rec_long.c: *
-#rec_long.c: * Description :  Displays all long attributes on the STDOUT stream.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  The record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  The record.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec )
-#rec_long.c:{
-#rec_long.c:   this_rec = (struct derived_rec_long *)gen_list_rec_stream(
-#rec_long.c:           (struct gen_list_rec *)this_rec
-#rec_long.c:   );
-#rec_long.c:   LIST_SHOW( printf( "\
-#rec_long.c:\t\tlong stream this_rec\t\t\t\t\t= %p
-#rec_long.c:\t\tlong stream this_rec->contents\t= %d\n\n", (const void *)this_rec, this_rec->contents ) );
-#rec_long.c:
-#rec_long.c:   return( this_rec );
-#rec_long.c:
-#rec_long.c:}
-#rec_long.c:
-#rec_long.c:
-#rec_long.c:/*********************************************************************
-#rec_long.c: *
-#rec_long.c: * Function    :  derived_rec_long_equal
-#rec_long.c: *
-#rec_long.c: * Description :  Compares two long records to see if they are equal.
-#rec_long.c: *
-#rec_long.c: * Parameters  :
-#rec_long.c: *          1  :  A record.
-#rec_long.c: *          2  :  Another record.
-#rec_long.c: *
-#rec_long.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_long.c: *
-#rec_long.c: *********************************************************************/
-#rec_long.c:int derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec )
-#rec_long.c:{
-#rec_long.c:   if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_long.c:   {
-#rec_long.c:           return( 0 );
-#rec_long.c:   }
-#rec_long.c:   return( this_rec->contents == eq_rec->contents );
-#rec_long.c:
-#rec_long.c:}
-
-
-#rec_long.h:#ifndef REC_LONG_H_INCLUDED
-#rec_long.h:#define REC_LONG_H_INCLUDED
-#rec_long.h:#define REC_LONG_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_long.h:/*********************************************************************
-#rec_long.h: *
-#rec_long.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_long.h: *
-#rec_long.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_long.h: *
-#rec_long.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_long.h: *                Privoxy team. http://www.privoxy.org/
-#rec_long.h: *
-#rec_long.h: *                This program is free software; you can redistribute it
-#rec_long.h: *                and/or modify it under the terms of the GNU General
-#rec_long.h: *                Public License as published by the Free Software
-#rec_long.h: *                Foundation; either version 2 of the License, or (at
-#rec_long.h: *                your option) any later version.
-#rec_long.h: *
-#rec_long.h: *                This program is distributed in the hope that it will
-#rec_long.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_long.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_long.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_long.h: *                License for more details.
-#rec_long.h: *
-#rec_long.h: *                The GNU General Public License should be included with
-#rec_long.h: *                this file.  If not, you can view it at
-#rec_long.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_long.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_long.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_long.h: *
-#rec_long.h: * VI users                :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_long.h: *                                         and edit IJB, correctly.
-#rec_long.h: *
-#rec_long.h: * Revisions   :
-#rec_long.h: *    $Log: contrib.sh,v $
-#rec_long.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_long.h: *    name change related issues
-#rec_long.h: *
-#rec_long.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_long.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_long.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_long.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_long.h: *    corrupted).  This script will expand all files needed to create the
-#rec_long.h: *    linked list modules and an example program.  Please see the README.
-#rec_long.h: *    Feed back is welcomed.  Enjoy.
-#rec_long.h: *
-#rec_long.h: *
-#rec_long.h: *********************************************************************/
-#rec_long.h:\f
-#rec_long.h:
-#rec_long.h:#ifdef __cplusplus
-#rec_long.h:extern "C" {
-#rec_long.h:#endif
-#rec_long.h:
-#rec_long.h:
-#rec_long.h:struct derived_rec_long
-#rec_long.h:{
-#rec_long.h:   /* private: */
-#rec_long.h:   struct gen_list_rec parent_rec;
-#rec_long.h:   long contents;
-#rec_long.h:};
-#rec_long.h:
-#rec_long.h:/* public: */
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_construct( const long _contents );
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_copy_construct( const struct derived_rec_long *this_rec );
-#rec_long.h:extern struct derived_rec_long *   derived_rec_long_destruct( struct derived_rec_long *this_rec );
-#rec_long.h:extern const struct derived_rec_long *derived_rec_long_stream( const struct derived_rec_long *this_rec );
-#rec_long.h:extern int                                                         derived_rec_long_equal( const struct derived_rec_long *this_rec, const struct derived_rec_long *eq_rec );
-#rec_long.h:
-#rec_long.h:/* struct/class COMPLETE */
-#rec_long.h:
-#rec_long.h:
-#rec_long.h:#ifdef __cplusplus
-#rec_long.h:} /* extern "C" */
-#rec_long.h:#endif
-#rec_long.h:
-#rec_long.h:#endif /* ndef REC_LONG_H_INCLUDED */
-#rec_long.h:
-#rec_long.h:/*
-#rec_long.h:  Local Variables:
-#rec_long.h:  tab-width: 3
-#rec_long.h:  end:
-#rec_long.h:*/
-
-
-#rec_malloc_police.c:const char rec_malloc_police_rcs[] = "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $";
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_malloc_police.c: *                                                This class helps to build a list of allocated and
-#rec_malloc_police.c: *                                                freed memory.  When the program exits, we will print
-#rec_malloc_police.c: *                                                a list of all memory that was allocated, but never
-#rec_malloc_police.c: *                                                freed.  This could be most helpful to developers
-#rec_malloc_police.c: *                                                and debugers.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_malloc_police.c: *                Privoxy team. http://www.privoxy.org/
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                This program is free software; you can redistribute it
-#rec_malloc_police.c: *                and/or modify it under the terms of the GNU General
-#rec_malloc_police.c: *                Public License as published by the Free Software
-#rec_malloc_police.c: *                Foundation; either version 2 of the License, or (at
-#rec_malloc_police.c: *                your option) any later version.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                This program is distributed in the hope that it will
-#rec_malloc_police.c: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_malloc_police.c: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_malloc_police.c: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_malloc_police.c: *                License for more details.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *                The GNU General Public License should be included with
-#rec_malloc_police.c: *                this file.  If not, you can view it at
-#rec_malloc_police.c: *                http://www.gnu.org/copyleft/gpl.html
-#rec_malloc_police.c: *                or write to the Free Software Foundation, Inc., 59
-#rec_malloc_police.c: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_malloc_police.c: *                                                and edit IJB, correctly.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Revisions   :
-#rec_malloc_police.c: *    $Log: contrib.sh,v $
-#rec_malloc_police.c: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_malloc_police.c: *    name change related issues
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_malloc_police.c: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_malloc_police.c: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_malloc_police.c: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_malloc_police.c: *    corrupted).  This script will expand all files needed to create the
-#rec_malloc_police.c: *    linked list modules and an example program.  Please see the README.
-#rec_malloc_police.c: *    Feed back is welcomed.  Enjoy.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:\f
-#rec_malloc_police.c:
-#rec_malloc_police.c:#include <stdio.h>
-#rec_malloc_police.c:
-#rec_malloc_police.c:#include "gen_list.h"
-#rec_malloc_police.c:#include "malloc_police.h"
-#rec_malloc_police.c:#include "rec_malloc_police.h"
-#rec_malloc_police.c:
-#rec_malloc_police.c:const char rec_malloc_police_h_rcs[] = REC_MALLOC_POLICE_H_VERSION;
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:static const rec_method rec_malloc_police_vtable[] =
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_copy_construct,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_destruct,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_stream,
-#rec_malloc_police.c:  (rec_method)derived_rec_malloc_police_equal
-#rec_malloc_police.c:};
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_construct
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  A simple derived record class that contains 1 string.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record
-#rec_malloc_police.c: *          2  :  The string to contain.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  A pointer to the constructed record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  struct derived_rec_malloc_police *this_rec;
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_construct(
-#rec_malloc_police.c:          ISA_MALLOC_POLICE,
-#rec_malloc_police.c:          sizeof( struct derived_rec_malloc_police ),
-#rec_malloc_police.c:          rec_malloc_police_vtable
-#rec_malloc_police.c:  );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec->alloced_addr  = _alloced_addr;
-#rec_malloc_police.c:  this_rec->source_where  = STRDUP( _source_where );
-#rec_malloc_police.c:  this_rec->sz                            = _sz;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec\t\t\t\t\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec alloced_addr = %p */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec source_where = %s */
-#rec_malloc_police.c:/* \t\tmalloc_police construct new rec sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, */
-#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          this_rec->source_where, */
-#rec_malloc_police.c:/*                          this_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_copy_construct
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Copies one malloc_police record to another.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  Existing record.
-#rec_malloc_police.c: *                                2       :  Copy record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  The newly constructed copy record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  int len;
-#rec_malloc_police.c:  char *new_contents;
-#rec_malloc_police.c:  struct derived_rec_malloc_police *copy_rec;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  copy_rec = (struct derived_rec_malloc_police *)gen_list_rec_copy_construct( (struct gen_list_rec *)this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  copy_rec->alloced_addr  = this_rec->alloced_addr;
-#rec_malloc_police.c:  copy_rec->source_where  = STRDUP( this_rec->source_where );
-#rec_malloc_police.c:  copy_rec->sz                            = this_rec->sz;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec = %p => %p */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec alloced_addr = %p */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec source_where = %s */
-#rec_malloc_police.c:/* \t\tmalloc_police copy construct new gen rec sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, (const void *)copy_rec, */
-#rec_malloc_police.c:/*                          copy_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          copy_rec->source_where, */
-#rec_malloc_police.c:/*                          copy_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( copy_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_destruct      
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Destruct the malloc_police record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  NULL
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:struct derived_rec_malloc_police *derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  struct derived_rec_malloc_police *d;
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*        LIST_SHOW( printf( "\ */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec\t\t\t\t\t\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->alloced_addr\t= %p */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->source_where\t= %s, */
-#rec_malloc_police.c:/* \t\tmalloc_police destruct this_rec->sz\t\t\t\t\t= %ld\n\n", */
-#rec_malloc_police.c:/*                          (const void *)this_rec, */
-#rec_malloc_police.c:/*                          this_rec->alloced_addr, */
-#rec_malloc_police.c:/*                          this_rec->source_where, */
-#rec_malloc_police.c:/*                          this_rec->sz */
-#rec_malloc_police.c:/*        ) ); */
-#rec_malloc_police.c:
-#rec_malloc_police.c:  memset( this_rec->source_where, '!', strlen( this_rec->source_where ) );
-#rec_malloc_police.c:  FREE( this_rec->source_where );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  d = (struct derived_rec_malloc_police *)gen_list_rec_destruct( (struct gen_list_rec *)this_rec );
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  return( d );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_stream
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Displays all malloc_police attributes on the STDOUT stream.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  The record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  this_rec = (struct derived_rec_malloc_police *)gen_list_rec_stream(
-#rec_malloc_police.c:          (struct gen_list_rec *)this_rec
-#rec_malloc_police.c:  );
-#rec_malloc_police.c:  LIST_SHOW( printf( "\
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec\t\t\t\t\t= %p
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->alloced_addr\t= %p
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->source_where\t= %s
-#rec_malloc_police.c:\t\tmalloc_police stream this_rec->sz\t\t\t\t= %ld\n\n",
-#rec_malloc_police.c:                                                   (const void *)this_rec,
-#rec_malloc_police.c:                                                   this_rec->alloced_addr,
-#rec_malloc_police.c:                                                   this_rec->source_where,
-#rec_malloc_police.c:                                                   this_rec->sz
-#rec_malloc_police.c:  ) );
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:  return( this_rec );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-#rec_malloc_police.c:
-#rec_malloc_police.c:
-#rec_malloc_police.c:/*********************************************************************
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Function    :  derived_rec_malloc_police_equal
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Description :  Compares two malloc_police records to see if they are equal.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Parameters  :
-#rec_malloc_police.c: *          1  :  A record.
-#rec_malloc_police.c: *          2  :  Another record.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: * Returns     :  0 => NOT EQUAL, anything else is EQUAL.
-#rec_malloc_police.c: *
-#rec_malloc_police.c: *********************************************************************/
-#rec_malloc_police.c:int derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec )
-#rec_malloc_police.c:{
-#rec_malloc_police.c:  list_is_quiet ++;
-#rec_malloc_police.c:
-#rec_malloc_police.c:  if ( ! gen_list_rec_equal( (const struct gen_list_rec *)this_rec, (struct gen_list_rec *)eq_rec ) )
-#rec_malloc_police.c:  {
-#rec_malloc_police.c:          return( 0 );
-#rec_malloc_police.c:  }
-#rec_malloc_police.c:
-#rec_malloc_police.c:  list_is_quiet --;
-#rec_malloc_police.c:  return( this_rec->alloced_addr == eq_rec->alloced_addr );
-#rec_malloc_police.c:
-#rec_malloc_police.c:}
-
-
-#rec_malloc_police.h:#ifndef REC_MALLOC_POLICE_H_INCLUDED
-#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_INCLUDED
-#rec_malloc_police.h:#define REC_MALLOC_POLICE_H_VERSION "$Id: contrib.sh,v 1.2 2002/03/24 13:25:43 swa Exp $"
-#rec_malloc_police.h:/*********************************************************************
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * File        :  $Source: /cvsroot/ijbswa/current/contrib.sh,v $
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Purpose     :  A "derived class" of gen_list_rec.
-#rec_malloc_police.h: *                                                This class helps to build a list of allocated and
-#rec_malloc_police.h: *                                                freed memory.  When the program exits, we will print
-#rec_malloc_police.h: *                                                a list of all memory that was allocated, but never
-#rec_malloc_police.h: *                                                freed.  This could be most helpful to developers
-#rec_malloc_police.h: *                                                and debugers.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#rec_malloc_police.h: *                Privoxy team. http://www.privoxy.org/
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                This program is free software; you can redistribute it
-#rec_malloc_police.h: *                and/or modify it under the terms of the GNU General
-#rec_malloc_police.h: *                Public License as published by the Free Software
-#rec_malloc_police.h: *                Foundation; either version 2 of the License, or (at
-#rec_malloc_police.h: *                your option) any later version.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                This program is distributed in the hope that it will
-#rec_malloc_police.h: *                be useful, but WITHOUT ANY WARRANTY; without even the
-#rec_malloc_police.h: *                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#rec_malloc_police.h: *                PARTICULAR PURPOSE.  See the GNU General Public
-#rec_malloc_police.h: *                License for more details.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *                The GNU General Public License should be included with
-#rec_malloc_police.h: *                this file.  If not, you can view it at
-#rec_malloc_police.h: *                http://www.gnu.org/copyleft/gpl.html
-#rec_malloc_police.h: *                or write to the Free Software Foundation, Inc., 59
-#rec_malloc_police.h: *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * VI users               :       Please "set tabstop=3 shiftwidth=3" to view this file,
-#rec_malloc_police.h: *                                                and edit IJB, correctly.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: * Revisions   :
-#rec_malloc_police.h: *    $Log: contrib.sh,v $
-#rec_malloc_police.h: *    Revision 1.2  2002/03/24 13:25:43  swa
-#rec_malloc_police.h: *    name change related issues
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *    Revision 1.1  2001/12/07 01:54:50  iwanttokeepanon
-#rec_malloc_police.h: *    A contribution/recomendation to the IJBSWA group for a generic doubly
-#rec_malloc_police.h: *    linked list.  This file is a home brew "bash tar" (I cannot create a
-#rec_malloc_police.h: *    contrib directory and I cannot upload a tarball ... it gets
-#rec_malloc_police.h: *    corrupted).  This script will expand all files needed to create the
-#rec_malloc_police.h: *    linked list modules and an example program.  Please see the README.
-#rec_malloc_police.h: *    Feed back is welcomed.  Enjoy.
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *
-#rec_malloc_police.h: *********************************************************************/
-#rec_malloc_police.h:\f
-#rec_malloc_police.h:
-#rec_malloc_police.h:#ifdef __cplusplus
-#rec_malloc_police.h:extern "C" {
-#rec_malloc_police.h:#endif
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:struct derived_rec_malloc_police
-#rec_malloc_police.h:{
-#rec_malloc_police.h:  /* private: */
-#rec_malloc_police.h:  struct  gen_list_rec parent_rec;
-#rec_malloc_police.h:  void            *alloced_addr;
-#rec_malloc_police.h:  char            *source_where;
-#rec_malloc_police.h:  size_t  sz;
-#rec_malloc_police.h:};
-#rec_malloc_police.h:
-#rec_malloc_police.h:/* public: */
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_construct( void *_alloced_addr, char *_source_where, size_t _sz );
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_copy_construct( const struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern struct derived_rec_malloc_police * derived_rec_malloc_police_destruct( struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern const struct derived_rec_malloc_police *derived_rec_malloc_police_stream( const struct derived_rec_malloc_police *this_rec );
-#rec_malloc_police.h:extern int                                                                                        derived_rec_malloc_police_equal( const struct derived_rec_malloc_police *this_rec, const struct derived_rec_malloc_police *eq_rec );
-#rec_malloc_police.h:
-#rec_malloc_police.h:/* struct/class COMPLETE */
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:#ifdef __cplusplus
-#rec_malloc_police.h:} /* extern "C" */
-#rec_malloc_police.h:#endif
-#rec_malloc_police.h:
-#rec_malloc_police.h:
-#rec_malloc_police.h:#endif /* ndef REC_MALLOC_POLICE_H_INCLUDED */
-#rec_malloc_police.h:
-#rec_malloc_police.h:/*
-#rec_malloc_police.h:  Local Variables:
-#rec_malloc_police.h:  tab-width: 3
-#rec_malloc_police.h:  end:
-#rec_malloc_police.h:*/
-
-
-###########################################################################
-##  Description:                       makeInsertableFile
-##             Use this function to make a file suitable for insertion into this
-##             script.  This file (x), will contain all of the files listed.
-##
-##  Inputs :
-##             None
-##
-##  Outputs :
-##             Return status:  (0) - Everything is Okay, anything else is an error
-###########################################################################
-
-function makeInsertableFile {
-
-       rm -f x
-
-       for i in ${fileList}; do
-               sed -e "s/^/#${i}:/" ${i} >> x
-               echo "" >> x
-               echo "" >> x
-       done
-
-       return 0
-
-}
-
-
-#
-#Local Variables:
-#tab-width: 3
-#end:
-#
index b28dd6a..4568ea8 100644 (file)
--- a/cygwin.h
+++ b/cygwin.h
@@ -1,16 +1,16 @@
-#ifndef CYGWIN_H_INCLUDED
-#define CYGWIN_H_INCLUDED
-#define CYGWIN_H_VERSION "$Id: cygwin.h,v 1.3 2002/03/24 13:25:43 swa Exp $"
+#ifndef _CYGWIN_H
+#define _CYGWIN_H
+#define CYGWIN_H_VERSION "$Id: cygwin.h,v 1.1 2001/05/13 21:57:06 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/cygwin.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/cygwin.h,v $
  *
  * Purpose     :  The windows.h file seems to be a *tad* different, so I
  *                will bridge the gaps here.  Perhaps I should convert the
  *                latest SDK too?  Shudder, I think not.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: cygwin.h,v $
- *    Revision 1.3  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 
@@ -63,7 +53,7 @@
  */
 
 #endif /* def __MINGW32__ */
-#endif /* ndef CYGWIN_H_INCLUDED */
+#endif /* ndef _CYGWIN_H */
 
 
 /*
diff --git a/deanimate.c b/deanimate.c
deleted file mode 100644 (file)
index 94311d4..0000000
+++ /dev/null
@@ -1,501 +0,0 @@
-const char deanimate_rcs[] = "$Id: deanimate.c,v 1.10 2002/03/24 13:25:43 swa Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/deanimate.c,v $
- *
- * Purpose     :  Declares functions to deanimate GIF images on the fly.
- *                
- *                Functions declared include: gif_deanimate, buf_free,
- *                buf_copy,  buf_getbyte, gif_skip_data_block, and
- *                gif_extract_image
- *
- * Copyright   :  Written by and Copyright (C) 2001 by the the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the GIF file format specification (see
- *                http://tronche.com/computer-graphics/gif/gif89a.html)
- *                and ideas from the Image::DeAnim Perl module by
- *                Ken MacFarlane, <ksm+cpan@universal.dca.net>
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: deanimate.c,v $
- *    Revision 1.10  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.9  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.8  2002/03/09 19:42:47  jongfoster
- *    Fixing more warnings
- *
- *    Revision 1.7  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.6  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.5  2001/09/10 10:16:06  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.4  2001/07/18 12:28:49  oes
- *    - Added feature for extracting the first frame
- *      to gif_deanimate
- *    - Separated image buffer extension into buf_extend
- *    - Extended gif deanimation to GIF87a (untested!)
- *    - Cosmetics
- *
- *    Revision 1.3  2001/07/15 13:57:50  jongfoster
- *    Adding #includes string.h and miscutil.h
- *
- *    Revision 1.2  2001/07/13 13:46:20  oes
- *    Introduced GIF deanimation feature
- *
- *
- **********************************************************************/
-\f
-
-#include "config.h"
-
-#include <string.h>
-#include <fcntl.h>
-
-#include "project.h"
-#include "deanimate.h"
-#include "miscutil.h"
-
-const char deanimate_h_rcs[] = DEANIMATE_H_VERSION;
-
-/*********************************************************************
- * 
- * Function    :  buf_free
- *
- * Description :  Safely frees a struct binbuffer
- *
- * Parameters  :
- *          1  :  buf = Pointer to the binbuffer to be freed
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void buf_free(struct binbuffer *buf)
-{
-   if (buf == NULL) return;
-
-   if (buf->buffer != NULL)
-   {
-      free(buf->buffer);
-   }
-
-   free(buf);
-
-}
-
-
-/*********************************************************************
- * 
- * Function    :  buf_extend
- *
- * Description :  Ensure that a given binbuffer can hold a given amount
- *                of bytes, by reallocating its buffer if necessary.
- *                Allocate new mem in chunks of 1024 bytes, so we don't
- *                have to realloc() too often.
- *
- * Parameters  :
- *          1  :  buf = Pointer to the binbuffer
- *          2  :  length = Desired minimum size
- *                
- *
- * Returns     :  0 on success, 1 on failiure.
- *
- *********************************************************************/
-int buf_extend(struct binbuffer *buf, size_t length)
-{
-   char *newbuf;
-
-   if (buf->offset + length > buf->size)
-   {
-      buf->size = ((buf->size + length + (size_t)1023) & ~(size_t)1023);
-      newbuf = (char *)realloc(buf->buffer, buf->size);
-
-      if (newbuf == NULL)
-      {
-         freez(buf->buffer);
-         return 1;
-      }
-      else
-      {
-         buf->buffer = newbuf;
-         return 0;
-      }
-   }
-   return 0;
-
-}
-
-
-/*********************************************************************
- * 
- * Function    :  buf_copy
- *
- * Description :  Safely copies a given amount of bytes from one
- *                struct binbuffer to another, advancing the
- *                offsets appropriately.
- *
- * Parameters  :
- *          1  :  src = Pointer to the source binbuffer
- *          2  :  dst = Pointer to the destination binbuffer
- *          3  :  length = Number of bytes to be copied
- *
- * Returns     :  0 on success, 1 on failiure.
- *
- *********************************************************************/
-int buf_copy(struct binbuffer *src, struct binbuffer *dst, size_t length)
-{
-
-   /*
-    * Sanity check: Can't copy more data than we have
-    */
-   if (src->offset + length > src->size) 
-   {
-      return 1;
-   }
-
-   /*
-    * Ensure that dst can hold the new data
-    */
-   if (buf_extend(dst, length)) 
-   {
-      return 1;
-   }
-
-   /*
-    * Now that it's safe, memcpy() the desired amount of
-    * data from src to dst and adjust the offsets
-    */
-   memcpy(dst->buffer + dst->offset, src->buffer + src->offset, length);
-   src->offset += length;
-   dst->offset += length;
-
-   return 0;
-
-}
-
-
-/*********************************************************************
- * 
- * Function    :  buf_getbyte
- *
- * Description :  Safely gets a byte from a given binbuffer at a
- *                given offset
- *
- * Parameters  :
- *          1  :  buf = Pointer to the source binbuffer
- *          2  :  offset = Offset to the desired byte
- *
- * Returns     :  The byte on success, or 0 on failiure
- *
- *********************************************************************/
-unsigned char buf_getbyte(struct binbuffer *src, size_t offset)
-{
-   if (src->offset + offset < src->size)
-   {
-      return (unsigned char)*(src->buffer + src->offset + offset);
-   }
-   else
-   {
-      return '\0';
-   }
-
-}
-
-
-/*********************************************************************
- * 
- * Function    :  gif_skip_data_block
- *
- * Description :  Safely advances the offset of a given struct binbuffer
- *                that contains a GIF image and whose offset is
- *                positioned at the start of a data block, behind
- *                that block.
- *
- * Parameters  :
- *          1  :  buf = Pointer to the binbuffer
- *
- * Returns     :  0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_skip_data_block(struct binbuffer *buf)
-{
-   unsigned char c;
-
-   /* 
-    * Data blocks are sequences of chunks, which are headed
-    * by a one-byte length field, with the last chunk having
-    * zero length.
-    */
-   while((c = buf_getbyte(buf, 0)) != '\0')
-   {
-      if ((buf->offset += c + 1) >= buf->size - 1)
-      {
-         return 1;
-      }
-   }
-   buf->offset++;
-
-   return 0;
-
-}
-
-
-/*********************************************************************
- * 
- * Function    :  gif_extract_image
- *
- * Description :  Safely extracts an image data block from a given
- *                struct binbuffer that contains a GIF image and whose
- *                offset is positioned at the start of a data block 
- *                into a given destination binbuffer.
- *
- * Parameters  :
- *          1  :  src = Pointer to the source binbuffer
- *          2  :  dst = Pointer to the destination binbuffer
- *
- * Returns     :  0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_extract_image(struct binbuffer *src, struct binbuffer *dst)
-{
-   unsigned char c;
-   
-   /*
-    * Remember the colormap flag and copy the image head
-    */
-   c = buf_getbyte(src, 9);
-   if (buf_copy(src, dst, 10))
-   {
-      return 1;
-   }
-
-   /*
-    * If the image has a local colormap, copy it.
-    */
-   if (c & 0x80)
-   {
-      if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
-      {
-         return 1;
-      }           
-   }
-   if (buf_copy(src, dst, 1)) return 1;
-
-   /*
-    * Copy the image chunk by chunk.
-    */
-   while((c = buf_getbyte(src, 0)) != '\0')
-   {
-      if (buf_copy(src, dst, 1 + (size_t) c)) return 1;
-   }
-   if (buf_copy(src, dst, 1)) return 1;
-
-   /*
-    * Trim and rewind the dst buffer
-    */
-   if (NULL == (dst->buffer = (char *)realloc(dst->buffer, dst->offset))) return 1;
-   dst->size = dst->offset;
-   dst->offset = 0;
-
-   return(0);
-
-}
-
-/*********************************************************************
- * 
- * Function    :  gif_deanimate
- *
- * Description :  Deanimate a given GIF image, i.e. given a GIF with
- *                an (optional) image block and an arbitrary number
- *                of image extension blocks, produce an output GIF with
- *                only one image block that contains the last image
- *                (extenstion) block of the original.
- *                Also strip Comments, Application extenstions, etc.
- *
- * Parameters  :
- *          1  :  src = Pointer to the source binbuffer
- *          2  :  dst = Pointer to the destination binbuffer
- *          3  :  get_first_image = Flag: If set, get the first image
- *                                        If unset (default), get the last
- *
- * Returns     :  0 on success, or 1 on failiure
- *
- *********************************************************************/
-int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image)
-{
-   unsigned char c;
-   struct binbuffer *image;
-
-   if (NULL == src || NULL == dst)
-   {
-      return 1;
-   }
-
-   c = buf_getbyte(src, 10);
-
-   /*
-    * Check & copy GIF header 
-    */
-   if (strncmp(src->buffer, "GIF89a", 6) && strncmp(src->buffer, "GIF87a", 6)) 
-   {
-      return 1;
-   }
-   else
-   {
-      if (buf_copy(src, dst, 13))
-      {
-         return 1;
-      }
-   }
-
-   /*
-    * Look for global colormap and  copy if found.
-    */
-   if(c & 0x80)
-   {
-      if (buf_copy(src, dst, (size_t) 3 * (1 << ((c & 0x07) + 1))))
-      {
-         return 1;
-      }
-   }
-
-   /*
-    * Reserve a buffer for the current image block
-    */
-   if (NULL == (image = (struct binbuffer *)zalloc(sizeof(*image))))
-   {
-      return 1;
-   }
-
-   /*
-    * Parse the GIF block by block and copy the relevant
-    * parts to dst
-    */
-   while(src->offset < src->size)
-   {
-      switch(buf_getbyte(src, 0))
-      {
-         /*
-          *  End-of-GIF Marker: Append current image and return
-          */
-      case 0x3b:
-         goto write;
-
-         /* 
-          * Image block: Extract to current image buffer.
-          */
-      case 0x2c:
-         image->offset = 0;
-         if (gif_extract_image(src, image)) goto failed;
-         if (get_first_image) goto write;
-         continue;
-
-         /*
-          * Extension block: Look at next byte and decide
-          */
-      case 0x21:
-         switch (buf_getbyte(src, 1))
-         {
-            /*
-             * Image extension: Copy extension  header and image
-             *                  to the current image buffer
-             */
-         case 0xf9:
-            image->offset = 0;
-            if (buf_copy(src, image, 8) || buf_getbyte(src, 0) != 0x2c) goto failed;
-            if (gif_extract_image(src, image)) goto failed;
-            if (get_first_image) goto write;
-            continue;
-
-            /*
-             * Application extension: Skip
-             */
-         case 0xff:
-            if ((src->offset += 14) >= src->size || gif_skip_data_block(src)) goto failed;
-            continue;
-
-            /*
-             * Comment extension: Skip
-             */
-         case 0xfe:
-            if ((src->offset += 2) >= src->size || gif_skip_data_block(src)) goto failed;
-            continue;
-
-            /*
-             * Plain text extension: Skip
-             */
-         case 0x01:
-            if ((src->offset += 15) >= src->size || gif_skip_data_block(src)) goto failed;
-            continue;
-
-            /*
-             * Ooops, what type of extension is that?
-             */
-         default:
-            goto failed;
-
-         }
-
-         /*
-          * Ooops, what type of block is that?
-          */
-      default:
-         goto failed;
-         
-      }
-   } /* -END- while src */
-
-   /*
-    * Either we got here by goto, or because the GIF is
-    * bogus and EOF was reached before an end-of-gif marker 
-    * was found.
-    */
-
-failed:
-   buf_free(image);
-   return 1;
-
-   /*
-    * Append the current image to dst and return
-    */
-
-write:
-   if (buf_copy(image, dst, image->size)) goto failed;
-   if (buf_extend(dst, 1)) goto failed;
-   *(dst->buffer + dst->offset++) = 0x3b;
-   buf_free(image);
-   return 0;
-
-}
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/deanimate.h b/deanimate.h
deleted file mode 100644 (file)
index ede9847..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef DEANIMATE_H_INCLUDED
-#define DEANIMATE_H_INCLUDED
-#define DEANIMATE_H_VERSION "$Id: deanimate.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/deanimate.h,v $
- *
- * Purpose     :  Declares functions to deanimate GIF images on the fly.
- *                
- *                Functions declared include: gif_deanimate, buf_free
- *                
- *
- * Copyright   :  Written by and Copyright (C) 2001 Andreas S. Oesterhelt
- *                for the Privoxy team. http://www.privoxy.org/
- *
- *                Based on ideas from the Image::DeAnim Perl module by
- *                Ken MacFarlane, <ksm+cpan@universal.dca.net>
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: deanimate.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.5  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.4  2001/07/29 18:50:04  jongfoster
- *    Fixing "extern C" block, and renaming #define _DEANIMATE_H
- *
- *    Revision 1.3  2001/07/18 12:29:05  oes
- *    Updated prototype for gif_deanimate
- *
- *    Revision 1.2  2001/07/13 13:46:20  oes
- *    Introduced GIF deanimation feature
- *
- *
- *********************************************************************/
-\f
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * A struct that holds a buffer, a read/write offset,
- * and the buffer's capacity.
- */
-struct binbuffer
-{
-   char *buffer; 
-   size_t offset;   
-   size_t size;    
-};
-
-/*
- * Function prototypes
- */
-extern int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_image);
-extern void buf_free(struct binbuffer *buf);
-
-/* 
- * Revision control strings from this header and associated .c file
- */
-extern const char deanimate_rcs[];
-extern const char deanimate_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef DEANIMATE_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/default.filter b/default.filter
deleted file mode 100644 (file)
index 728a718..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-# ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/default.filter,v $
-# 
-#  $Id: basic.action,v 1.3 2002/03/26 22:29:54 swa Exp $
-#
-#  Purpose     :  Rules to process the content of web pages
-# 
-#  Copyright   :  Written by and Copyright
-#                 Privoxy team. http://www.privoxy.org/
-#
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-#
-# We value your feedback. However, to provide you with the best support,
-# please note:
-#  
-#  * Use the support forum to get help:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118
-#  * Submit bugs only thru our bug forum:
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 
-#    Make sure that the bug has not already been submitted. Please try
-#    to verify that it is a Junkbuster bug, and not a browser or site
-#    bug first. If you are using your own custom configuration, please
-#    try the stock configs to see if the problem is a configuration
-#    related bug. And if not using the latest development snapshot,
-#    please try the latest one. Or even better, CVS sources.
-#  * Submit feature requests only thru our feature request forum:
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-#      
-# For any other issues, feel free to use the mailing lists:
-# http://sourceforge.net/mail/?group_id=11118
-#    
-# Anyone interested in actively participating in development and related
-# discussions can join the appropriate mailing list here:
-# http://sourceforge.net/mail/?group_id=11118. Archives are available
-# here too.
-# 
-#################################################################################
-#
-# Syntax:
-#
-# Filters start with a line "FILTER: name description". They are then referrable
-# from the actionsfile with +filter{name}
-#
-# Inside the filters, write one Perl-Style substitution (job) per line.
-# Jobs that precede the first FILTER: line are ignored.
-#
-# For Details see the pcrs manpage contained in this distribution.
-# (and the perlre, perlop and pcre manpages)
-#
-# Note that you are free to choose the delimter as you see fit.
-#
-# Note2: In addidion to the Perl options gimsx, the following nonstandard
-# options are supported:
-# 
-# 'U' turns the default to ungreedy matching.  Add ? to quantifiers to
-#     switch back to greedy.
-# 'T' (trivial) prevents parsing for backreferences in the substitute.
-#     Use if you want to include text like '$&' in your substitute without
-#     quoting.
-# 
-#################################################################################
-
-
-#################################################################################
-#
-# html-annoyances: Get rid of particularly annoying HTML abuse
-#
-#################################################################################
-FILTER: html-annoyances Get rid of particularly annoying HTML abuse
-
-# New browser windows (if allowed -- see no-popups filter below) should be
-# resizeable and have a location and status bar
-#
-s/(<a\s+href[^>]+)resizable=['"]?(no|0|false)['"]?(.*>)/$1resizable=1$3/igU 
-s/(<a\s+href[^>]+)location=['"]?(no|0)['"]?(.*>)/$1location=1$3/igU 
-s/(<a\s+href[^>]+)status=['"]?(no|0)['"]?(.*>)/$1status=1$3/igU
-s/(<a\s+href[^>]+)scrolling=['"]?(no|0|auto)['"]?(.*>)/$1scrolling=no$3/igU
-s/(<a\s+href[^>]+)menubar=['"]?(no|0)['"]?(.*>)/$1menubar=1$3/igU
-
-# The <BLINK> tag was a crime!
-#
-s*<blink>|</blink>**ig
-
-# Is this evil? 
-#
-#s/margin(height|width)=[0-9]*//gi
-#s/noresize/yesresize/igU
-
-
-#################################################################################
-#
-# js-annoyances: Get rid of particularly annoying JavaScript abuse
-#
-#################################################################################
-FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
-
-# Get rid of Javascript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
-#
-s|(<script.*)document\.referrer(.*</script>)|$1"Not Your Business!"$2|Usg
-
-# The status bar is for displaying link targets, not pointless blahblah
-#
-s/status='.*?';*//ig
-
-# Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
-#
-s/(<body .*)onunload(.*>)/$1never$2/iU
-
-
-#################################################################################
-#
-# content-cookies: Kill cookies that come in the HTML or JS content
-#
-#################################################################################
-FILTER: content-cookies Kill cookies that come in the HTML or JS content
-
-# JS cookies, like found on privacy.net:
-#
-s|(document\.cookie)([ \t\r\n]*=)|documenZapCooky$2|g
-
-# HTML cookies:
-#
-s|<meta\s+http-equiv=['"]?set-cookie['"]?\s+content=[^>].*>|<!--no cookies here -->|iUT  
-
-
-##################################################################################
-#
-# no-popups: Kill all popups in JS and HTML
-#
-#################################################################################
-FILTER: no-popups Kill all popups in JS and HTML
-
-s/window\.open\(/1;''\.concat\(/ig           # JavaScript
-s/target=['"]?_blank['"]?/target_crunched/ig # HTML
-s/target=['"]?_new['"]?/target_crunched/ig   # HTML
-
-#################################################################################
-#
-# frameset-borders: Give frames a border and make them resizable
-#
-#################################################################################
-FILTER: frameset-borders Give frames a border and make them resizable
-
-s/(<frameset [^>]+)framespacing=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frameset [^>]+)frameborder=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frame [^>]+)border=['"]?(no|0)['"]?(.*>)/$1$3/igU
-s/(<frame [^>]+)resizable=['"]?(no|0|false)['"]?(.*>)/$1$3/igU 
-
-#################################################################################
-#
-# webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-#
-#################################################################################
-FILTER: webbugs Squish WebBugs (1x1 invisible GIFs used for user tracking)
-
-s/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/sig
-
-
-#################################################################################
-#
-# no-refresh: Kill automatic refresh tags (for dial-on-demand setups)
-#
-#################################################################################
-FILTER: no-refresh Kill automatic refresh tags (for dial-on-demand setups)
-
-s/<meta\s+http-equiv=['"]?refresh['"]?\s+content=['"]?[0-9]*;\s+url=([^>]*)['"]?>/<link rev="x-refresh" href=$1>/iU   
-s/<meta\s+http-equiv=['"]?page-enter['"]?\s+content=[^>].*>/<!--no page enter for me-->/iU 
-
-
-#################################################################################
-#
-# fun: Text replacements for subversive browsing fun!
-#
-#################################################################################
-FILTER: fun Text replacements for subversive browsing fun!
-
-s/microsoft(?!.com)/MicroSuck/ig
-
-# Buzzword Bingo (example for extended syntax)
-#
-s* industry[ -]leading \
-|  cutting[ -]edge \
-|  award[ -]winning # Comments are OK, too! \
-|  high[ -]performance \
-|  solutions[ -]based \
-|  unmatched \
-|  unparalleled \
-|  unrivalled \
-*<font color=red><b>BINGO!</b></font> \
-*igx
-
-
-#################################################################################
-#
-# nimda: Remove Nimda (virus) code
-#
-#################################################################################
-FILTER: nimda Remove Nimda (virus) code
-
-s%<script language="JavaScript">(window\.open|1;''\.concat)\("readme\.eml", null, "resizable=no,top=6000,left=6000"\)</script>%<br><hr><font size=7><b>Internet J</b></font><b><font size=6>UNK</font><font size=5 color="red"><i>BUSTER</i></font></b><font size=7> WARNING: This Server is infected with <a href="http://www.cert.org/advisories/CA-2001-26.html">Nimda</a>!</font>%g
-
-
-#################################################################################
-#
-# banners-by-size: Kill banners by size
-#
-#################################################################################
-#
-# Standard banner sizes taken from http://www.iab.net/iab_banner_standards/bannersizes.html
-#
-# Note: Use http://config.privoxy.org/send-banner?type=trans for a transparent 1x1 image
-#       Use http://config.privoxy.org/send-banner?type=pattern for a grey/white pattern image
-#       Use http://config.privoxy.org/send-banner?type=auto  to auto-select.
-#
-#################################################################################
-FILTER: banners-by-size Kill banners by size
-
-s|<img\s+[^>]*?(width=['"]?468\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?234\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?88\D)[^>]*(height=['"]?31[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?90[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?60[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?160\D)[^>]*(height=['"]?600[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?125\D)[^>]*(height=['"]?125[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?240[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?180\D)[^>]*(height=['"]?150[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?300\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?250\D)[^>]*(height=['"]?250[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?240\D)[^>]*(height=['"]?400[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-s|<img\s+[^>]*?(width=['"]?336\D)[^>]*(height=['"]?280[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-
-# One more. (Where is 200x50 from?)
-#
-s|<img\s+[^>]*?(width=['"]?200\D)[^>]*(height=['"]?50[^>]*?)>|<img src=http://config.privoxy.org/send-banner?type=auto $1 $2>|sig
-
-
-#################################################################################
-#
-# crude-parental: Crude parental filtering?  (Use along with a suitable blocklist).
-#                 Shows how to deny access to whole page based on a keyword.
-#
-#################################################################################
-#
-# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words)
-# (Note #2: Is 'sex' a rude word?!)
-#
-#################################################################################
-FILTER: crude-parental Crude parental filtering (demo only)
-
-s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body><h3>Blocked due to possible adult content. Please see <a href="http://dmoz.org/Kids_and_Teens/">this site</a>.</h3></body></html>%is
-s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is
-
-############################################################################## 
-#
-#  Revisions   :
-#     $Log: default.filter,v $
-#     Revision 1.4  2002/03/26 22:29:54  swa
-#     we have a new homepage!
-#
-#     Revision 1.3  2002/03/24 16:08:03  jongfoster
-#     Fixing banners-by-size for new config URLs
-#
-#     Revision 1.2  2002/03/24 13:02:18  swa
-#     name change related issues.
-#
-#     Revision 1.1  2002/03/24 11:37:39  jongfoster
-#     Name change
-#
-#     Revision 1.24  2002/03/16 20:39:54  oes
-#      - Added descriptions to the filters so users will know what they select in the cgi editor
-#      - Added content-cookies filter
-#      - Bugfixed many jobs (Thanks to Al for some hints)
-#
-#     Revision 1.22  2002/03/12 13:42:50  oes
-#     Fixing & Optimizing REs
-#
-#     Revision 1.21  2002/03/12 11:59:20  oes
-#     Beefed up Buzzword Bingo
-#
-#     Revision 1.20  2002/03/12 01:42:50  oes
-#     Introduced modular filters
-#
-#     Revision 1.19  2002/03/10 19:49:24  oes
-#     Added expression to kill referer tracking in JavaScripts
-#
-#     Revision 1.18  2002/03/08 17:14:12  oes
-#     PNG -> image in comments
-#
-#     Revision 1.17  2002/03/07 03:50:54  oes
-#     Adapted comments to new built-in images
-#
-#     Revision 1.16  2002/02/21 00:12:19  jongfoster
-#     Modifying the banner regexps to use long URLS and to autodetect
-#     whether to show a logo or a transparent GIF, based on actionsfile
-#     setting.
-#
-#     Revision 1.15  2001/12/28 23:54:20  steudten
-#     Fix for feature Req #495374: http-equiv problem
-#
-#     Revision 1.14  2001/12/09 18:55:11  david__schmidt
-#     Updated CODE_STATUS to beta, commented out microsuck line in re_filterfile
-#     for 2.9.10 beta
-#
-#     Revision 1.13  2001/10/13 13:11:20  joergs
-#     Fixed WebBug filter.
-#
-#     Revision 1.12  2001/10/07 15:46:42  oes
-#     Followed Guy's proposal to change the document.cookie job
-#
-#     Revision 1.11  2001/09/21 12:34:00  joergs
-#     Added filter to replace "Nimda" code by a warning.
-#
-#     Revision 1.10  2001/07/20 11:04:26  oes
-#     Added Rodneys javascript cookie filter
-#
-#     Revision 1.9  2001/07/13 14:03:48  oes
-#     Elimiated yet another bug in the banner-by-size jobs. Shame on me!
-#
-#     Revision 1.8  2001/06/29 13:34:00  oes
-#     - Added explanation for U and T options
-#     - Added hint on image replacement by CGI call
-#     - Fixed bug in banner-by-size jobs
-#
-#     Revision 1.7  2001/06/19 14:21:56  oes
-#     Fixed microsuck line
-#
-#     Revision 1.6  2001/06/09 14:01:57  swa
-#     header. cosmetics. default: no messing ala microsuck.
-#
-#
-# 
diff --git a/doc/.gitignore b/doc/.gitignore
deleted file mode 100644 (file)
index 769562f..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-man
-text
diff --git a/doc/USER_DOC_IS_WIDELY_OBSOLETED b/doc/USER_DOC_IS_WIDELY_OBSOLETED
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/changes.txt b/doc/changes.txt
new file mode 100644 (file)
index 0000000..6aa1482
--- /dev/null
@@ -0,0 +1,991 @@
+This file contains details of the changes made to JunkBuster, in
+chronological order.  Scroll down to the bottom for the newest 
+additions!
+
+
+*****************************************************************************
+* Copied from old README                                                    *
+*****************************************************************************
+
+README for the Internet Junkbuster Proxy (TM) Copyright 1997-8 Junkbusters Corp.
+
+   Id: README,v 1.1 2001/04/16 21:10:38 rodney Exp 
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2 of the License,
+   or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+   See the GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+The version of the code with this makefile is Version 2.0.2.
+No CHANGES file is included here; for a history of previous versions see
+   http://www.junkbusters.com/ht/en/ijbdist.html#previous
+This version tightens security over 2.0.1; some multi-user sites will need
+to change the listen-address in the configuration file (see previous URL).
+
+For installation on Windows see http://www.junkbusters.com/ht/en/ijbwin.html
+An executable is provided so you don't need nmake or a C compiler.
+
+For UNIX and other systems see the FAQ. If you just want to test it with its
+defaults of simply stopping cookies and private info, all you need to do now
+on most Unix systems is type make, run junkbuster & and configure your browser.
+
+This directory should contain the following files.  The .html files are also
+in http://www.junkbusters.com/ht/en/ and http://internet.junkbuster.com
+You are welcome to publish copies of the .html files on your local web server,
+according to the GNU General Public License.
+
+gpl.html GNU General Public Licence
+junkbstr.exe   Executable (binary) for Windows 95/NT
+Makefile A very bland Makefile; Most versions of Unix except HP & Suns
+      compile without change. Windows requires the changes indicated.
+ijbman.html Manual for the Internet Junkbuster, HTML format
+junkbuster.1   Manual for the Internet Junkbuster, man macro format:
+         man ./junkbuster.1 # or nroff -man junkbuster.1 | more
+ijbfaq.html FAQ: Frequently Asked Questions on the Internet Junkbuster
+      Includes installation instructions
+junkbstr.ini   Sample configuration file with almost all options commented out
+sblock.ini  Sample blockfile (which doesn't really block much, see FAQ)
+scookie.ini Sample cookiefile (permits little; you decide who to trust)
+saclfile.ini   Sample access control file (block access to everyone)
+sforward.ini   Sample forwardfile (does no fowarding, no gateways, so SOCKS)
+strust.ini  Sample trustfile (has no trusted sites and blocks nothing)
+conn.c, bind.c, encode.c, loaders.c, parsers.c, ssplit.c   Various utilities
+socks4.c Code for SOCKS4 and SOCKS4A gateways
+jcc.c    The main program
+jcc.h    #included declarations etc
+gnu_regex.c, gnu_regex.h:  Regular expression code from the FSF, not us.
+win32.c     A few lines of code specific to the Windows version (95 & NT)
+acl.c    Access controls (new in version 2.0) - doesn't replace firewalls
+filters.c   Strings for the presentation of messages to user
+
+If you find that the Internet Junkbuster improves the quality of your life
+online, we hope you'll visit http://www.junkbusters.com to see how our free
+services can help you bust other kinds of junk out of your life:
+junk mail, spam, telemarketing, and invasions of your private data.
+And please tell your friends about this free product, and help them set it up.
+
+If your company finds this software useful in protecting its confidential
+information and making its people happier and more productive, please consider
+purchasing one of our our commercial support packages:
+   http://www.junkbusters.com/ht/en/ijbfaq.html#commercial
+
+We don't advertise, so please tell others in your community about us.
+
+Junkbusters Corp.    http://www.junkbusters.com
+
+
+*****************************************************************************
+* Copied from old README.too                                                *
+*****************************************************************************
+
+Id: README.TOO,v 1.1 2001/04/16 21:10:38 rodney Exp
+
+This is the README.TOO file for Stefan's version of the Internet
+Junkbuster (from http://www.waldherr.org/junkbuster/).
+
+
+
+Installation:
+-------------
+Install the RPM with the usual command `rpm -Uvh foobar.rpm'. Since we
+run the Junkbuster as user `nobody', cd to a directory where `nobody'
+has read access (in particular NOT /root) and issue (as root)
+
+   /etc/rc.d/init.d/junkbuster start
+
+This will be done automagically for you any time you boot your machine.
+
+
+
+Configuration:
+--------------
+To let Junkbuster take `care' of the ads, you have to setup your
+browser to use the Junkbuster.
+
+  Short instructions for the advanced user:
+
+   Configure Netscape to use 127.0.0.1 on port 8000 as 
+        a proxy server.
+
+  Detailed instructions for the beginner:
+
+        Remove Internet Explorer and install Netscape. No `real' 
+        user would ever use MSIE. Though the Junkbuster works 
+        with IE as well. Read 
+        http://www.junkbusters.com/ht/en/ijbfaq.html#browser
+
+Check to see if the Junkbuster works correctly by surfing to
+
+   http://127.0.0.1/show-proxy-args
+
+or any other place and add the text `/show-proxy-args' to the URL.
+Ok? Then enjoy your ad-free surfing.
+
+
+
+Mailinglists:
+-------------
+In case you are interested in the Junkbuster, there are two
+mailinglists (junkbuster-users and junkbuster-announce). Instructions
+on how to subscribe and unsubscribe are at
+
+   http://www.waldherr.org/junkbuster/
+
+Bugs:
+-----
+Please fill out
+
+   http://sourceforge.net/bugs/?func=addbug&group_id=11118
+
+Patches:
+--------
+Please fill out
+
+   http://sourceforge.net/patch/?func=addpatch&group_id=11118
+
+Need Help?
+----------
+Please fill out
+
+   http://sourceforge.net/support/?func=addsupport&group_id=11118
+
+
+Comments:
+---------
+I would greatly appreciate feedback for this program. Send comments to
+Stefan Waldherr <stefan@waldherr.org> (in either German or English). I
+prefer plain text. If you happen to see an ad which got thru the filter
+PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/.
+
+Have fun,
+Stefan.
+
+
+*****************************************************************************
+* Copied from old README.win                                                *
+*****************************************************************************
+
+$Id: README.WIN,v 1.1 2001/04/16 21:10:38 rodney Exp $
+
+This is the README.WIN file for the Windows version of the Internet
+Junkbuster (from http://www.waldherr.org/junkbuster/).
+
+Installation:
+-------------
+Congrats, since you are reading this file, you have already unzipped
+the archive correctly.
+
+Start the Junkbuster with `junkbstr' (i.e., click on the icon in the
+ijb subdirectory). If you want to start Junkbuster automatically,
+make a link to the program in the `Autostart' folder.
+
+
+
+Configuration:
+--------------
+To let Junkbuster take `care' of the ads, you have to setup your
+browser to use the Junkbuster.
+
+  Short instructions for the advanced user:
+
+   Configure Netscape to use 127.0.0.1 on port 8000 as 
+        a proxy server.
+
+  Detailed instructions for the beginner:
+
+        Remove Internet Explorer and install Netscape. No `real' 
+        user would ever use MSIE. Though the Junkbuster works 
+        with IE as well. Read 
+        http://www.junkbusters.com/ht/en/ijbfaq.html#browser
+
+Check to see if the Junkbuster works correctly by surfing to
+
+   http://127.0.0.1/show-proxy-args
+
+or any other place and add the text `/show-proxy-args' to the URL.
+Ok? Then enjoy your ad-free surfing.
+
+
+
+Mailinglists:
+-------------
+In case you are interested in the Junkbuster, there are two
+mailinglists (junkbuster-users and junkbuster-announce). Instructions
+on how to subscribe and unsubscribe are at
+
+   http://www.waldherr.org/junkbuster/
+
+Bugs:
+-----
+Please fill out
+
+   http://sourceforge.net/bugs/?func=addbug&group_id=11118
+
+Patches:
+--------
+Please fill out
+
+   http://sourceforge.net/patch/?func=addpatch&group_id=11118
+
+Need Help?
+----------
+Please fill out
+
+   http://sourceforge.net/support/?func=addsupport&group_id=11118
+
+Comments:
+---------
+I would greatly appreciate feedback for this program. Send comments to
+Stefan Waldherr <stefan@waldherr.org> (in either German or English). I
+prefer plain text. If you happen to see an ad which got thru the filter
+PLEASE use the `contribute' form at http://www.waldherr.org/junkbuster/.
+
+Have fun,
+Stefan.
+
+
+*****************************************************************************
+* Copied from old README.re_filter                                          *
+*****************************************************************************
+
+DISCLAIMER:
+   This is pre-alpha code. Using it in any other way
+   than just reading it is a high risk activity and
+   the author disclaims all liability for any damage.
+
+   See the GNU General Public License at
+   http://www.gnu.org/copyleft/gpl.html for details.
+
+
+Dear alpha-Tester,
+
+Thank you for trying out the experimental re_filter feature of
+Junkbuster. As this is still a very early pre-release version,
+and I'm neither much of an autoconf or make wizard, building
+the patched junkbuster involves some manual work, that is 
+described below. Please also see the Request for Thoughts section,
+as the whole point of this pre-release ist to collect ideas for
+improvement and bug reports.
+
+
+INSTALLATION:
+
+  - Get and install pcre from
+    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
+    Version 3.1 or any later one will do. I recommend 3.4.
+    It *should* install on Win32 as well, but I haven't tried
+    that. Don't forget to run ldconfig afterwards.
+
+  - Now you have two options:
+
+    A) Install pcrs as a shared library:
+       pcrs.c and pcrs.h are included in the (patched) ijb subdirectory.
+       1.) patch Makefile < Makefile.re_shared.diff  
+       2.) gcc -Wall -fPIC -c pcrs.c  
+       3.) gcc -shared -Wl,-soname,libpcrs.so.1 -o libpcrs.so.1.0.1 pcrs.o -lc -lpcre
+       If this worked OK,
+       4.) copy libpcrs.so.1.0.1 to /usr/local/lib
+       5.) ln -s /usr/local/lib/libpcrs.1.0.1 /usr/local/lib/libpcrs.so
+       6.) ldconfig (Or whatever the equivalent on your platform might be)
+       7.) cp pcrs.h /usr/local/include
+
+    OR
+
+    B) Incorporate pcrs into the junkbuster (much easier):
+       Smile and relax. You're done.
+
+  - Edit the provided re_filterfile to suit your needs and place it
+    with the rest of junkbusters configfiles.
+
+  - Now junkbuster should build with a simple 'make'.
+    Note: Setting debug = REF in jcc.c will enable debugging
+    for the re_filter.
+
+  - Include a line "re_filterfile <wherever>" in your junkbuster
+    config file, pointing at the re_filterfile
+
+  - (Optional:) Include a line "re_filter_all" in the config
+    file. This will set the Policy to filter content from all sites.
+    Default is to filter only from sites that you wouldn't send a
+    cookie either. 
+
+  - Fire up junkbuster.
+
+HOW IT WORKS:
+
+    Nah, not tonight anymore ;-)
+
+REQUEST FOR THOUGHTS:
+
+  - The main decision is whether to filter on-the-fly or to buffer
+    up the whole document and then run the filter on it. I've built
+    both versions and currently prefer buffering.
+
+    The advantage of on-the-fly-filtering is obviously that the
+    document begins to display before it's fully loaded. The big
+    disadvantage is that with arbitraty content altering in place,
+    you don't know the size that the document will have after
+    altering when the Content-Length Header is to be sent. Only
+    option is to chew it altogether.
+
+    Apart from preserving the ability to generate a valid Content-Length
+    header (which the patch currently does not yet do), buffering up
+    the document has some advantages from the filtering point of view:
+
+     - Reliability. Patterns in the document cannot be ripped apart
+       and are reliably found. (If you look at the document fragment-wise
+       while it's being transmitted, you miss any pattern that spans
+       a fragment border) This is especially bad for patterns that do
+       serious HTML reformatting, as fragments are typically in the order
+       of 1500 bytes each.
+
+     - Flexibility: The re_filter gives you the choice whether you want
+       to replace only the pattern's first occurance or replace it globally.
+       This becomes meningless with fragments. (Solution possible, though.)
+
+    As the filter only processes objects of MIME type text/*, which are typically
+    rather small compared to binary multimedia (sic) type data, I don't think
+    that the disadvantage of delayed display of the first bytes is really grave.
+
+    What do you think?
+
+  - Is the choice between a radical (filter all) and semi-smart (filter only when
+    also crunching cookies) flexible enough? Should I really introduce yet another
+    configfile for specifying the domains to filter content from? Would anyone use
+    that?
+
+  - Should I use pcre as a shared library and work out a nice installation
+    automagic, or should the relevant functions be incorporated in re_filter.c?
+
+  - Even if yes, do we really want an extension that relies on an external library
+    like pcre?
+
+  - Any bugs, stupid parts in the code ?
+
+  - Cool suggestions for the re_filterfile? (PLEASE!)
+
+  - Should character set translation along the lines of Perl's 'tr' operator
+    be included?
+
+  - Is the whole feature just pathetic?
+
+FEEDBACK:
+
+    A whole lot of work has gone into this feature (the pcrs code was also
+    just written for this) and I'd really like to know if and how you like
+    it. Since I'm more of a perl than C programmer (and after doing so much
+    string manipulation in C I'm once again glad abaout that!), I'm sure there
+    is much to improve. Please send any suggestions/observations/hellos to
+    oes@paradis.rhein.de. I would also be very glad about any assistance for
+    a autoconf/make procedure for prcs.
+
+Well, have fun!
+--Andreas
+
+
+*****************************************************************************
+* Copied from old README.cygwin                                             *
+*****************************************************************************
+
+Id: README.cygwin,v 1.2 2001/04/29 23:16:29 rodney Exp
+
+
+What I did:  I saw too many "personalities" in IJB; so I
+ran the code through a couple of regexp's and then let XEmacs
+reformat the whole shebang!  The results is a uniform
+looking code base; aka. as if 1 person created the whole
+project.
+
+Why I did it:  (1) it is easier to maintain  (2) easier for
+a new person to make changes/additions  (3) it *looks* more
+professional  (4) IMHO, it is easier to read (this is very
+much a personal preference).
+
+What I propose: A IJB standards list be included in the
+distro and all source/patch checkins be checked for
+compliance.  We don't need to be an arse on this point, but
+submitters should make a valiant attempt to support the
+standards.
+
+Note: do not even try to diff my code with another code
+base, you will be overwhelmed.  After all, the regexps did a
+good bit of changing and XEmacs reformatter did a great deal
+more.
+
+One more note: these changes include conditional compilation for
+un?x (namely Linux), cygwin (un?x like compile for WIN32), and
+mingw32 (WIN32 like compilation w/o VC++).  Right now, all seems
+fully functional except cygwin.  The cygwin compile will work,
+but includes code to make it single threaded.  I need to debug
+the fork issues, but that will have to come later.
+
+
+Specific changes to expect:
+
+
+1: I've majorly reworked the Makefiles.  The existing Makefile was
+too *spaghetti* for me!  For one, I eliminated the "-I." from the
+include path (ugly).  Use #include "" for local directory files
+and #include <> for path found files (that's basic even to c).
+
+
+2: In accordance with #1, I changed #include "windows.h" to
+#include <windows.h> and #include <gnu_regex.h> to #include
+"gnu_regex.h".
+
+
+3: As part of my standards suggestions (to come later in this
+file), I added a standard comment block to every function.  There
+were too many functions with *no* comment and about 20 different
+styles to those that did.  This is an example of the block I used:
+/*********************************************************************
+ *
+ * Function    :  block_acl
+ *
+ * Description :  Block this request?
+ *                Decide yes or no based on ACL file.
+ *
+ * Parameters  :
+ *          1  :  src = Address the browser/user agent is requesting.
+ *          2  :  dst = The proxy or gateway address this is going to.
+ *          3  :  csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns     : 0 = FALSE (don't block) and 1 = TRUE (do block)
+ *
+ *********************************************************************/
+
+
+4: Some files prototyped like this:
+      void
+      func(param1)
+      int param1;
+      {
+      }
+and other like this:
+      void func(int param1)
+      {
+      }
+I made all look like the second.
+
+
+5: Made:
+      if(  to be  if (
+      while(  to be  while (
+      switch(  to be switch (
+      etc ...
+The former looks too much like a function call.
+
+
+6: Put braces on their own line and aligned under the
+reserved word:
+      if () {
+      } else {
+      }
+to be:
+      if ()
+      {
+      }
+      else
+      {
+      }
+The same for while, do, etc...
+
+
+7: Casted malloc in several places, e.g.:
+      p = malloc(n);
+to be:
+      p = (char *)malloc(n);
+This eliminates compiler warnings.
+
+
+8: Applied the Perl regexp patch and made it fully conditionally
+compiled (-DPCRS=TRUE).
+
+
+9: It *appears* that if MINGW32 sees a "main" function, it will
+try to link it and start with main (ala console mode).  Since I
+need MINGW32 to find WinMain instead, I conditionally changed
+"main" to "_main" (for MINGW32 only!).
+
+
+10: Changed popup.c to be killpopup.c.  This was necessary to
+clean up the Makefile.  Since there was an ini type file called
+"popup" and "popup.c", make got confused on target names.  No
+other ini file has a .c file with the same name, so I hope this
+isn't a big deal.  Plus, it fits its config variable
+(kill_all_popups) much better.
+
+
+11: Added:
+  /*
+    Local Variables:
+    tab-width: 3
+    end:
+  */
+to all .c and .h files.  I use 3 character tabs and this will make
+the files display correctly in Emacs editors.  This is just my
+default setting.  Perhaps I will filter all files via "expand
+-t3", so not to pi$$ everyone off.  Vi is capable of using 3
+character tabs, as I am sure VC++ would be.
+
+
+12: Several places included regexp code with out "#ifdef REGEX"
+which broke the ability to compile w/o regexp's.  I fixed the code
+and can compile w/o regexp (which I don't normally do, but now I
+*can*).
+
+
+13: In WinMain, changed:
+      pszLastTok = strchr(pszLastTok, ' ');
+to be:
+      pszLastTok = strchr(pszLastTok+1, ' ');
+The former causes an infinite loop with 2 or more parameters.
+
+
+14: Added my own strdup for Cygwin, see jcc.c for why.
+
+
+15: Added defines in the Makefile and this to jcc.h:
+      #define VERSION VERSION_MAJOR "." VERSION_MINOR "." VERSION_POINT
+This makes "update the numbers also in jcc.h manually" unnecessary
+(see your Makefile for this quote).
+
+
+16: Split the "inifiles" target in Makefile into separate targets,
+this way each file can be regenerated individually according to
+the same implicit rule.
+
+
+17: With the Makefile restructure, I can only provide for
+Cygwin/gcc.  Hopefully this is a bit cleaner and others can add
+their compilers w/o re-spaghetting the file.  I have provided
+several makefiles as examples only, I do not intend for the
+project to start maintaining multiple Makefiles.  Perhaps some of
+the platform specific Makefile code could be split out into
+separate files and we could use the "include" directive to read in
+the correct one.
+
+Better than this, let's get a configure.in guru on the project and
+dynamically create the Makefiles!
+
+
+18: In an effort to get this to market (you knew this was coming
+eh?), I am going to put the standards suggestions in another file
+and ship this one as is.  But then, you can probably guess most of
+the standards by the changes you see.
+
+
+19: Added a really quick and dirty "install" target to the
+Makefile.  This needs to be cleaned up and proper directories put
+in for each platform.
+
+
+-- release 1 (obsoleted) --
+
+
+20: Incorporated the TOGGLE and webDAV support patches into my
+Cygwin patch.  I added conditional compilation to both features.
+I changed "extern BOOL g_bToggleIJB;" to be of type "int".  This
+makes jcc.h independent of "windows.h".  The inclusion of such
+should not (and is not) necessary for compilation on all
+platforms.  Besides, BOOL is really only a char or an int anyway!
+
+
+21: Added a new ini!  I modified the usual un?x type config file
+to M$ type ini file for a Perl regexp compile.  This was necessary
+to call EditFile on the Perl regexp config file.  The new ini
+filename is "sregexp.ini" (naturally).  I then added menu items to
+edit the popup.ini and sregexp.ini files.
+
+
+22: I made "dot h" files for all the "dot c" files.  I used this
+command to do the *dirty* work:
+    grep -e "^[A-z]" *.c | sed -e "/=/d" -e "/^[^(]*$/d" \
+         -e "/^extern/d" -e "/^static/d" -e "/;$/d"
+
+And I made each "dot h" file be immune to multiple inclusion via
+conditional compilation.  Ie. the "jcc.h" file will only include
+itself if _JCC_H is undefined.
+
+After this was done, I compiled the project source by source and
+let the compiler tell me what each file was dependent on.  Once I
+got all the objects to compile, I included the new dependencies in
+the Makefiles.
+
+BTW, I intend to get the Makefile to be generated by a configure
+script.  Whether this is a GNU "configure.in" type file or a shell
+script, I do not know.  All I do know is that this is a must for a
+"Go/No go" type decision.  We cannot proceed with the philosophy
+"leave it up to the user to get it to work".
+
+
+23: I broke out the code to load the config file from main.  I put
+this code into a function called load_config.  I made this routine
+be called from a signal "HUP".  This means we can restart
+junkbusters from the command line or from the daemon script via
+"restart" without actually killing it and restarting it.  This is
+common behavior to un?x daemons (see inetd for example).  I fixed
+the junkbusters.init script to take advantage of this.  I intend
+to make a M$ menu complement to this as soon as I can.
+
+
+24: BTW, if you have not already noticed by my postings and/or
+code, I have added patches and made them all conditionally
+compiled.  Ie. #ifdef TOGGLE, #ifdef WEBDAV, #ifdef PCRS, etc...
+I think that all extensions to IJB should be submitted in this
+way.  Not only can you compile IJB to be as "tight" as you want,
+it also gives the user a "smorgasbord" of options to
+choose from.  This is quite common in the free software world (you
+need look no farther than emacs to see this) and provides maximum
+flexibility.
+
+
+25: As promised, I obsoleted the "ijbw32.ini" file.  I was a bit
+confused by the "close-behaviour=1" entry.  It seems to me that it
+duplicated the "close-button-minimizes=1" entry.  And (by looking
+at the code) it was unused.  Anyway, I eliminated the "ijbw32.ini"
+file and assimilated the settings into the config file.  Bye Bye
+"ijbw32.ini", hello "config" (aka. don't unnecessarily duplicate
+files and/or data types).
+
+
+26: Eliminated re_filter.c.  This only defined
+(un)load_re_filterfile and re_process_buffer.  I moved
+(un)load_re_filterfile to loaders.c and re_process_buffer to
+filters.c. I also modified the Makefiles to reflect this.  In the
+doing, I modified the loader and unloader to use the "files"
+variable and moved joblist to "re_filterfile_spec" struct.  I
+added "plist" to the client_state so that all Perl regexp code
+could find the latest parsing of the re_filterfile ini.
+
+This is in keeping with the IJB data structures philosophies.
+
+
+27: Eliminated acl.c.  This (as pcre) only defined
+(un)load_aclfile and block_acl.  I moved (un)load_aclfile to
+loaders.c and block_acl to filters.c.  I also modified the
+Makefiles to reflect this.
+
+
+28: Since I created "dot h" files for all the "dot c" files, I
+eliminated all the "extern ...variable;" and all the "extern
+...function;" statements that I could find in the "dot c" files.
+Instead, I included the proper "dot h" files to do this for us.
+
+
+29: Corrected the "install" Makefile target for un?x.  I will do
+the same for WIN32 targets.
+
+
+30: Note on the "TOGGLE" patch: since I made IJB fully restartable
+via a NOHUP signal; I thought the TOGGLE patch should apply to
+both un?x and WIN32.  Thus, I eliminated the WIN32 dependencies in
+that patch and added "toggle" to the config file.  Now everything
+works fine for either platform.  Still to come is a restart menu
+command in WIN32 (See: note 23).
+
+
+31: Just a possible programmer note, we REALLY need a generic
+linked list module.  Since text lists, client states, filter
+files, etc... implement list creation and destruction over and
+over; I suggest a generic list that can handle *any* type of list
+(ala template classes in C++).  If this module included an
+iterator (of sorts), we could eliminate the myriad of "for ( top=x;
+NULL != x->next; x=x->next )" type statements that are all over
+IJB.
+
+After all, this was taught in the basic "Intro to Data Types"
+class (for all you CS majors).
+
+
+32: Renamed all of the .INI files to be .TXT files.  I did this
+because the .INI files were NOT *really* ini files; which
+potentially be confusing.  I used the .TXT extension to make sure
+that EditFile still worked.
+
+
+33: Removed the "initialed comments", such as "/* swa */".  This
+leads to less readable code (because it becomes fragmented) and
+retains the "multiple personality" syndrome.  Comments such as
+this can always be figured out from the versioning system.  Also,
+these comments really should be pooled in one place : the README
+files.
+
+
+34: Perhaps we should break with the current versioning tactic of 
+a "tail version" and start fresh.  Perhaps a new major version
+release is in order?  Version = 3.0.0?
+
+
+35: Added a "Accept-Encoding: gzip" cruncher.  If a stream is
+compressed via gzip (Netscape specific I think), then it cannot
+be modified with Perl regexps.  So I added this as an option in
+the Makefiles.
+
+
+36: As promised in one of my postings, I have make a
+configure-esk script to generate the Makefiles.  I would still
+like to have a full blown configure.in compatible system, but this 
+will do in the meantime.  Note: this configure script covers
+linux, cygwin, and mingw32.  At this point I do not have VC++ to
+test any of my changes.  But the configure script should be
+flexible enough to handle this platform.
+
+
+--
+
+Please give any feedback to the ijb egroups and, if you feel you
+need quicker contact, CC me at IwantToKeepAnon@yahoo.com
+
+Let me say once more, this has a *lot* of changes and may (aka
+WILL) break a lot of existing patches.  But I hope the "idea" will
+catch on.  Perhaps this could be made the baseline code base and
+other patches added and standardized later.
+
+*****************************************************************************
+* Date:        7 May 2001                                                   *
+* Version:     ??                                                           *
+* Description: Changes for MS Visual C++                                    *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+(Based on Stromlund's version 0.20)
+
+I have made several changes to make this compile under VC++ 97, and add new
+features.
+
+Code changes:
+
+1) If you disable IJB (using the TOGGLE patch) it now turns PCRS off.
+2) "Missing function prototype" warnings have been corrected by adding
+   appropriate #include statements
+3) The _DIST_URL define removed and hardcoded.  There are hardcoded URLs all 
+   over the place that need fixing - one more doesn't matter.  We do really 
+   need to come up with a long-term solution though.  (Suggestion: Host a 
+   redirector on the SourceForge web space.  e.g 
+   "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=faq",
+   "http://ijbswa.sourceforge.net/redirect.php?ver=2.0.2-10&target=download",
+   etc.  This allows us to move the pages around easily, and the SourceForge
+   space can be maintained by anyone who's interested, it's not tied to a 
+   particular individual.  This is similar to the approach taken by 
+   Microsoft and Netscape in their browsers.)
+4) New file ijbconfig.h is #included everywhere.  This provides me with a
+   place to define VERSION, PCRS, etc.  You can still define VERSION_xxx
+   on the command line, but the other defines are in the header file.
+   There were just too many #defines - so many that the VC++ 97 IDE 
+   broke when I tried to define them on the command line.  We probably 
+   should fix the configure script so that it modifies this file.
+5) Deleted empty file afxres.h - we needed to use the VC++ system header 
+   file of that name.  However, it's easier to just delete it and put 
+   the relevent #defines in w32res.h.
+6) New #define: NO_PROGRAM_NAME_DISPLAY uses "IJB" as the program name in 
+   the log file instead of "H:\Documents and Settings\Administrator\My 
+   Documents\Prog\VC\ijb2\Release\junkbuter.exe" or similar.  The reason 
+   for this should be obvious!
+7) New #define: STATISTICS enables the statistics feature
+8) Statistics is thread-safe, I think.  However, loading up the
+   statistics page now counts as a blocked request.
+9) New, shorter message if a setting in the config file is recognised 
+   but unsupported by the current build.  It doesn't have "WARNING:" in
+   front of it either.  We may want to actually take this message out 
+   and have it just silently ignore these entries.
+10) New feature: #define SPLIT_PROXY_ARGS and the show-proxy-settings 
+    page will split each file out to a seperate page.  This is 
+    because the files are quite big, and having to do 1 extra click to 
+    get to them is no problem.  This #define also disables the 
+    suppress_blocklists feature (because I believe the original intent 
+    of suppress_blocklists was similar?).  It also saves memory by 
+    reading the config files to generate the HTML on the fly, rather 
+    than storing prepared HTML constantly in memory.
+11) Marked global constants with "const" attribute.  This has a 
+    knock-on effect on pointers in function prototypes, so these have
+    also been marked const where needed.
+12) Rewrote encode.c to have tables pre-initialized, so it can be 
+    marked constant.  Also split into 3 distinct functions so that
+    the tables (which are realy an implementation detail) are not
+    visible outside that file.
+13) Changes to how files are reloaded when you reload the config 
+    file.  Previous method didn't free memory (or if you uncommented 
+    the free() calls, it was not thread-safe.)  It is now handled 
+    automatically - files are reloaded whenever the filename to 
+    read changes, or the file's timestamp changes.  The code in
+    loaders.c which handles this test has been moved to a single
+    utility function.
+14) killpopup changes:
+     * Only compiled if you #define KILLPOPUPS
+     * Call to filter_popups() moved from read_socket() to chat().
+     * Writing 1 past end of buffer bug fixed.
+     * It was scanning the whole buffer even if only partially filled.
+     * Moved load/unload to loaders.c and changed file handling to 
+       follow standard.
+15) Auto-detect whether we want an image or HTML implemented for 
+    Microsoft IE.  :-)
+    There doesn't seem to be a way to tell with the latest build 
+    of Mozilla. :-(
+16) Image file code conditionally compiled.
+17) Provided option (SPLIT_PROXY_ARGS) to split the show-proxy-args
+    page into a main page, and then a page for each config file.  
+    This option will also save memory by loading the files when 
+    required for display, rather than saving them in memory when
+    they are initially loaded.
+18) Force page loading ("noijb.") patch applied.  #define FORCE_LOAD
+
+
+Packaging changes:
+
+1) PCRE 3.4 (less it's test and demo programs) is now included in the 
+   pcre directory.  It will be statically linked with Junkbuster.  (On 
+   win32, DLLs cause a lot of hassle - with a library this small it isn't 
+   worth it.  I don't know if it would be better to dynamically link under
+   UNIX?)
+2) junkbustr.dsp and junkbustr.dsw VC++97 project and workspace files are
+   included.
+3) win32build/junkbustr.exe Win32 binary is included.  It should not require
+   any DLLs.  It was compiled with all features supported.
+4) All README.xyz files put together in this file.
+5) Unused files (acl.c, pthread.c, ...) deleted.
+6) My block & cookie files used (based on the Waldherr ones).
+
+Known bug: The Adobe Acrobat 4 plug-in fails when I try to view PDF files in
+MSIE.  Workaround: disable "web browser integration" in the Adobe Acrobat 
+settings.
+
+*****************************************************************************
+* Date:        14 May 2001 (early morning)                                  *
+* Version:     Reported as 2.9.0                                            *
+* Description: Various updates                                              *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+
+1)  Now use PCRE, not GNU REGEX.  I have not yet had chance to check the
+    syntax of the block/image/cookie file to ensure that they match what
+    is expected - however they seem to work.
+2)  Replaced "configure" script with one generated by "autoconf".  Also 
+    use a header "config.h" (was ijbconfig.h in my previous release) for 
+    the #defines.  "config.h" is now generated with "autoheader" from 
+    "acconfig.h" and "configure.in".  (Note that to install you do not
+    need autoconf or autoheader - just run "./configure".)
+    To see command-line options, run "./configure --help".
+    This is my first ever autoconf script, so it has some rough edges
+    (how PCRE is handled is the roughest).
+3)  Error logging code replaced with new module errlog.c, based on the
+    one from JunkBusterMT (but with the threading code removed).
+4)  Most of Rodney's 0.21 and 0.21A patches applied. (Marked *).  I did not
+    apply all of these, since I had already independently done conditional
+    popup file, conditional image file, and integration of popup code.
+5*) ACL, Jar and trust files conditionally compiled.
+6*) New source file headers.
+7*) Various cosmetic changes.  (But I have not consistently ordered the 
+    config files - I think that's worthwhile, but it's 1am and I want to
+    get this released!)
+8*) RCS tags on .h files.
+9)  RCS tags are const char[] rather than const char *.  (Saves 4 bytes
+    per tag ;-)
+10) VC++ project files renamed to vc_junkbuster.*.
+11) show-proxy-args now shows status of all conditionals, not just REGEX
+12) Various functions moved around.  Most notably all the system-specific
+    sockets code which was spread between jcc.c, bind.c, and connect.c,
+    has been moved to "jbsockets.c".  The non-system-specific code from
+    connect.c and socks4.c has been movet to "gateway.c".  Also, the
+    config file loader and the global variables it writes to have been
+    moved to "loadcfg.c".  (Maybe this should go into loaders.c?)
+    And candidate for the "worst filename ever" award is "miscutil.c",
+    which contains, well, miscellaneous utility functions like zalloc.
+    (Suggestions for a better name for this file are welcome!)
+13) Loaders now use a common function to read a line and skip comments,
+    and this function also stores the proxy_args.
+14) Added ./junkbuster --help     (Not for Win32 GUI)
+15) Added ./junkbuster --version  (Not for Win32 GUI)
+16) Win32 resources are now all marked as "U.S. English", rather than
+    being a mix of "U.S. English", "U.K. English" and "Irish English".
+17) Version number changes to 2.9.0
+
+Known bugs:
+- See (1) above about blockfiles.
+- Sending SIGHUP (under Red Hat Linux 7.1) causes a crash.  v0.21A hangs
+  after a SIGHUP.  This needs investigating, but pthreads support will 
+  almost certainly help here, so it may not be worth investigating
+  immediately.
+- Compiling with shared system pcre and pcreposix libraries is supported
+  via a switch to configure, but completely untested.
+
+Please note that there are now 2^14 == 16384 combinations of conditional 
+defines, and 4 major compilers (VC, Linux, mingw32, cygwin) for a total 
+of 65536 different builds.  We cannot possibly test all of them!  My 
+standard build is "everything on", and I've tested that on each compiler,
+along with a few variants.  You may uncover new bugs (probably compiler 
+errors) if you use an exotic combination of switches.
+
+*****************************************************************************
+* Date:        14 May 2001                                                  *
+* Version:     2.9.1                                                        *
+* Description: Various updates                                              *
+* Author:      Andreas S. Oesterhelt <oes@oesterhelt.org>                   *
+*****************************************************************************
+(From his e-mail:)
+
+ - in parsers.c, fixed two #ifdef FORCE to #ifdef FORCE_LOAD
+   (BTW: I think FORCE is precise enough, since loading remote
+   data is the whole purpose of a proxy..)
+ - Set the FORCE_PREFIX (back) to 'IJB-FORCE-LOAD-'. While 'noijb.'
+   is more elegant and looks like a hostname in the URL, it doesn't
+   make clear to the inexperienced user that the proxy is bypassed. It
+   also has a higher name collision risk.
+ - Filled in the function header templates for my functions in
+   parsers.c (again). They obviously got lost in our current
+   patch war ;-)
+ - Cut the credit for the Â§-referrer-option from the config file,
+   that Stefan had placed there.
+ - Improved the re_filterfile 
+
+*****************************************************************************
+* Date:        14 May 2001                                                  *
+* Version:     2.9.2                                                        *
+* Description: FORCE patch (again!)                                         *
+* Author:      Andreas S. Oesterhelt <oes@oesterhelt.org>                   *
+*****************************************************************************
+(These notes written by Jon)
+
+- Andreas applied the latest version of the FORCE patch.
+
+*****************************************************************************
+* Date:        14 May 2001 (late afternoon)                                 *
+* Version:     2.9.3                                                        *
+* Description: Various updates                                              *
+* Author:      Jon Foster <jon@jon-foster.co.uk>                            *
+*****************************************************************************
+
+1) Incorporated updates from current CVS tree, including:
+   - Amiga support (completely untested by me - I don't have an Amiga)
+   - "tinygif 3" support (redirects blocked images to a specified URL, so
+     the browser doesn't have to load and cache many copies of the same
+     image).
+   - one case where there were both local and global "referrer" variables
+     (yuck!) clarified by renaming the local one to "refer".
+   - Fixed some places where close() was used instead of close_socket().
+   Thanks to Jörg Strohmayer (joergs at users.sourceforge.net) for these.
+2) Temporary hack to get FORCE_LOAD to work with IE.  I just lowercased the
+   FORCE_LOAD_PREFIX.  Needs fixing properly.
+3) Most URLs hardcoded into JunkBuster were changed to go through a script
+   e.g. http://ijbswa.sourceforge.net/redirect.php?v=2.9.3&to=faq
+   The only other URLs left are the GNU GPL:
+     http://www.fsf.org/copyleft/gpl.html
+   and the home page:
+     http://ijbswa.sourceforge.net/
+   ... and various URLs which will be intercepted by JunkBuster anyway.
+   TODO: Still need to do something with the URLs in JunkBuster Corp's 
+   copyright/trademark notice on the bottom of the show-proxy-args page.
+4) PCRE or GNU Regex is now a #define option.
+
+*****************************************************************************
+* End of file                                                               *
+*****************************************************************************
+
similarity index 100%
rename from doc/obsolete/fb.gif
rename to doc/fb.gif
index 7c252b5..c980e61 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: gpl.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
@@ -25,7 +25,7 @@ b.dot        { color: #FF0000 }
 \r
   <body bgcolor="#f8f8f0" link="#000078" alink="#ff0022" vlink=\r
   "#787878">\r
-    <p class="sans"><a href="http://www.privoxy.org/">\r
+    <p class="sans"><a href="http://ijbswa.sourceforge.net/">\r
     Website</a> <b class="dot">&middot;</b> <a href="ijbman.html">\r
     Manual</a> <b class="dot">&middot;</b> <a href="ijbfaq.html">\r
     FAQ</a> <b class="dot">&middot;</b> <b>GPL</b></p>\r
@@ -42,7 +42,7 @@ b.dot        { color: #FF0000 }
     mailing list</a> (which includes an archive of mail), the\r
     SourceForge.net <a href=\r
     "http://sourceforge.net/projects/ijbswa/">project page</a>, or\r
-    see the project's <a href="http://www.privoxy.org/">home\r
+    see the project's <a href="http://ijbswa.sourceforge.net/">home\r
     page</a>. Please also bear in mind that versions 2.9.x of\r
     JunkBuster are development releases, and are not production\r
     quality.</b></p>\r
@@ -536,7 +536,7 @@ b.dot        { color: #FF0000 }
     "250" height="15" src="top.gif" alt=\r
     "--- Back to Top of Page ---"></a></p>\r
 \r
-    <p class="sans"><a href="http://www.privoxy.org/">\r
+    <p class="sans"><a href="http://ijbswa.sourceforge.net/">\r
     Website</a> <b class="dot">&middot;</b> <a href="ijbman.html">\r
     Manual</a> <b class="dot">&middot;</b> <a href="ijbfaq.html">\r
     FAQ</a> <b class="dot">&middot;</b> <b>GPL</b></p>\r
similarity index 97%
rename from doc/obsolete/ijbfaq.html
rename to doc/ijbfaq.html
index 3d52247..f9168a6 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: ijbfaq.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
similarity index 97%
rename from doc/obsolete/ijbman.html
rename to doc/ijbman.html
index 8329e57..d810c68 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
-<!-- $Id: ijbman.html,v 1.2 2001/05/17 22:56:17 jongfoster Exp $\r
+<!-- $Id$\r
 \r
      See copyright details at end of file\r
 \r
diff --git a/doc/pcrs.3 b/doc/pcrs.3
deleted file mode 100644 (file)
index 2a96d5a..0000000
+++ /dev/null
@@ -1,479 +0,0 @@
-.\" Copyright (c) 2001 Andreas S. Oesterhelt <oes@oesterhelt.org>
-.\"
-.\" This is free documentation; you can redistribute it and/or
-.\" modify it under the terms of the GNU General Public License as
-.\" published by the Free Software Foundation; either version 2 of
-.\" the License, or (at your option) any later version.
-.\"
-.\" The GNU General Public License's references to "object code"
-.\" and "executables" are to be interpreted as the output of any
-.\" document formatting or typesetting system, including
-.\" intermediate and printed output.
-.\"
-.\" This manual is distributed in the hope that it will be useful,
-.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\" GNU General Public License for more details.
-.\"
-.\" You should have received a copy of the GNU General Public
-.\" License along with this manual; if not, write to the Free
-.\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-.\" MA 02111, USA.
-.\"
-.TH PCRS 3 "4 March 2002" "pcrs-0.0.1"
-.SH NAME
-pcrs - Perl-compatible regular substitution.
-.SH SYNOPSIS
-.br
-.B "#include <pcrs.h>"
-.PP
-.br
-.BI "pcrs_job *pcrs_compile(const char *" pattern "," 
-.ti +5n
-.BI "const char *" substitute ", const char *" options ,
-.ti +5n
-.BI "int *" errptr );
-.PP
-.br
-.BI "pcrs_job *pcrs_compile_command(const char *" command ,
-.ti +5n
-.BI "int *" errptr );
-.PP
-.br
-.BI "int pcrs_execute(pcrs_job *" job ", char *" subject ,
-.ti +5n
-.BI "int " subject_length ", char **" result ,
-.ti +5n
-.BI "int *" result_length );
-.PP
-.br
-.BI "int pcrs_execute_list (pcrs_job *" joblist ", char *" subject ,
-.ti +5n
-.BI "int " subject_length ", char **" result ,
-.ti +5n
-.BI "int *" result_length );
-.PP
-.br
-.BI "pcrs_job *pcrs_free_job(pcrs_job *" job );
-.PP
-.br
-.BI "void pcrs_free_joblist(pcrs_job *" joblist );
-.PP
-.br
-.BI "char *pcrs_strerror(int " err );
-.PP
-.br
-
-.SH DESCRIPTION
-
-The
-.SM PCRS
-library is a supplement to the 
-.SB PCRE(3)
-library that implements
-.RB "regular expression based substitution, like provided by " Perl(1) "'s 's'"
-operator. It uses the same syntax and semantics as Perl 5, with just a few
-differences (see below).
-
-In a first step, the information on a substitution, i.e. the pattern, the
-substitute and the options are compiled from Perl syntax to an internal form
-.RB "called " pcrs_job " by using either the " pcrs_compile() " or " 
-.BR pcrs_compile_command() " functions."
-
-Once the job is compiled, it can be used on subjects, which are arbitrary 
-memory areas containing string or binary data, by calling
-.BR pcrs_execute() ". Jobs can be chained to joblists and whole"
-.RB "joblists can be applied to a subject using " pcrs_execute_list() .
-
-There are also convenience functions for freeing the jobs and for errno-to-string
-.RB "conversion, namely " pcrs_free_job() ", " pcrs_free_joblist() " and "
-.BR pcrs_strerror() .
-
-.SH COMPILING JOBS
-
-.RB "The function " pcrs_compile() " is called to compile a " pcrs_job
-.RI "from a " pattern ", " substitute " and " options " string."
-.RB "The resulting " "pcrs_job" " structure is dynamically allocated and it"
-.RB "is the caller's responsibility to call " "pcrs_free_job()" "  when it's no longer needed."
-
-.BR "pcrs_compile_command()" " is a convenience wrapper function that parses a Perl"
-.IR "command" " of the form"
-.BI "s/" "pattern" "/" "substitute" "/[" "options" "]"
-.RB "into its components and then calls " "pcrs_compile()" ". As in Perl, you"
-.RB "are not bound to the '" "/" "' character: Whatever"
-.RB "follows the '" "s" "' will be used as the delimiter. Patterns or substitutes"
-that contain the delimiter need to quote it:
-\fBs/th\\/is/th\\/at/\fR
-.RB "will replace " "th/is" " by " "th/at" " and can be written more simply as" 
-.BR "s|th/is|th/at|" "."
-
-.IR "pattern" ", " "substitute" ", " "options" " and " "command" " must be"
-.RI "zero-terminated C strings. " "substitute" " and " "options" " may be"
-.BR "NULL" ", in which case they are treated like the empty string."
-
-.SS "Return value and diagnostics"
-On success, both functions return a pointer to the compiled job.
-.RB "On failure, " "NULL"
-.RI "is returned. In that case, the pcrs error code is written to *" "err" "."
-
-.SS Patterns
-.RI "For the syntax of the " "pattern" ", see the "
-.BR "PCRE(3)" " manual page."
-
-.SS Substitutes
-.RI "The " "substitute" " uses"
-.RB "Perl syntax as documented in the " "perlre(1)" " manual page, with"
-some exceptions: 
-
-Most notably and evidently, since
-.SM PCRS
-is not Perl, variable interpolation or Perl command substitution won't work.
-Special variables that do get interpolated, are:
-.TP
-.B "$1, $2, ..., $n"
-Like in Perl, these variables refer to what the nth capturing subpattern
-in the pattern matched.
-.TP
-.B "$& and $0"
-.RB "refer to the whole match. Note that " "$0" " is deprecated in recent"
-Perl versions and now refers to the program name.
-.TP
-.B "$+"
-refers to what the last capturing subpattern matched.
-.TP
-.BR "$` and $'" " (backtick and tick)"
-.RI "refer to the areas of the " "subject" " before and after the match, respectively."
-.RB "Note that, like in Perl, the " "unmodified" " subject is used, even"
-if a global substitution previously matched.
-
-.PP
-Perl4-style references to subpattern matches of the form 
-\fB\\1, \\2, ...\fR
-.RB "which only exist in Perl5 for backwards compatibility, are " "not" 
-supported.
-
-Also, since the substitute is a double-quoted string in Perl, you
-might expect all Perl syntax for special characters to apply. In fact,
-only the following are supported:
-
-.TP
-\fB\\n\fR
-newline (0x0a)
-.TP
-\fB\\r\fR
-carriage return (0x0d)
-.TP
-\fB\\t\fR
-horizontal tab (0x09)
-.TP
-\fB\\f\fR
-form feed (0x0c)
-.TP
-\fB\\b\fR
-backspace (0x08)
-.TP
-\fB\\a\fR
-alarm, bell (0x07)
-.TP
-\fB\\e\fR
-escape (0x1b)
-.TP
-\fB\\0\fR
-binary zero (0x00)
-
-.SS "Options"
-.RB "The options " "gmisx" " are supported. " "e" " is not, since it would"
-.RB "require a Perl interpreter and neither is " o ", because the pattern
-is explicitly compiled, anyway. Additionally,
-.SM PCRS
-.RB "honors the options " "U" " and " "T" "."
-Where
-.SM PCRE
-.RB "options are mentioned below, refer to " PCRE(3) " for the subtle differences"
-to Perl behaviour.
-
-.TP
-.B g
-.RB "Replace " all " instances of"
-.IR pattern " in " subject ,
-not just the first one.
-
-.TP
-.B i
-.RI "Match the " pattern " without respect to case. This translates to"
-.SM PCRE_CASELESS.
-
-.TP
-.B m
-.RI "Treat the " subject " as consisting of multiple lines, i.e."
-.RB ' ^ "' matches immediately after, and '" $ "' immediately before each newline."
-Translates to
-.SM PCRE_MULTILINE.
-
-.TP
-.B s
-.RI "Treat the " subject " as consisting of one single line, i.e."
-.RB "let the scope of the '" . "' metacharacter include newlines."
-Translates to
-.SM PCRE_DOTALL.
-
-.TP
-.B x
-.RI "Allow extended regular expression syntax in the " pattern ","
-.RB "enabling whitespace and comments in complex patterns."
-Translates to
-.SM PCRE_EXTENDED.
-
-.TP
-.B U
-.RB "Switch the default behaviour of the '" * "' and '" + "' quantifiers"
-.RB "to ungreedy. Note that appending a '" ? "' switches back to greedy(!)."
-.RB "The explicit in-pattern switches " (?U) " and " (?-U) " remain unaffected."
-Translates to
-.SM PCRE_UNGREEDY.
-
-.TP
-.B T
-.RI "Consider the " substitute " trivial, i.e. do not interpret any references"
-or special character escape sequences in the substitute. Handy for large
-user-supplied substitutes, which would otherwise have to be examined and properly
-quoted.
-
-.PP
-Unsupported options are silently ignored.
-
-.SH EXECUTING JOBS
-
-.RI "Calling " pcrs_execute() " produces a modified copy of the " subject ", in which"
-.RB "the first (or all, if the '" g "' option was given when compiling the job)"
-.RI "occurance(s) of the job's " pattern " in the " subject " is replaced by the job's"
-.IR substitute .
-
-.RI "The first " subject_length " bytes following " subject " are processed, so"
-.RI  "a " subject_length " that exceeds the actual " subject " is dangerous."
-Note that if you want to get your zero-terminated C strings back including their
-.RI "termination, you must let " subject_length " include the binary zero, i.e."
-set it to
-.BI strlen( subject ") + 1."
-
-.RI "The " subject " itself is left untouched, and the " *result " is dynamically"
-.RB "allocated, so it is the caller's responsibility to " free() " it when it's"
-no longer needed.
-
-.RI "The result's length is written to " *result_length "."
-
-.RB "If the job matched, the " PCRS_SUCCESS " flag in"
-.IB job ->flags
-is set.
-
-.SS Return value and diagnostics
-
-.RB "On success, " pcrs_execute() " returns the number of substitutions that"
-were made, which is limited to 0 or 1 for non-global searches.
-.RI "On failure, a negative error code is returned and " result " is set"
-.RB "to " NULL .
-
-.SH FREEING JOBS
-.RB "It is not sufficient to call " free() " on a " pcrs_job ", because it "
-contains pointers to other dynamically allocated structures.
-.RB "Use " pcrs_free_job() " instead. It is safe to pass " NULL " pointers "
-.RB "(or pointers to invalid " pcrs_job "s that contain " NULL " pointers"
-.RB "to dependant structures) to " pcrs_free_job() "."
-
-.SS Return value
-.RB "The value of the job's " next " pointer."
-
-
-.SH CHAINING JOBS
-
-.SM PCRS
-.RB "supports to some extent the chaining of multiple " pcrs_job " structures by"
-.RB "means of their " next " member."
-
-Chaining the jobs is up to you, but once you have built a linked list of jobs,
-.RI "you can execute a whole " joblist " on a given subject by"
-.RB "a single call to " pcrs_execute_list() ", which will sequentially traverse"
-.RB "the linked list until it reaches a " NULL " pointer, and call " pcrs_execute() 
-.RI "for each job it encounters, feeding the " result  " and " result_length " of each"
-.RI "call into the next as the " subject " and " subject_length ". As in the single"
-.RI "job case, the original " subject " remains untouched, but all interim " result "s"
-.RB "are of course " free() "d. The return value is the accumulated number of matches"
-.RI "for all jobs in the " joblist "."
-.RI "Note that while this is handy, it reduces the diagnostic value of " err ", since "
-you won't know which job failed.
-
-.RI "In analogy, you can free all jobs in a given " joblist " by calling"
-.BR pcrs_free_joblist() .
-
-.SH QUOTING
-The quote character is (surprise!) '\fB\\\fR'. It quotes the delimiter in a
-.IR command ", the"
-.RB ' $ "' in  a"
-.IR substitute ", and, of course, itself. Note that the"
-.RB ' $ "' doesn't need to be quoted if it isn't followed by " [0-9+'`&] "."
-
-.RI "For quoting in the " pattern ", please refer to"
-.BR PCRE(3) .
-
-.SH DIAGNOSTICS
-
-.RB "When " compiling " a job either via the " pcrs_compile() " or " pcrs_compile_command()
-.RB "functions, you know that something went wrong when you are returned a " NULL " pointer."
-.RI "In that case, or in the event of non-fatal warnings, the integer pointed to by " err
-contains a nonzero error code, which is either a passed-through
-.SM PCRE
-error code or one generated by
-.SM PCRS.
-Under normal circumstances, it can take the following values:
-.TP
-.B PCRE_ERROR_NOMEMORY
-While compiling the pattern,
-.SM PCRE
-ran out of memory.
-.TP  
-.B  PCRS_ERR_NOMEM
-While compiling the job,
-.SM PCRS
-ran out of memory.
-.TP  
-.B  PCRS_ERR_CMDSYNTAX
-.BR pcrs_compile_command() " didn't find four tokens while parsing the"
-.IR command .
-.TP  
-.B  PCRS_ERR_STUDY
-A
-.SM PCRE
-.RB "error occured while studying the compiled pattern. Since " pcre_study()
-only provides textual diagnostic information, the details are lost.
-.TP  
-.B  PCRS_WARN_BADREF
-.RI "The " substitute " contains a reference to a capturing subpattern that"
-.RI "has a higher index than the number of capturing subpatterns in the " pattern
-or that exceeds the current hard limit of 33 (See LIMITATIONS below). As in Perl,
-this is non-fatal and results in substitutions with the empty string.
-
-.PP
-.RB "When " executing " jobs via " pcrs_execute() " or " pcrs_execute_list() ","
-.RI "a negative return code indicates an error. In that case, *" result
-.RB "is " NULL ". Possible error codes are:"
-.TP
-.B PCRE_ERROR_NOMEMORY
-While matching the pattern,
-.SM PCRE
-ran out of memory. This can only happen if there are more than 33 backrefrences
-.RI "in the " pattern "(!)"
-.BR and " memory is too tight to extend storage for more."
-.TP  
-.B  PCRS_ERR_NOMEM
-While executing the job,
-.SM PCRS
-ran out of memory.
-.TP  
-.B  PCRS_ERR_BADJOB
-.RB "The " pcrs_job "*  passed to " pcrs_execute " was NULL, or the"
-.RB "job is bogus (it contains " NULL " pointers to the compiled
-pattern, extra, or substitute).
-
-.PP
-If you see any other
-.SM PCRE
-error code passed through, you've either messed with the compiled job
-or found a bug in
-.SM PCRS.
-Please send me an email.
-
-.RB "Ah, and don't look for " PCRE_ERROR_NOMATCH ", since this"
-is not an error in the context of
-.SM PCRS.
-.RI "Should there be no match, an exact copy of the " subject " is"
-.RI "found at *" result " and the return code is 0 (matches)."
-
-All error codes can be translated into human readable text by means
-.RB "of the " pcrs_strerror() " function."
-
-
-.SH EXAMPLE
-A trivial command-line test program for
-.SM PCRS
-might look like:
-
-.nf
-#include <pcrs.h>
-#include <stdio.h>
-
-int main(int Argc, char **Argv)
-{
-   pcrs_job *job;
-   char *result;
-   size_t newsize;
-   int err;
-
-   if (Argc != 3)
-   {
-      fprintf(stderr, "Usage: %s s/pattern/substitute/[options]  subject\\n", Argv[0]);
-      return 1;
-   }
-
-   if (NULL == (job = pcrs_compile_command(Argv[1], &err)))
-   {
-      fprintf(stderr, "%s: compile error:  %s (%d).\\n", Argv[0], pcrs_strerror(err), err);
-   }
-
-   if (0 > (err = pcrs_execute(job, Argv[2], strlen(Argv[2]) + 1, &result, &newsize)))
-   {
-      fprintf(stderr, "%s: Exec error:  %s (%d).\\n", Argv[0], pcrs_strerror(err), err);
-   }
-   else
-   {
-      printf("Result: *%s*\\n", result);
-      free(result);
-   }
-
-   pcrs_free_job(job);
-   return(err < 0);
-
-}
-
-.fi
-
-
-.SH LIMITATIONS
-The number of matches that a global job can have is only limited by the
-available memory. An initial storage for 40 matches is reserved, which
-is dynamically resized by the factor 1.6 whenever it is exhausted.
-
-The number of capturing subpatterns is currently limited to 33, which
-is a Bad Thing[tm]. It should be dynamically expanded until it reaches the
-.SM PCRE
-limit of 99.
-
-All of the above values can be adjusted in the "Capacity" section
-.RB "of " pcrs.h "."
-
-The Perl-style escape sequences for special characters \\\fInnn\fR,
-\\x\fInn\fR, and \\c\fIX\fR are currently unsupported.
-
-.SH BUGS
-This library has only been tested in the context of one application
-and should be considered high risk.
-
-.SH HISTORY
-.SM PCRS
-was originally written for the Internet Junkbuster project
-(http://sourceforge.net/projects/ijbswa/).
-
-.SH SEE ALSO
-.B PCRE(3), perl(1), perlre(1)
-
-.SH AUTHOR
-
-.SM PCRS
-is Copyright 2000, 2001 by Andreas Oesterhelt <andreas@oesterhelt.org> and is
-licensed under the terms of the GNU Lesser General Public License (LGPL),
-version 2.1, which should be included in this distribution, with the exception
-that the permission to replace that license with the GNU General Public
-License (GPL) given in section 3 is restricted to version 2 of the GPL.
-
-If it is missing from this distribution, the LGPL can be obtained from
-http://www.gnu.org/licenses/lgpl.html or by mail: Write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
diff --git a/doc/source/.gitignore b/doc/source/.gitignore
deleted file mode 100644 (file)
index 29fa232..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-developer-manual
-faq
-ldpOK.dsl
-user-manual
diff --git a/doc/source/developer-manual.sgml b/doc/source/developer-manual.sgml
deleted file mode 100644 (file)
index f851625..0000000
+++ /dev/null
@@ -1,1570 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/developer-manual.sgml,v $
-
- Purpose     :  developer manual
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<article id="index">
-  <artheader>
-    <title>Privoxy Developer Manual</title>
-
-    <pubdate>$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $</pubdate>
-
-    <authorgroup>
-      <author>
-        <affiliation>
-          <orgname>By: Privoxy Developers</orgname>
-        </affiliation>
-      </author>
-    </authorgroup>
-
-    <abstract>
-      <para>
- The developer manual gives the users information on how to help the developer
- team. It provides guidance on coding, testing, documentation and other
- issues. 
- </para>
-
-<para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development. Other developers have since joined Stefan.
-</para>
-
-<para>
- You can find the latest version of the user manual at <ulink
- url="http://www.privoxy.org/developer-manual/">http://www.privoxy.org/developer-manual/</ulink>.
- Please see the Contact section in the user-manual if you want to contact the
- developers.
-</para>
-
-<!--        <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-
-    </abstract>
-  </artheader>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="introduction"><title>Introduction</title>
-    <para>To be filled.
-</para>
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="quickstart"><title>Quickstart to Privoxy Development</title>
-    <para>
-You'll need an account on Sourceforge to support our development. Mail you ID
-to the list and wait until a project manager has added you.
-
-For the time beeing (read, this section is under construction), please note the
-following guidelines for changing stuff in the code. If it is
-       <orderedlist numeration="arabic">
-                       <listitem><para>
-               A bugfix / clean-up / cosmetic thing: shoot
-                       </para></listitem>
-               <listitem><para>
-               A new feature that can be turned off: shoot
-                       </para></listitem>
-               <listitem><para>
-               A clear improvement w/o side effects on other parts of the code: shoot
-                </para></listitem>
-               <listitem><para>
-               A matter of taste: ask the list
-               </para></listitem>
-               <listitem><para>
-               A major redesign of some part of the code: ask the list
-                </para></listitem>
-        </orderedlist> 
-</para>                
-  </sect1>     
-       
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="documentation"><title>Documentation Guidelines</title>
-    <para>
-        All docs are in SGML format and located in the <computeroutput>doc/source</computeroutput> directory.
-        </para>
-        <para>
-        How do you update the webserver (i.e. the pages on sourceforge)?
-        <orderedlist numeration="arabic">
-                <listitem><para>
-        Run <computeroutput>make dok</computeroutput> (which uses the documents in <computeroutput>doc/source</computeroutput> to update all
-        text files in <computeroutput>doc/text</computeroutput> and to update
-all web documents in <computeroutput>doc/webserver</computeroutput>.
-                </para></listitem>
-                <listitem><para>
-        Run <computeroutput>make webserver</computeroutput> which copies all files from
-<computeroutput>doc/webserver</computeroutput> to the sourceforge webserver
-via scp.
-                </para></listitem>
-        </orderedlist>
-  </para>
- </sect1>
-
-<!--     <listitem><para>be consistent with the redirect script (i.e. the <application>Privoxy</application> program -->
-<!--       points via the redirect URL at sf to valid end-points in the document)</para></listitem> -->
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="coding"><title>Coding Guidelines</title>
-
-    <sect2 id="s1"><title>Introduction</title>
-
-    <para>This set of standards is designed to make our lives easier.  It is
-    developed with the simple goal of helping us keep the "new and improved
-    <application>Privoxy</application>" consistent and reliable. Thus making
-    maintenance easier and increasing chances of success of the
-    project.</para>
-
-    <para>And that of course comes back to us as individuals. If we can
-    increase our development and product efficiencies then we can solve more
-    of the request for changes/improvements and in general feel good about
-    ourselves. ;-></para>
-
-  </sect2>
-
-    <sect2 id="s2"><title>Using Comments</title>
-
-    <sect3 id="s3"><title>Comment, Comment, Comment</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Comment as much as possible without commenting the obvious.
-    For example do not comment "aVariable is equal to bVariable".
-    Instead explain why aVariable should be equal to the bVariable.
-    Just because a person can read code does not mean they will
-    understand why or what is being done. A reader may spend a lot
-    more time figuring out what is going on when a simple comment
-    or explanation would have prevented the extra research. Please
-    help your brother IJB'ers out!</para>
-
-    <para>The comments will also help justify the intent of the code.
-    If the comment describes something different than what the code
-    is doing then maybe a programming error is occurring.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/* if page size greater than 1k ... */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-/* if page size is small, send it in blocks */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-This demonstrates 2 cases of "what not to do".  The first is a
-"syntax comment".  The second is a comment that does not fit what
-is actually being done.
-</programlisting>
-  </sect3>
-
-    
-
-    <sect3 id="s4"><title>Use blocks for comments</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Comments can help or they can clutter. They help when they
-    are differentiated from the code they describe. One line
-    comments do not offer effective separation between the comment
-    and the code. Block identifiers do, by surrounding the code
-    with a clear, definable pattern.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * This will stand out clearly in your code!
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-/* unfortunately, this may not */
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-if ( thisVariable == thatVariable ) /* this may not either */
-{
-   DoSomethingVeryImportant();
-}</programlisting>
-
-    <para><emphasis>Exception:</emphasis></para>
-
-    <para>If you are trying to add a small logic comment and do not
-    wish to "disrubt" the flow of the code, feel free to use a 1
-    line comment which is NOT on the same line as the code.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s5"><title>Keep Comments on their own line</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It goes back to the question of readability. If the comment
-    is on the same line as the code it will be harder to read than
-    the comment that is on its own line.</para>
-
-    <para>There are three exceptions to this rule, which should be
-    violated freely and often: during the definition of variables,
-    at the end of closing braces, when used to comment
-    parameters.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * This will stand out clearly in your code,
- * But the second example won't.
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-if ( thisVariable == thatVariable ) /*can you see me?*/
-{
-   DoSomethingVeryImportant(); /*not easily*/
-}
-
-
-/*********************************************************************
- * But, the encouraged exceptions:
- *********************************************************************/
-int urls_read     = 0;     /* # of urls read + rejected */
-int urls_rejected = 0;     /* # of urls rejected */
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-}
-
-
-short DoSomethingVeryImportant(
-   short firstparam,   /* represents something */
-   short nextparam     /* represents something else */ )
-{
-   ...code here...
-
-}   /* -END- DoSomethingVeryImportant */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s6"><title>Comment each logical step</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Logical steps should be commented to help others follow the
-    intent of the written code and comments will make the code more
-    readable.</para>
-
-    <para>If you have 25 lines of code without a comment, you should
-    probably go back into it to see where you forgot to put
-    one.</para>
-
-    <para>Most "for", "while", "do", etc... loops _probably_ need a
-    comment. After all, these are usually major logic
-    containers.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s7"><title>Comment All Functions Thoroughly</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>A reader of the code should be able to look at the comments
-    just prior to the beginning of a function and discern the
-    reason for its existence and the consequences of using it. The
-    reader should not have to read through the code to determine if
-    a given function is safe for a desired use. The proper
-    information thoroughly presented at the introduction of a
-    function not only saves time for subsequent maintenance or
-    debugging, it more importantly aids in code reuse by allowing a
-    user to determine the safety and applicability of any function
-    for the problem at hand. As a result of such benefits, all
-    functions should contain the information presented in the
-    addendum section of this document.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s8"><title>Comment at the end of braces if the
-    content is more than one screen length</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Each closing brace should be followed on the same line by a
-    comment that describes the origination of the brace if the
-    original brace is off of the screen, or otherwise far away from
-    the closing brace. This will simplify the debugging,
-    maintenance, and readability of the code.</para>
-
-    <para>As a suggestion , use the following flags to make the
-    comment and its brace more readable:</para>
-
-    <para>use following a closing brace: } /* -END- if() or while ()
-    or etc... */</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if x is 1 */
-
-or:
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if ( 1 == X ) */
-</programlisting>
-  </sect3>
-    
-  </sect2>
-
-    <sect2 id="s9"><title>Naming Conventions</title>
-
-    
-
-    <sect3 id="s10"><title>Variable Names</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all lowercase, and seperate words via an underscore
-    ('_'). Do not start an identifier with an underscore. (ANSI C
-    reserves these for use by the compiler and system headers.) Do
-    not use identifiers which are reserved in ANSI C++. (E.g.
-    template, class, true, false, ...). This is in case we ever
-    decide to port Privoxy to C++.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int ms_iis5_hack = 0;</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-int msiis5hack = 0; int msIis5Hack = 0;
-</programlisting>
-</para>
-
-    
-
-  </sect3>    
-
-    <sect3 id="s11"><title>Function Names</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all lowercase, and seperate words via an underscore
-    ('_'). Do not start an identifier with an underscore. (ANSI C
-    reserves these for use by the compiler and system headers.) Do
-    not use identifiers which are reserved in ANSI C++. (E.g.
-    template, class, true, false, ...). This is in case we ever
-    decide to port Privoxy to C++.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int load_some_file( struct client_state *csp )</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-int loadsomefile( struct client_state *csp )
-int loadSomeFile( struct client_state *csp )
-</programlisting>
-</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s12"><title>Header file prototypes</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use a descriptive parameter name in the function prototype
-    in header files. Use the same parameter name in the header file
-    that you use in the c file.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-(.h) extern int load_aclfile( struct client_state *csp );
-(.c) int load_aclfile( struct client_state *csp )</programlisting>
-
-    <para><emphasis>Instead of:</emphasis>
-<programlisting>
-(.h) extern int load_aclfile( struct client_state * ); or 
-(.h) extern int load_aclfile(); 
-(.c) int load_aclfile( struct client_state *csp )
-</programlisting>
-</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s13"><title>Enumerations, and #defines</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Use all capital letters, with underscores between words. Do
-    not start an identifier with an underscore. (ANSI C reserves
-    these for use by the compiler and system headers.)</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-(enumeration) : enum Boolean { FALSE, TRUE };
-(#define) : #define DEFAULT_SIZE 100;</programlisting>
-
-    <para><emphasis>Note:</emphasis> We have a standard naming scheme for #defines
-    that toggle a feature in the preprocessor: FEATURE_>, where
-    > is a short (preferably 1 or 2 word) description.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#define FEATURE_FORCE 1
-
-#ifdef FEATURE_FORCE
-#define FORCE_PREFIX blah
-#endif /* def FEATURE_FORCE */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s14"><title>Constants</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Spell common words out entirely (do not remove vowels).</para>
-
-    <para>Use only widely-known domain acronyms and abbreviations.
-    Capitalize all letters of an acronym.</para>
-
-    <para>Use underscore (_) to separate adjacent acronyms and
-    abbreviations. Never terminate a name with an underscore.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#define USE_IMAGE_LIST 1</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>
-<programlisting>
-#define USE_IMG_LST 1 or 
-#define _USE_IMAGE_LIST 1 or
-#define USE_IMAGE_LIST_ 1 or 
-#define use_image_list 1 or
-#define UseImageList 1
-</programlisting>
-</para>
-
-    
-  </sect3>
-
-  </sect2>
-    
-
-    <sect2 id="s15"><title>Using Space</title>
-
-    
-
-    <sect3 id="s16"><title>Put braces on a line by themselves.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The brace needs to be on a line all by itself, not at the
-    end of the statement. Curly braces should line up with the
-    construct that they're associated with. This practice makes it
-    easier to identify the opening and closing braces for a
-    block.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( this == that )
-{
-   ...
-}</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( this == that ) { ... }</para>
-
-    <para>or</para>
-
-    <para>if ( this == that ) { ... }</para>
-
-    <para><emphasis>Note:</emphasis> In the special case that the if-statement is
-    inside a loop, and it is trivial, i.e. it tests for a
-    condidtion that is obvious from the purpose of the block,
-    one-liners as above may optically preserve the loop structure
-    and make it easier to read.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection.</para>
-
-    <para><emphasis>Example exception:</emphasis></para>
-<programlisting>
-while ( more lines are read )
-{
-   /* Please document what is/is not a comment line here */
-   if ( it's a comment ) continue;
-
-   do_something( line );
-}
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s17"><title>ALL control statements should have a
-    block</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Using braces to make a block will make your code more
-    readable and less prone to error. All control statements should
-    have a block defined.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-if ( this == that )
-{
-   DoSomething();
-   DoSomethingElse();
-}</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( this == that ) DoSomething(); DoSomethingElse();</para>
-
-    <para>or</para>
-
-    <para>if ( this == that ) DoSomething();</para>
-
-    <para><emphasis>Note:</emphasis> The first example in "Instead of" will execute
-    in a manner other than that which the developer desired (per
-    indentation). Using code braces would have prevented this
-    "feature". The "explanation" and "exception" from the point
-    above also applies.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s18"><title>Do not belabor/blow-up boolean
-    expressions</title>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-structure->flag = ( condition );</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>if ( condition ) { structure->flag = 1; } else {
-    structure->flag = 0; }</para>
-
-    <para><emphasis>Note:</emphasis> The former is readable and consice. The later
-    is wordy and inefficient. Please assume that any developer new
-    to the project has at least a "good" knowledge of C/C++. (Hope
-    I do not offend by that last comment ... 8-)</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s19"><title>Use white space freely because it is
-    free</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Make it readable. The notable exception to using white space
-    freely is listed in the next guideline.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int firstValue   = 0;
-int someValue    = 0;
-int anotherValue = 0;
-int thisVariable = 0;
-
-if ( thisVariable == thatVariable )
-
-firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s20"><title>Don't use white space around structure
-    operators</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>- structure pointer operator ( "->" ) - member operator (
-    "." ) - functions and parentheses</para>
-
-    <para>It is a general coding practice to put pointers, references,
-    and function parentheses next to names. With spaces, the
-    connection between the object and variable/function name is not
-    as clear.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-aStruct->aMember;
-aStruct.aMember;
-FunctionName();</programlisting>
-
-    <para><emphasis>Instead of:</emphasis> aStruct -> aMember; aStruct . aMember;
-    FunctionName ();</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s21"><title>Make the last brace of a function stand
-    out</title>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int function1( ... )
-{
-   ...code...
-   return( retCode );
-
-}   /* -END- function1 */
-
-
-int function2( ... )
-{
-}   /* -END- function2 */
-</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>int function1( ... ) { ...code... return( retCode ); } int
-    function2( ... ) { }</para>
-
-    <para><emphasis>Note:</emphasis> Use 1 blank line before the closing brace and 2
-    lines afterwards. This makes the end of function standout to
-    the most casual viewer. Although function comments help
-    seperate functions, this is still a good coding practice. In
-    fact, I follow these rules when using blocks in "for", "while",
-    "do" loops, and long if {} statements too. After all whitespace
-    is free!</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection on the number of blank
-    lines. Enforced is the end of function comments.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s22"><title>Use 3 character indentions</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If some use 8 character TABs and some use 3 character TABs,
-    the code can look *very* ragged. So use 3 character indentions
-    only. If you like to use TABs, pass your code through a filter
-    such as "expand -t3" before checking in your code.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-static const char * const url_code_map[256] =
-{
-   NULL, ...
-};
-
-
-int function1( ... )
-{
-   if ( 1 )
-   {
-      return( ALWAYS_TRUE );
-   }
-   else
-   {
-      return( HOW_DID_YOU_GET_HERE );
-   }
-
-   return( NEVER_GETS_HERE );
-
-}
-</programlisting>
-  </sect3>
-
-  </sect2>
-    
-
-    <sect2 id="s23"><title>Initializing</title>
-
-    
-
-    <sect3 id="s24"><title>Initialize all variables</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Do not assume that the variables declared will not be used
-    until after they have been assigned a value somewhere else in
-    the code. Remove the chance of accidentally using an unassigned
-    variable.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-short anShort = 0;
-float aFloat  = 0;
-struct *ptr = NULL;</programlisting>
-
-    <para><emphasis>Note:</emphasis> It is much easier to debug a SIGSEGV if the
-    message says you are trying to access memory address 00000000
-    and not 129FA012; or arrayPtr[20] causes a SIGSEV vs.
-    arrayPtr[0].</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection if and only if the
-    variable is assigned a value "shortly after" declaration.</para>
-
-  </sect3>
-  </sect2>
-    
-
-    <sect2 id="s25"><title>Functions</title>
-
-    
-
-    <sect3 id="s26"><title>Name functions that return a boolean as a
-    question.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Value should be phrased as a question that would logically
-    be answered as a true or false statement</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-ShouldWeBlockThis();
-ContainsAnImage();
-IsWebPageBlank();
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s27"><title>Always specify a return type for a
-    function.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The default return for a function is an int. To avoid
-    ambiguity, create a return for a function when the return has a
-    purpose, and create a void return type if the function does not
-    need to return anything.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s28"><title>Minimize function calls when iterating by
-    using variables</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It is easy to write the following code, and a clear argument
-    can be made that the code is easy to understand:</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-for ( size_t cnt = 0; cnt &lt; blockListLength(); cnt ++ )
-{
-   ....
-}</programlisting>
-
-    <para><emphasis>Note:</emphasis> Unfortunately, this makes a function call for
-    each and every iteration. This increases the overhead in the
-    program, because the compiler has to look up the function each
-    time, call it, and return a value. Depending on what occurs in
-    the blockListLength() call, it might even be creating and
-    destroying structures with each iteration, even though in each
-    case it is comparing "cnt" to the same value, over and over.
-    Remember too - even a call to blockListLength() is a function
-    call, with the same overhead.</para>
-
-    <para>Instead of using a function call during the iterations,
-    assign the value to a variable, and evaluate using the
-    variable.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-size_t len = blockListLength();
-
-for ( size_t cnt = 0; cnt &lt; len; cnt ++ )
-{
-   ....
-}</programlisting>
-
-    <para><emphasis>Exceptions:</emphasis> if the value of blockListLength() *may*
-    change or could *potentially* change, then you must code the
-    function call in the for/while loop.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s29"><title>Pass and Return by Const Reference</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>This allows a developer to define a const pointer and call
-    your function. If your function does not have the const
-    keyword, we may not be able to use your function. Consider
-    strcmp, if it were defined as: extern int strcmp( char *s1,
-    char *s2 );</para>
-
-    <para>I could then not use it to compare argv's in main: int main(
-    int argc, const char *argv[] ) { strcmp( argv[0], "privoxy"
-    ); }</para>
-
-    <para>Both these pointers are *const*! If the c runtime library
-    maintainers do it, we should too.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s30"><title>Pass and Return by Value</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Most structures cannot fit onto a normal stack entry (i.e.
-    they are not 4 bytes or less). Aka, a function declaration
-    like: int load_aclfile( struct client_state csp )</para>
-
-    <para>would not work. So, to be consistent, we should declare all
-    prototypes with "pass by value": int load_aclfile( struct
-    client_state *csp )</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s31"><title>Names of include files</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Your include statements should contain the file name without
-    a path. The path should be listed in the Makefile, using -I as
-    processor directive to search the indicated paths. An exception
-    to this would be for some proprietary software that utilizes a
-    partial path to distinguish their header files from system or
-    other header files.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#include &lt;iostream.h&gt;     /* This is not a local include */
-#include "config.h"       /* This IS a local include */
-</programlisting>
-
-    <para><emphasis>Exception:</emphasis></para>
-
-    <para>
-<programlisting>
-/* This is not a local include, but requires a path element. */ 
-#include &lt;sys/fileName.h&gt;
-</programlisting>
-</para>
-
-    <para><emphasis>Note:</emphasis> Please! do not add "-I." to the Makefile
-    without a _very_ good reason. This duplicates the #include
-    "file.h" behaviour.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s32"><title>Provide multiple inclusion
-    protection</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Prevents compiler and linker errors resulting from
-    redefinition of items.</para>
-
-    <para>Wrap each header file with the following syntax to prevent
-    multiple inclusions of the file. Of course, replace PROJECT_H
-    with your file name, with "." Changed to "_", and make it
-    uppercase.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
- ...
-#endif /* ndef PROJECT_H_INCLUDED */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s33"><title>Use `extern "C"` when appropriate</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If our headers are included from C++, they must declare our
-    functions as `extern "C"`. This has no cost in C, but increases
-    the potential re-usability of our code.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* def __cplusplus */
-
-... function definitions here ...
-
-#ifdef __cplusplus
-}
-#endif /* def __cplusplus */
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s34"><title>Where Possible, Use Forward Struct
-    Declaration Instead of Includes</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Useful in headers that include pointers to other struct's.
-    Modifications to excess header files may cause needless
-    compiles.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-/*********************************************************************
- * We're avoiding an include statement here!
- *********************************************************************/
-struct file_list;
-extern file_list *xyz;</programlisting>
-
-    <para><emphasis>Note:</emphasis> If you declare "file_list xyz;" (without the
-    pointer), then including the proper header file is necessary.
-    If you only want to prototype a pointer, however, the header
-    file is unneccessary.</para>
-
-    <para><emphasis>Status:</emphasis> Use with discrection.</para>
-
-    
-  </sect3>
-  </sect2>
-
-    <sect2 id="s35"><title>General Coding Practices</title>
-
-    
-
-    <sect3 id="s36"><title>Turn on warnings</title>
-
-    <para><emphasis>Explanation</emphasis></para>
-
-    <para>Compiler warnings are meant to help you find bugs. You
-    should turn on as many as possible. With GCC, the switch is
-    "-Wall". Try and fix as many warnings as possible.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s37"><title>Provide a default case for all switch
-    statements</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>What you think is guaranteed is never really guaranteed. The
-    value that you don't think you need to check is the one that
-    someday will be passed. So, to protect yourself from the
-    unknown, always have a default step in a switch statement.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-switch( hash_string( cmd ) )
-{
-   case hash_actions_file :
-      ... code ...
-      break;
-
-   case hash_confdir :
-      ... code ...
-      break;
-
-   default :
-      log_error( ... );
-      ... anomly code goes here ...
-      continue; / break; / exit( 1 ); / etc ...
-
-} /* end switch( hash_string( cmd ) ) */</programlisting>
-
-    <para><emphasis>Note:</emphasis> If you already have a default condition, you
-    are obviously exempt from this point. Of note, most of the
-    WIN32 code calls `DefWindowProc' after the switch statement.
-    This API call *should* be included in a default statement.</para>
-
-    <para><emphasis>Another Note:</emphasis> This is not so much a readability issue
-    as a robust programming issue. The "anomly code goes here" may
-    be no more than a print to the STDERR stream (as in
-    load_config). Or it may really be an ABEND condition.</para>
-
-    <para><emphasis>Status:</emphasis> Programmer discretion is advised.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s38"><title>Try to avoid falling through cases in a
-    switch statement.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>In general, you will want to have a 'break' statement within
-    each 'case' of a switch statement. This allows for the code to
-    be more readable and understandable, and furthermore can
-    prevent unwanted surprises if someone else later gets creative
-    and moves the code around.</para>
-
-    <para>The language allows you to plan the fall through from one
-    case statement to another simply by omitting the break
-    statement within the case statement. This feature does have
-    benefits, but should only be used in rare cases. In general,
-    use a break statement for each case statement.</para>
-
-    <para>If you choose to allow fall through, you should comment both
-    the fact of the fall through and reason why you felt it was
-    necessary.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s39"><title>Use 'long' or 'short' Instead of
-    'int'</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>On 32-bit platforms, int usually has the range of long. On
-    16-bit platforms, int has the range of short.</para>
-
-    <para><emphasis>Status:</emphasis> open-to-debate. In the case of most FSF
-    projects (including X/GNU-Emacs), there are typedefs to int4,
-    int8, int16, (or equivalence ... I forget the exact typedefs
-    now). Should we add these to IJB now that we have a "configure"
-    script?</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s40"><title>Don't mix size_t and other types</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>The type of size_t varies across platforms. Do not make
-    assumptions about whether it is signed or unsigned, or about
-    how long it is. Do not compare a size_t against another
-    variable of a different type (or even against a constant)
-    without casting one of the values. Try to avoid using size_t if
-    you can.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s41"><title>Declare each variable and struct on its
-    own line.</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>It can be tempting to declare a series of variables all on
-    one line. Don't.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-long a = 0;
-long b = 0;
-long c = 0;</programlisting>
-
-    <para><emphasis>Instead of:</emphasis></para>
-
-    <para>long a, b, c;</para>
-
-    <para><emphasis>Explanation:</emphasis> - there is more room for comments on the
-    individual variables - easier to add new variables without
-    messing up the original ones - when searching on a variable to
-    find its type, there is less clutter to "visually"
-    eliminate</para>
-
-    <para><emphasis>Exceptions:</emphasis> when you want to declare a bunch of loop
-    variables or other trivial variables; feel free to declare them
-    on 1 line. You should, although, provide a good comment on
-    their functions.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s42"><title>Use malloc/zalloc sparingly</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>Create a local stuct (on the stack) if the variable will
-    live and die within the context of one function call.</para>
-
-    <para>Only "malloc" a struct (on the heap) if the variable's life
-    will extend beyond the context of one function call.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-If a function creates a struct and stores a pointer to it in a
-list, then it should definately be allocated via `malloc'.
-</programlisting>
-  </sect3>
-    
-
-    <sect3 id="s43"><title>The Programmer Who Uses 'malloc' is
-    Responsible for Ensuring 'free'</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If you have to "malloc" an instance, you are responsible for
-    insuring that the instance is `free'd, even if the deallocation
-    event falls within some other programmer's code. You are also
-    responsible for ensuring that deletion is timely (i.e. not too
-    soon, not too late). This is known as "low-coupling" and is a
-    "good thing (tm)". You may need to offer a
-    free/unload/destuctor type function to accomodate this.</para>
-
-    <para><emphasis>Example:</emphasis></para>
-<programlisting>
-int load_re_filterfile( struct client_state *csp ) { ... }
-static void unload_re_filterfile( void *f ) { ... }</programlisting>
-
-    <para><emphasis>Exceptions:</emphasis></para>
-
-    <para>The developer cannot be expected to provide `free'ing
-    functions for C run-time library functions ... such as
-    `strdup'.</para>
-
-    <para><emphasis>Status:</emphasis> developer-discrection. The "main" use of this
-    standard is for allocating and freeing data structures (complex
-    or nested).</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s44"><title>Add loaders to the `file_list' structure
-    and in order</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>I have ordered all of the "blocker" file code to be in alpha
-    order. It is easier to add/read new blockers when you expect a
-    certain order.</para>
-
-    <para><emphasis>Note:</emphasis> It may appear that the alpha order is broken in
-    places by POPUP tests coming before PCRS tests. But since
-    POPUPs can also be referred to as KILLPOPUPs, it is clear that
-    it should come first.</para>
-
-    
-  </sect3>
-    
-
-    <sect3 id="s45"><title>"Uncertain" new code and/or changes to
-    exitinst code, use FIXME</title>
-
-    <para><emphasis>Explanation:</emphasis></para>
-
-    <para>If you have enough confidence in new code or confidence in
-    your changes, but are not *quite* sure of the reprocussions,
-    add this:</para>
-
-    <para>/* FIXME: this code has a logic error on platform XYZ, *
-    attempthing to fix */ #ifdef PLATFORM ...changed code here...
-    #endif</para>
-
-    <para>or:</para>
-
-    <para>/* FIXME: I think the original author really meant this...
-    */ ...changed code here...</para>
-
-    <para>or:</para>
-
-    <para>/* FIXME: new code that *may* break something else... */
-    ...new code here...</para>
-
-    <para><emphasis>Note:</emphasis> If you make it clear that this may or may not
-    be a "good thing (tm)", it will be easier to identify and
-    include in the project (or conversly exclude from the
-    project).</para>
-
-    
-  </sect3>
-
-  </sect2>
-
-    <sect2 id="s46"><title>Addendum: Template for files and function
-    comment blocks:</title>
-
-    <para><emphasis>Example for file comments:</emphasis></para>
-<programlisting>
-const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $";
-/*********************************************************************
- *
- * File        :  $S<!-- Break CVS Substitution -->ource$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $L<!-- Break CVS Substitution -->og$
- *
- *********************************************************************/
-
-
-#include "config.h"
-
-   ...necessary include files for us to do our work...
-
-const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
-</programlisting>
-
-    <para><emphasis>Note:</emphasis> This declares the rcs variables that should be
-    added to the "show-proxy-args" page. If this is a brand new
-    creation by you, you are free to change the "Copyright" section
-    to represent the rights you wish to maintain.</para>
-
-    <para><emphasis>Note:</emphasis> The formfeed character that is present right
-    after the comment flower box is handy for (X|GNU)Emacs users to
-    skip the verbige and get to the heart of the code (via
-    `forward-page' and `backward-page'). Please include it if you
-    can.</para>
-
-    <para><emphasis>Example for file header comments:</emphasis></para>
-<programlisting>
-#ifndef _FILENAME_H
-#define _FILENAME_H
-#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.12 2002/03/27 01:02:51 hal9 Exp $"
-/*********************************************************************
- *
- * File        :  $S<!-- Break CVS Substitution -->ource$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $L<!-- Break CVS Substitution -->og$
- *
- *********************************************************************/
-
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-   ... function headers here ...
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char FILENAME_rcs[];
-extern const char FILENAME_h_rcs[];
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef _FILENAME_H */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
-</programlisting>
-
-    <para><emphasis>Example for function comments:</emphasis></para>
-<programlisting>
-/*********************************************************************
- *
- * Function    :  FUNCTION_NAME
- *
- * Description :  (Fill me in with a good description!)
- *
- * parameters  :
- *          1  :  param1 = pointer to an important thing
- *          2  :  x      = pointer to something else
- *
- * Returns     :  0 => Ok, everything else is an error.
- *
- *********************************************************************/
-int FUNCTION_NAME( void *param1, const char *x )
-{
-   ...
-   return( 0 );
-
-}
-</programlisting>
-
-    <para><emphasis>Note:</emphasis> If we all follow this practice, we should be
-    able to parse our code to create a "self-documenting" web
-    page.</para>
-
-  </sect2>
-
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="cvs"><title>Version Control Guidelines</title>
-    <para>To be filled. note on cvs comments. don't comment what you did, comment
-why you did it.
-</para>
-  </sect1>
-
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="testing"><title>Testing Guidelines</title>
-    <para>To be filled.
-</para>
-
-    <!--   ~~~~~       New section      ~~~~~     -->
-    <sect2 id="testing-plan"><title>Testplan for releases</title>
-      <para>
-Explain release numbers. major, minor. developer releases. etc.
-
-<orderedlist numeration="arabic">
-          <listitem><para>
-Remove any existing rpm with rpm -e
-</para></listitem>
-          <listitem><para>
-Remove any file that was left over. This includes (but is not limited to)
-      <itemizedlist>
-                <listitem><para>/var/log/privoxy</para></listitem>
-                <listitem><para>/etc/privoxy</para></listitem>
-                <listitem><para>/usr/sbin/privoxy</para></listitem>
-                <listitem><para>/etc/init.d/privoxy</para></listitem>
-                <listitem><para>/usr/doc/privoxy*</para></listitem>
-              </itemizedlist>
-</para></listitem>
-          <listitem><para>
-Install the rpm. Any error messages?
-</para></listitem>
-          <listitem><para>start,stop,status <application>Privoxy</application> with the specific script
-      (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does
-      autostart work?</para></listitem>
-          <listitem><para>Start browsing. Does <application>Privoxy</application> work? Logfile written?</para></listitem>
-          <listitem><para>Remove the rpm. Any error messages? All files removed?</para></listitem>
-        </orderedlist>
-</para>
-    </sect2>
-
-    <!--   ~~~~~       New section      ~~~~~     -->
-    <sect2 id="testing-report"><title>Test reports</title>
-      <para>
-Please submit test reports only with the <ulink url="http://sourceforge.net/tracker/?func=add&amp;group_id=11118&amp;atid=395005">test form</ulink>
-at sourceforge. Three simple steps:
-        <itemizedlist>
-          
-          <listitem><para>Select category: the distribution you test on.</para></listitem>
-          <listitem><para>Select group: the version of <application>Privoxy</application> that we are about to release.</para></listitem>
-          <listitem><para>Fill the Summary and Detailed Description with something
-              intelligent (keep it short and precise).</para>
-          </listitem>
-        </itemizedlist>
-        Do not mail to the mailinglist (we cannot keep track on issues there).
-      </para>
-    </sect2>
-    
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="contact"><title>Contact the developers</title>
-    <para>Please see the user manual for information on how to contact the developers.
-    </para>
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="copyright"><title>Copyright and History</title>
-    <para>Please see the user manual for information on Copyright and History.
-    </para>
-  </sect1>
-  
-  <!--   ~~~~~       New section      ~~~~~     -->
-  <sect1 id="seealso"><title>See also</title>
-    <para>Please see the user manual for information on references.
-    </para>
-  </sect1>
-
-  <!--
-
-  This program is free software; you can redistribute it 
-  and/or modify it under the terms of the GNU General
-  Public License as published by the Free Software
-  Foundation; either version 2 of the License, or (at
-  your option) any later version.
-
-  This program is distributed in the hope that it will
-  be useful, but WITHOUT ANY WARRANTY; without even the
-  implied warranty of MERCHANTABILITY or FITNESS FOR A
-  PARTICULAR PURPOSE.  See the GNU General Public
-  License for more details.
-
-  The GNU General Public License should be included with
-  this file.  If not, you can view it at
-  http://www.gnu.org/copyleft/gpl.html
-  or write to the Free Software Foundation, Inc., 59
-  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-  $Log: developer-manual.sgml,v $
-  Revision 1.12  2002/03/27 01:02:51  hal9
-  Touch up on name change...
-
-  Revision 1.11  2002/03/26 22:29:55  swa
-  we have a new homepage!
-
-  Revision 1.10  2002/03/24 12:33:01  swa
-  more additions.
-
-  Revision 1.9  2002/03/24 11:01:05  swa
-  name change
-
-  Revision 1.8  2002/03/23 15:13:11  swa
-  renamed every reference to the old name with foobar.
-  fixed "application foobar application" tag, fixed
-  "the foobar" with "foobar". left junkbustser in cvs
-  comments and remarks to history untouched.
-
-  Revision 1.7  2002/03/11 13:13:27  swa
-  correct feedback channels
-
-  Revision 1.6  2002/02/24 14:25:06  jongfoster
-  Formatting changes.  Now changing the doctype to DocBook XML 4.1
-  will work - no other changes are needed.
-
-  Revision 1.5  2001/10/31 18:16:51  swa
-  documentation added: howto generate docs in text and html
-  format, howto move stuff to the webserver.
-
-  Revision 1.4  2001/09/23 10:13:48  swa
-  upload process established. run make webserver and
-  the documentation is moved to the webserver. documents
-  are now linked correctly.
-
-  Revision 1.3  2001/09/13 15:27:40  swa
-  cosmetics
-
-  Revision 1.2  2001/09/13 15:20:17  swa
-  merged standards into developer manual
-
-  Revision 1.1  2001/09/12 15:36:41  swa
-  source files for junkbuster documentation
-
-  Revision 1.3  2001/09/10 17:43:59  swa
-  first proposal of a structure.
-
-  Revision 1.2  2001/06/13 14:28:31  swa
-  docs should have an author.
-
-  Revision 1.1  2001/06/13 14:20:37  swa
-  first import of project's documentation for the webserver.
-
-  -->
-
-</article>
diff --git a/doc/source/faq.sgml b/doc/source/faq.sgml
deleted file mode 100644 (file)
index bbbf493..0000000
+++ /dev/null
@@ -1,1431 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/faq.sgml,v $
-
- Purpose     :  FAQ
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<article id="index">
-<artheader>
-<title>Privoxy Frequently Asked Questions</title>
-
-<pubdate>$Id: faq.sgml,v 1.31 2002/03/26 22:29:55 swa Exp $</pubdate>
-
-<authorgroup>
- <author>
-  <affiliation>
-   <orgname>By: Privoxy Developers</orgname>
-   </affiliation>
- </author>
-</authorgroup>
-
-<abstract>
- <para>
- This FAQ gives users and developers alike answers to frequently asked
- questions about <application>Privoxy</application>. 
- </para>
- <para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development.
-</para>
-
-
- <para>
-You can find the latest version of the document at <ulink url="http://www.privoxy.org/faq/">http://www.privoxy.org/faq/</ulink>.
-Please see the Contact section in the 
-<ulink url="http://www.privoxy.org/user-manual/contact.html">user-manual</ulink> if you want to contact the developers.
- </para>
-
-<!--   <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-</abstract>
-</artheader>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<!--
-<sect1 id="introduction"><title>Introduction</title>
-<para>
-   Fillme.
-</para>
-</sect1>
--->
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="questions"><title>Frequently Asked Questions</title>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="general"><title>General Information</title>
-
-<sect3 id="newjb"><title>What is this new version of <application>Privoxy</application>?</title>
- <para>
-  The original <application>Internet Junkbuster</application> (tm) is a 
-  copyrighted product of <ulink url="http://www.junkbusters.com">Junkbusters
-  Corporation</ulink>. Development of this effort stopped some time ago as of
-  version 2.0.2. Stefan Waldherr started the ijbswa project on <ulink
-  url="http://ijbswa.sourceforge.net">Sourceforge</ulink> to rekindle
-  development. Other developers subsequently joined with Stefan, and have
-  since added many new features, refinements and enhancements. 
- </para>
- <para>
-  The new <application>Privoxy</application> started with the same
-  <application>Junkbuster</application> code base, but has changed
-  significantly at this point. 
- </para>
-
-</sect3>
-
-
-<sect3>
-<title id="whyprivoxy">Why <quote>Privoxy</quote>? Why a name change at all?</title>
-<para>
- <application>Privoxy</application> is for <quote>Privacy Enhancing Proxy</quote>.
- There are possible legal complications from the continued use of the 
- <application>Junkbuster</application> name, which is a trademark of 
- <ulink url="http://junkbusters.com">Junkbusters Corporation</ulink>.
- (There are no objections from Junkbusters Corporation to the 
- <application>Privoxy</application> project itself though, and they 
- in fact still share our ideals and goals.)
-</para>
-
-<para>
- The developers also believed that there so many changes from the original 
- code, that it was time to make a clean break from the past and make 
- a name in their own right, especially now with the pending release of 
- version 3.0.
-
-</para>
-</sect3>
-
-
-<sect3 id="differs"><title>How does it differ from the old <application>Junkbuster?</application></title>
- <para>
-   All the old features remain. The new <application>Privoxy</application> 
-   still blocks ads and banners, still manages cookies, and still helps protect
-   your privacy. But, these are all enhanced, and many new features have been 
-   added, all in the same vein.
- </para>
- <para>
-  The configuration has changed significantly as well. This is something that
-  users will notice right off the bat. The <quote>blocklist</quote> file does
-  not exist any more. This is replaced by <quote>actions</quote> files, such
-  as <filename>default.actions</filename>. This is where most of the per site
-  configuration is now.
-
- </para>
-</sect3>
-
-<sect3 id="features"><title>What are some of the new features?</title>
-<!--
- This section is in both user-manual and faq. Please keep in sync!!!
--->
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-   Integrated browser based configuration and control utility (<ulink
-   url="http://p.p">http://p.p</ulink>). Browser-based tracing of rule
-   and filter effects.
-  </para>
- </listitem> 
-<!--
- <listitem>
-  <para>
-   Modularized configuration that will allow for system wide settings, and
-   individual user settings. (not implemented yet, probably a 3.1 feature)
-  </para>
- </listitem> 
--->
- <listitem>
-  <para>
-    Blocking of annoying pop-up browser windows.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Support for Perl Compatible Regular Expressions in the configuration files, and 
-   generally a more sophisticated and flexible configuration syntax over
-   previous versions. 
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   GIF de-animation. 
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Web page content filtering (removes banners based on size,
-   invisible <quote>web-bugs</quote>, JavaScript, pop-ups, status bar abuse,
-   etc.)
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Bypass many click-tracking scripts (avoids script redirection).
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Multi-threaded (POSIX and native threads).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Auto-detection and re-reading of config file changes.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   User-customizable HTML templates (e.g. 404 error page).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Improved cookie management features (e.g. session based cookies).
-  </para>
-</listitem> 
-
- <listitem>
-  <para>
-   Builds from source on most UNIX-like systems. Packages available for: Linux
-   (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   In addition, the configuration is much more powerful and versatile over-all.
-  </para>
-</listitem> 
-
- </itemizedlist>
-</para>
-
-</sect3>
-
-<sect3 id="proxymoron"><title>What is a <quote>proxy</quote>? How does
-<application>Privoxy</application> work? </title>
- <para>
-  When you connect to a web site with <application>Privoxy</application>, 
-  you are really connecting to your locally running version of 
-  <application>Privoxy</application>. <application>Privoxy</application>
-  intercepts your requests for the web page, and relays that to the 
-  <quote>real</quote> web site. The web site sends the HTTP data stream 
-  back to <application>Privoxy</application>, where
-  <application>Privoxy</application> can work its magic before it 
-  relays this data back to your web browser.
- </para>
-
- <para>
-  Since <application>Privoxy</application> sits between you and the 
-  WWW, it is in a position to intercept and completely manage all web traffic and 
-  HTTP content before it gets to your browser.
-  <application>Privoxy</application> uses various programming methods to do
-  this, all of which is under your control via the various configuration
-  files and options.
- </para>
-
- <para>
-  There are many kinds of proxies. <application>Privoxy</application> best 
-  fits the <quote>filtering proxy</quote> category.
- </para>
-
-</sect3>
-
-<sect3 id="browsers2"><title>My browser does the same things as
-<application>Privoxy</application>. Why should I use
-<application>Privoxy</application> at all?</title>
- <para>
-  Modern browsers do indeed have <emphasis>some</emphasis> of the same
-  functionality as <application>Privoxy</application>. Maybe this is
-  adequate for you. But <application>Privoxy</application> is much more
-  versatile and powerful, and can do a number of things that browsers just can't.
- </para>
- <para>
-  In addition, a proxy is good choice if you use multiple browsers, or 
-  have a LAN with multiple computers. This way all the configuration 
-  is in one place, and you don't have to maintain a similar configuration 
-  for possibly many browsers.
-
- </para>
-</sect3>
-
-
-
-<sect3 id="license"><title>Is there is a license or fee? What about a 
-warranty? Registration?</title>
- <para>
-  <application>Privoxy</application> is licensed under the 
-  GNU General Public License (GPL). It is free to use, copy, 
-  modify or distribute as you wish under the terms of this license.
-  See <ulink
-  url="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</ulink>
-  for specifics.
-  </para>
- <para>
-  There is no warranty of any kind, expressed, implied or otherwise. That is
-  something that would cost real money ;-) There is no registration either.
-  <application>Privoxy</application> really is <emphasis>free</emphasis>
-  in every respect!
-
- </para>
-</sect3>
-
-<sect3 id="jointeam"><title>I would like to help you, what do I do?</title>
-
-<sect4 id="jointeam-money"><title>Money Money Money</title>
-<para>
- We, of course, welcome donations and use the money for domain registering,
- regular world-wide get-togethers (hahaha). Anyway, we'll soon describe the
- process how to donate money to the team.
-</para>
-</sect4>
-
-<sect4 id="jointeam-work"><title>You want to work with us?</title>
-<para>
-   Well, helping the team is always a good idea. We welcome new developers,
-   RPM gurus or documentation makers. Simply get an account on sourceforge.net
-   and mail your id to the developer mailing list. Then read the
-   section Quickstart in the developers manual.
-</para>
-<para>
-Once we have added you to the team, you'll have write access to the CVS
-repository, and together we'll find a suitable task for you.
-</para>
-</sect4>
-
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="installation"><title>Installation</title>
-
-<sect3 id="whichbrowsers">
-<title>Which browsers are supported by <application>Privoxy</application>?</title>
-<para>
- Any browser that can be configured to use a <quote>proxy</quote>, which 
- is probably almost all browsers. Direct browser support is not necessary
- since <application>Privoxy</application> runs as a separate application and
- just exchanges standard HTML data with your browser.
-</para>
-</sect3>
-
-<sect3 id="whichos">
-<title>Which operating systems are supported?</title>
-<para>
- Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many 
- flavors of Unix.
-</para>
-
-<para>
- Source code is available, so porting to other operating systems, 
- is always a possibility.
-
-</para>
-</sect3>
-
-<sect3 id="newinstall"><title>Can I install  
- <application>Privoxy</application> over <application>Junkbuster</application>?</title>
- <para>
-   We recommend you uninstall <application>Junkbuster</application>
-   first to minimize conflicts and confusion. You may want to 
-   save your old configuration files for future reference. The configuration
-   is substantially changed.
- </para>
- <para>
-  See the <ulink
-  url="http://www.privoxy.org/user-manual/">user-manual</ulink> for
-  platform specific installation instructions. [FIXME: This is meant for after
-  the name change for 3.0!]
- </para>
-</sect3>
-
-<sect3>
-<title id="firststep">I just installed <application>Privoxy</application>. Is there anything 
-special I have to do now?</title>
-
-<para>
- All browsers must be told to use <application>Privoxy</application> 
- as a proxy by specifying the correct proxy address and port number 
- in the appropriate configuration area for the browser. See below.
-
-</para>
-
-</sect3>
-
-
-<sect3 id="localhost"><title>What is the proxy address of <application>Privoxy</application>?</title>
- <para>
-  If you set up the <application>Privoxy</application> to run on
-  the computer you browse from (rather than your ISP's server or some
-  networked computer on a LAN), the proxy will be on <quote>localhost</quote>
-  (which is the special name used by every computer on the Internet to refer
-  to itself) and the port will be 8118 (unless you have <application>Privoxy</application> to run on a different port with the
-  <emphasis>listen-address</emphasis> config option). 
- </para>
- <para>
-  When configuring your browser's proxy settings you typically enter
-  the word <quote>localhost</quote> in the boxes next to <quote>HTTP</quote>
-  and <quote>Secure</quote> (HTTPS) and then the number <quote>8118</quote>
-  for <quote>port</quote>.  This tells your browser to send all web 
-  requests to <application>Privoxy</application> instead of directly to the 
-  Internet.
- </para>
- <para>
-  <application>Privoxy</application> can also be used to proxy for 
-  a Local Area Network. In this case, your would enter either the IP 
-  address of the LAN host where <application>Privoxy</application> 
-  is running, or the equivalent hostname. Port assignment would be 
-  same as above.
- </para>
- <para>
-  <application>Privoxy</application> does not currently handle
-  protocols such as FTP, SMTP, IM, IRC, ICQ, or other Internet
-  protocols. 
- </para>
-</sect3>
-
-<sect3>
-<title id="nothing">I just installed <application>Privoxy</application>, and nothing is happening.
-All the ads are there. What's wrong?</title>
-
-<para>
- Did you configure your browser to use <application>Privoxy</application> 
- as a proxy? It does not sound like it. See above. You might also try flushing
- the browser's caches to force a full re-reading of pages. You can verify 
- that <application>Privoxy</application> is running, and your browser 
- is correctly configured by entering the special URL: 
- <ulink url="http://p.p/">http://p.p/</ulink>. This should give you 
- a banner that says <quote>This is Privoxy</quote> and 
- access to <application>Privoxy's</application> internal configuration. 
- If you see this, then you are good to go. If not, the browser or 
- <application>Privoxy</application> are not set up correctly.
-
-</para>
-
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="configuration"><title>Configuration</title>
-
-<sect3 id="newconfig"><title>Can I use my old config files?</title>
- <para>
-   There are major changes to <application>Junkbuster</application> 
-   configuration from version 2.0.x to 2.9.x and later. The older files will
-   not work at all. If this is the case, you will need to re-enter your old
-   data into the new configuration structure. This is probably also a good 
-   recommendation even if upgrading from 2.9.x to 3.x since there were 
-   many minor changes along the way.
- </para>
-</sect3>
-
-<sect3>
-<title id="actionsfile">What is an <quote>actions</quote> file?</title>
-
-<para>
- <quote>actions</quote> files are where various actions that
- <application>Privoxy</application> might take, are configured. 
- Typically, you would define a set of default actions that apply 
- to all URLs, then add exceptions to these defaults.
-</para>
-<para>
- Actions can be defined on a per site basis, or for groups of sites. Actions
- can also be grouped together and then applied to one or more sites. There
- are many possible actions that might apply to any given site. As an example,
- if we are blocking cookies as one of our default
- <application>actions</application>, but need to accept cookies from a given
- site, we would define this in our <quote>actions</quote> file.
-
-</para>
-
-<para>
- <application>Privoxy</application> comes with several default
- <application>actions</application> files, with varying degrees 
- of filtering and blocking, as starting points for your own 
- configuration (see below).
-</para>
-
-</sect3>
-
-<sect3 id="actionss">
-<title>The <quote>actions</quote>concept confuses me. Please list 
-some of these <quote>actions</quote>.</title>
-<para>
- These are all explained in the 
- <ulink url="../user-manual/configuration.html#ACTIONSFILE">user-manual</ulink>.
- Please refer to that.
-</para>
-</sect3>
-
-
-<sect3>
-<title id="actconfig">How are actions files configured? What is the easiest
-way to do this?</title> 
-
-<para>
- The easiest way to do this, is to access <application>Privoxy</application>
- with your web browser at <ulink url="http://p.p/">http://p.p/</ulink>, 
- and then select 
- "<ulink url="http://www.privoxy.org/config/edit-actions">Edit the actions list</ulink>"
- from the selection list. You can also do this by editing the appropriate 
- file with a text editor.
-</para>
-
-<para>
- Please see the 
- <ulink
- url="../user-manual/configuration.html#ACTIONSFILE">user-manual</ulink> for a
- detailed explanation of these and other configuration files, and their
- various options and syntax.
-</para>
-</sect3>
-
-
-<!--
-FIXME: Commenting these out until we have some data there. HB 03/17/02.
-
-<sect3 id="yahoo"><title>How can I make my Yahoo account work?</title>
- <para>
-   Fillme.
- </para>
-</sect3>
-
-<sect3 id="hotmail"> <title>How can I make my Hotmail account work?</title>
-  <para>
-   Fillme.
-  </para>
-</sect3>
-
-<sect3 id="gmx"> <title>How can I make my GMX account work?</title>
- <para>
-   Fillme.
- </para>
-</sect3>
--->
-
-<sect3 id="configfiles"> <title>What are the differences between
-intermediate.action, basic.action, etc.?</title>
- <para>
-Configuring <application>Privoxy</application> is not easy. To help you get
-started, we provide you with three different default configurations. The
-following table shows you, which features are enabled in each configuration.
- </para>
- <para>
-<table frame=all><title>Default Configurations</title>
-<tgroup cols=5 align=left colsep=1 rowsep=1>
-<colspec colname=c1>
-<colspec colname=c2>
-<colspec colname=c3>
-<colspec colname=c4>
-<colspec colname=c5>
-<thead>
-<row>
-  <entry>Feature</entry>
-  <entry>default.action</entry>
-  <entry>basic.action</entry>
-  <entry>intermediate.action</entry>
-  <entry>advanced.action</entry>
-</row>
-</thead>
-
-<!--  <tfoot> -->
-<!--  <row> -->
-<!--    <entry>f1</entry> -->
-<!--    <entry>f2</entry> -->
-<!--    <entry>f3</entry> -->
-<!--    <entry>f4</entry> -->
-<!--    <entry>f5</entry> -->
-<!--  </row> -->
-<!--  </tfoot> -->
-
-<tbody>
-<!-- new row -->
-<row>
-  <entry>ad-filtering</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>blank image</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>de-animate GIFs</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>referer forging</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>jon's +no-cookies-keep (i.e. session cookies only)</entry>
-  <entry>?</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>no-popup windows</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>fast redirects</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>hide-referrer</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>hide-useragent</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry>x</entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>content-modification</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry>x</entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-x</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-y</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- new row -->
-<row>
-  <entry>feature-z</entry>
-  <entry>?</entry>
-  <entry></entry>
-  <entry></entry>
-  <entry></entry>
-</row>
-<!-- finish -->
-</tbody>
-</tgroup>
-</table>
-</para>
-</sect3>
-
-<sect3 id="browseconfig"> <title>Why can I change the configuration with a
-browser? Does that not raise security issues?</title>
- <para>
-What I don't understand, is how I can browser edit the config file as a
-regular user, while the whole /etc/privoxy hierarchy belongs to the user
-"privoxy", with only 644 perms.
- </para>
- <para>
-When you use the browser-based editor, <application>Privoxy</application>
-itself is writing to the config files.  Because
-<application>Privoxy</application> is running as the user "privoxy", it can
-update the config files.
- </para>
- <para>
-If you don't like this, setting "enable-edit-actions 0" in the config file
-will disable the browser-based editor.  If you're that paranoid, you should
-also consider setting "enable-remote-toggle 0" to prevent browser-based
-enabling/disabling of <application>Privoxy</application>.
- </para>
- <para>
-Note that normally only local users can connect to <application>Privoxy</application>, so this is not
-(normally) a security problem.
- </para>
-</sect3>
-
-
-<sect3>
-<title id="filterfile">What is a <quote>default.filter</quote>?</title>
-<para>
- The <quote>default.filter</quote> file is used to <quote>filter</quote> any
- web page content. By <quote>filtering</quote> we mean it can modify, remove, 
- or change <emphasis>anything</emphasis> on the page, including HTML tags, and
- JavaScript. Regular expressions are used to accomplish this, and operate 
- on a line by line basis. This is potentially a very powerful feature, but
- requires some expertise. 
-</para>
-
-<para>
- If you are familiar with regular expressions, and HTML, you can look at 
- the provided <filename>default.filter</filename> with a text editor and see
- some of things it can be used for.
-</para>
-
-<para>
- Presently, there is no GUI editor option for this part of the configuration, 
- but you can disable/enable various sections of the included default 
- file with the <quote>Actions List Editor</quote> from your browser.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="lanconfig">How can I set up <application>Privoxy</application> to act as a proxy for my 
- LAN?</title>
-<para>
- By default, <application>Privoxy</application> only responds to requests 
- from localhost. To have it act as a server for a network, this needs to be 
- changed in the main config file where the <application>Privoxy</application>
- configuration is located. In that file is a <quote>listen-address</quote> 
- option. It may be commented out with a <quote>#</quote> symbol. Make sure 
- it is uncommented, and assign it the address of the LAN gateway interface, 
- and port number to use:
-</para>
-
-<para>
- <screen>
-  listen-address  192.168.1.1:8118
- </screen>
-</para>
-
-<para>
- Save the file, and restart <application>Privoxy</application>. Configure 
- all browsers on the network then to use this address and port number.
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="noseeum">Instead of ads, now I get a checkerboard pattern. I don't want to see anything.</title>
-<para>
- This is a configuration option for images that
- <application>Privoxy</application> is stopping. You have the choice <!-- of
- the --> <!-- <application>Privoxy</application> logo, --> a checkerboard
- pattern, a transparent 1x1 GIF image (aka <quote>blank</quote>), or a custom
- URL or your choice.
-</para>
-
-<para>
- If you want to see nothing, then change the <quote>+image-blocker</quote> 
- action to <quote>+image-blocker{blank}</quote>. This can be done from the 
- <quote>Edit Actions List</quote> selection at <ulink
- url="http://p.p/">http://p.p/</ulink>. Or by hand editing the appropriate 
- actions file. This will only effect what is defined as <quote>images</quote>
- though. 
-
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="whyseeum">Why would anybody want to see a checkerboard pattern?</title>
-<para>
- This can be helpful for troubleshooting problems. It might also be good 
- for anyone new to <application>Privoxy</application> so that they can 
- see if their favorite pages are displaying correctly, and
- <application>Privoxy</application> is not inadvertently removing something 
- important.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="blockedisugly">I see large red banners on some pages that say 
-<quote>Blocked</quote>. How do I get rid of this?</title>
-<para>
- These are URLs that match something in one of 
- <application>Privoxy's</application> block actions (+block). It is meant
- to be a warning so that you know something has been blocked and an easy way
- for you to see why. These are handled differently than what has been defined
- as <quote>images</quote> (e.g. ad banners). If you want them to be treated
- as if they were images, so that they can be made invisible, then move the
- offending URL from the <quote>+block</quote> section to the
- <quote>+imageblock</quote> section of your actions file. Alternately, you
- could modify the <quote><filename>block</filename></quote> HTML template that
- is used by <application>Privoxy</application> to display this, and make it
- something more to your liking.
-</para>
-
-</sect3>
-
-<sect3 id="otherproxy">
-<title>How can I make <application>Privoxy</application> work with other 
-proxies like <application>Squid</application>?</title>
-<para>
- This can be done. See the <ulink
- url="../user-manual/configuration.html#FORWARDING">user manual</ulink>, 
- which describes how to do this.
-
-</para>
-
-</sect3>
-
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2 id="misc"><title>Miscellaneous</title>
-
-<sect3>
-<title id="slowsme">How much does <application>Privoxy</application> slow my browsing down? This 
-has to add extra time to browsing.</title>
-<para>
- It should not slow you down any in real terms, and may actually help 
- speed things up since ads, banners and other junk are not being displayed.
- The actual processing time required by <application>Privoxy</application> 
- itself for each page, is relatively small in the overall scheme of things,
- and happens very quickly. This is typically more than offset by time saved
- not downloading and rendering ad images.
-</para>
-
-<para>
- <quote>Filtering</quote> via the <filename>filterfile</filename> 
- mechanism may cause a perceived slowdown, since the entire page is buffered
- before displaying. See below.
-</para>
-
-</sect3>
-
-
-
-<sect3 id="loadingtimes"><title>I noticed considerable
-delays in page requests compared to the old Junkbuster. What's wrong?</title>
-<para>
-Using the default filtering configuration, I noticed considerable delays in
-page requests compared to the old Junkbuster. Loading pages with large contents
-seemed to take forever, then suddenly delivering all the content at once.
- </para>
-<para>
-The whole content must be loaded in order to filter, and nothing is is
-sent to the browser during this time. The loading time does not really
-change in real numbers, but the feeling is different, because most
-browsers are able to start rendering incomplete content, giving the
-user a feeling of "it works". 
- </para>
-<para>
-To modify the content of a page (i.e. make frames resizeable again, etc.) and
-not just replace ads, <application>Privoxy</application> needs to download the
-entire page first, do its content magic and then send the page to the browser.
-</para>
-</sect3>
-
-
-<sect3 id="configurl"><title>What is the "http://p.p/"?</title>
-<para>
-Since <application>Privoxy</application> sits between your web browser and the Internet, it can be
-programmed to handle certain pages specially.
-</para>
-
-<para>
-With recent versions of <application>Privoxy</application> (version 2.9.x), you can get some
-information about <application>Privoxy</application> and change some settings by going to
-http://p.p/ or, equivalently, http://www.privoxy.org/config/
-(Note that p.p is far easier to type but may not work in some
-configurations).
-</para>
-
-<para>
-These pages are *not* forwarded to a server on the Internet - instead they are
-handled by a special web server which is built in to <application>Privoxy</application>.
-</para>
-
-<para>
-If you are not running <application>Privoxy</application>, then http://p.p/ will fail, and
-http://www.privoxy.org/config/ will return a web page telling you
-you're not running <application>Privoxy</application>.
-</para>
-
-<para>
-If you have version 2.0.2, then the equivalent is
-http://example.com/show-proxy-args (but you get far less information, and you
-should really consider upgrading to 2.9.x).
-</para>
-</sect3>
-
-<!--
-FIXME: commented out until we have data. HB 03/18/02.
-
-<sect3 id="badfiledesc"><title>I get the message 'Bad File Descriptor', why?</title>
-<para>
-   Fillme.
-</para>
-</sect3>
-
-<sect3 id="proxy-chaining"><title>How do I chain <application>Privoxy</application> with other proxies
-(e.g. squid)?</title>
-<para>
-   Fillme.
-</para>
-</sect3>
--->
-
-<sect3 id="blocklist"><title>Do you still maintain the blocklists?</title>
-<para>
-    No. The format of the blocklists has changed significantly in the versions
-    2.9.x. Once we have released the new version, there will again be
-    blocklists that you can update automatically.
-</para>
-</sect3>
-
-<sect3 id="newads"><title>How can I submit new ads?</title>
-<para>
-    As of now, please discontinue to submit new ad blocking infos. Once we
-    have released the new version, there will again be a form on the website,
-    which you can use to contribute new ads.
-</para>
-</sect3>
-
-<sect3 id="ip"><title>How can I hide my IP address?</title>
-<para>
- You cannot hide your IP address with <application>Privoxy</application> or any other software, since
-the server needs to know your IP address to send the answer to you.
-</para>
-<para>
-Fortunately there are many publicly usable anonymous proxies out there, which
-solve the problem by providing a further level of indirection between you and
-the web server, shared by many people and thus letting your requests "drown"
-in white noise of unrelated requests as far as user tracking is concerned.
-</para>
-<para>
-Most of them will, however, log your IP address and make it available to the
-authorities in case you abuse that anonymity for criminal purposes. In fact
-you can't even rule out that some of them only exist to *collect* information
-on (those suspicious) people with a more than average preference for privacy.
-</para>
-<para>
-You can find a list of anonymous public proxies at <ulink
-url="http://www.multiproxy.org/anon_list.htm">multiproxy.org</ulink> and many
-more through Google.
-</para>
-</sect3>
-
-<!--  <sect3 id="image"><title>What is the imagefile (simage.ini, etc.) for?</title> -->
-<!--  <para> -->
-<!--   Anytime <application>Privoxy</application> determines (with the help of the blocklist) that a URL -->
-<!--   contains an advertisement, it has to decide whether this advertisement is an -->
-<!--   image or not. <application>Privoxy</application> uses the imagefile for that purpose. -->
-<!--  </para> -->
-<!--  </sect3> -->
-
-<sect3>
-<title id="anonforsure">Can <application>Privoxy</application> guarantee I am anonymous?</title>
-<para>
- No. Your chances of remaining anonymous are greatly improved, but unless you
- are an expert on Internet security it would be safest to assume that
- everything you do on the Web can be traced back to you.
-</para>
-<para>
- <application>Privoxy</application> can remove various information about you,
- and allows <emphasis>you</emphasis> more freedom  to decide which sites 
- you can trust. But it's still possible that web sites can find out who you
- are. Here's one way this can happen.
-</para>
-<para>
- A few browsers disclose the user's email address in certain situations, such
- as when transferring a file by FTP. <application>Privoxy</application>
- does not filter FTP. If you need this feature, or are concerned about the
- mail handler of your browser disclosing your email address, you might
- consider products such as <application>NSClean</application>.
-</para>
-<para>
- Browsers available only as binaries could use non-standard headers to give
- out any information they can have access to: see the manufacturer's license
- agreement. It's impossible to anticipate and prevent every breach of privacy
- that might occur. The professionally paranoid prefer browsers available as
- source code, because anticipating their behavior is easier. Trust the source,
- Luke!
-</para>
-
-</sect3>
-
-<sect3>
-<title id="sitebreak">Might some things break because header information is
-being altered?</title>
-
-<para>
- Definitely. More and more sites use HTTP header content to decide what to
- display and how to display it. There is many ways that this can be handled, 
- so having hard and fast rules, is tricky.
-</para>
-
-<para>
- <quote>USER AGENT</quote> in particular is often used in this way to identify
- the browser, and adjust content accordingly. Changing this now is not
- recommended, since so many sites do look for this. You may get undesirable 
- results by changing this.
-</para>
-
-<para>
- For instance, different browsers use different encodings of Russian and Czech
- characters, certain web servers convert pages on-the-fly according to the
- User Agent header. Giving a <quote>User Agent</quote> with the wrong
- operating system or browser manufacturer causes some sites in these languages
- to be garbled; Surfers to Eastern European sites should change it to
- something closer. And then some page access counters work by looking at the
- <quote>REFERER</quote> header; they may fail or break if unavailable. The
- weather maps of Intellicast have been blocked by their server when no
- <quote>REFERER</quote> or cookie is provided, is another example. There are
- many, many other ways things can go wrong when trying to fool a web server.
-</para>
-
-<para>
- If you have problems with a site, you will have to adjust your configuration 
- accordingly. Cookies are probably the most likely adjustment that may 
- be required, but by no means the only one.
-
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="caching">Can <application>Privoxy</application> act as a <quote>caching</quote> proxy to 
-speed up web browsing?</title>
-<para>
- No, it does not have this ability at all. You want something like 
- <ulink url="http://www.squid-cache.org/">Squid</ulink> for this. And, yes, 
- before you ask, <application>Privoxy</application> can co-exist 
- with other kinds of proxies like <quote>Squid</quote>.
-</para>
-</sect3>
-
-<sect3>
-<title id="firewall">What about as a firewall? Can <application>Privoxy</application> protect me?</title>
-<para>
- Not in the way you mean, or in the way a true firewall can, or a proxy that
- has this specific capability. <application>Privoxy</application> can help
- protect your privacy, but not really protect you from intrusion attempts.
-</para>
-</sect3>
-
-
-<sect3>
-<title id="logo">The <application>Privoxy</application> logo that replaces ads is very blocky 
-and ugly looking. Can't a better font be used?</title>
-
-<para>
- This is not a font problem. The logo is an image that is created by 
- <application>Privoxy</application> on the fly. So as to not waste 
- memory, the image is rather small. The blockiness comes when the 
- image is scaled to fill a largish area. There is not much to be done 
- about this, other than to use one of the other
- <quote>imageblock</quote> directives: <emphasis>pattern</emphasis>, 
- <emphasis>blank</emphasis>, or a URL of your choosing.
-</para>
-<para>
-Given the above problem, we have decided to remove the logo option entirely 
-[as of v2.9.13].
-</para>
-</sect3>
-
-
-<sect3>
-<title id="wasted">I have large empty spaces now where ads used to be. 
-Why does <application>Privoxy</application> leave these large gaps?</title>
-<para>
- It would be easy enough to just eliminate this space altogether, rather than
- fill it with blank space. But, this would create problems with many pages
- that use the overall size of the ad to help organize the page layout and
- position the various components of the page where they were intended to be.
- It is best left this way.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="ssl">How can <application>Privoxy</application> filter Secure (HTTPS) URLs?</title>
-<para>
- This is a limitation since HTTPS transactions are encrypted SSL sessions
- between your browser and the secure site, and are meant to be reliably 
- <emphasis>secure</emphasis> and private. This means that all cookies and HTTP
- header information are also encrypted from the time they leave your browser,
- to the site, and vice versa. <application>Privoxy</application> does not
- try to unencrypt this information, so it just passes through as is.
- <application>Privoxy</application> can still catch images and ads that
- are embedded in the SSL stream though.
-</para>
-
-</sect3>
-
-
-<sect3>
-<title id="secure"><application>Privoxy</application> runs as a <quote>server</quote>. How 
-secure is it? Do I need to take any special precautions?</title>
-<para>
- There are no known exploits that might effect
- <application>Privoxy</application>. On Unix-like systems, 
- <application>Privoxy</application> can run as a non-privileged 
- user, which is how we recommend it be run. Also, by default 
- <application>Privoxy</application> only listens to requests 
- from <quote>localhost</quote>. It is not itself directly exposed to the
- Internet in this configuration. If you want to have
- <application>Privoxy</application> serve as a LAN proxy, this will have to
- be opened up to allow for LAN requests. In this case, we'd recommend
- you specify only the LAN gateway address, e.g. 192.168.1.1 in the main 
- <application>Privoxy</application> config file. All LAN hosts can then use 
- this as their proxy address in the browser proxy configuration. In this way, 
- <application>Privoxy</application> will not listen on any external ports.
- Of course, a firewall is always good too. Better safe than sorry.
-</para>
-
-</sect3>
-
-<sect3 id="turnoff">
-<title>How can I temporarily disable <application>Privoxy</application>?</title>
-<para>
- The easiest way is to access <application>Privoxy</application> with your 
- browser by using the special URL: <ulink url="http://p.p/">http://p.p/</ulink>
- and select "Toggle Privoxy on or off" from that page.
-
-</para>
-</sect3>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title id="trouble">Troubleshooting</title>
-
-<sect3>
-<title id="refused">I just upgraded and am getting <quote>connection refused</quote>
-with every web page?</title>
-<para>
- Either <application>Privoxy</application> is not running, or your 
- browser is configured for a different port than what
- <application>Privoxy</application> is using.
-</para>
-
-<para>
- The old <application>Privoxy</application> (and also
- <application>Junkbuster</application>) used port 8000 by 
- default. This has been changed to port 8118 now, due to a conflict 
- with NAS (Network Audio Service), which uses port 8000. If you haven't, 
- you need to change your browser to the new port number, or alternately 
- change <application>Privoxy's</application> <quote>listen-address</quote>
- setting in the <filename>config</filename> file used to start 
- <application>Privoxy</application>.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="flushit">I just added a new rule, but the steenkin ad is 
-still getting through. How?</title>
-<para>
- If the ad had been displayed before you added its URL, it will probably be
- held in the browser's cache for some time, so it will be displayed without
- the need for any request to the server, and <application>Privoxy</application>
- will not be in the picture. The best thing to do is try flushing the browser's
- caches. And then try again.
-</para>
-
-<para>
- If this doesn't help, you probably have an error in the rule you
- applied. Try pasting the full URL of the offending ad into <ulink
- url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
- and see if any actions match your new rule.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="badsite">One of my favorite sites does not work with <application>Privoxy</application>.
-What can I do?</title>
-
-<para>
- First verify that it is indeed a <application>Privoxy</application> problem, 
- by disabling <application>Privoxy</application> filtering and blocking. 
- Go to <ulink url="http://p.p/">http://p.p/</ulink> and click on 
- <quote>Toggle Privoxy On or Off</quote>, then disable it. Now try that 
- page again.
-</para>
-
-<para>
- If still a problem, go to <quote>Show which actions apply to a URL and
- why</quote> from <ulink url="http://p.p/">http://p.p/</ulink> and paste
- the full URL of the page in question into the prompt. See which actions are
- being applied to the URL. Now, armed with this information, go to <quote>Edit
- the actions list</quote>. Here you should see various sections that have
- various <application>Privoxy</application> features disabled for specific
- sites. Disabled <quote>actions</quote> will have a <quote>-</quote> (minus
- sign) in front of them. Add your problem page URL to one of these sections
- that looks like it is disabling the feature that is causing the
- problem. Re-try the page. There might be some trial and error involved. This
- is discussed in a little more detail in the <ulink
- url="../user-manual/appendix.html#ACTIONSANAT">user-manual
- appendix</ulink>.
-
-</para>
-
-<para>
- Alternately, if you are comfortable with a text editor, you can accomplish 
- the same thing by editing the appropriate <quote>actions</quote> file.
-</para>
-
-</sect3>
-
-<sect3>
-<title id="time">What time is it?</title>
-<para>
- Time for you to go!
-</para>
-</sect3>
-
-</sect2>
-
-</sect1>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<!--
-FIXME: Commented out until we have something to put here. HB 03/18/02.
-<sect1 id="knownissues"><title>Known Issues</title>
-<para>
-   Fillme.
-</para>
-</sect1>
--->
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<!--
-
-This is referenced in the doc header already. HB 03/25/02
-
-<sect1 id="contact"><title>Contact the developers</title>
-<para>Please see the user manual for information on how to contact the developers.
-</para>
-</sect1>
--->
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="copyright"><title>Copyright and History</title>
-<para>Please see the user manual for information on Copyright and History.
-</para>
-</sect1>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="seealso"><title>See also</title>
-<para>Please see the user manual for information on references.
-</para>
-</sect1>
-
-<!-- hhmts end -->
- <!--
- Tue 09/11/01 06:38:14 PM EST: Test SGML doc by Hal Burgiss.
- Last modified: Mon Sep 10 19:22:09 CEST 2001
- This program is free software; you can redistribute it 
- and/or modify it under the terms of the GNU General
- Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will
- be useful, but WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A
- PARTICULAR PURPOSE.  See the GNU General Public
- License for more details.
-
- The GNU General Public License should be included with
- this file.  If not, you can view it at
- http://www.gnu.org/copyleft/gpl.html
- or write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-$Log: faq.sgml,v $
-Revision 1.31  2002/03/26 22:29:55  swa
-we have a new homepage!
-
-Revision 1.30  2002/03/25 16:39:22  hal9
-A few new sections. Made all links relative to user-manual.
-
-Revision 1.29  2002/03/25 05:23:57  hal9
-Moved section, and touch ups.
-
-Revision 1.28  2002/03/25 04:27:33  hal9
-New section related to name change.
-
-Revision 1.25  2002/03/24 16:08:08  swa
-we are too lazy to make a block-built
-privoxy logo. hence removed the option.
-
-Revision 1.24  2002/03/24 15:46:20  swa
-name change related issue.
-
-Revision 1.23  2002/03/24 12:33:01  swa
-more additions.
-
-Revision 1.22  2002/03/24 11:51:00  swa
-name change. changed filenames.
-
-Revision 1.21  2002/03/24 11:01:06  swa
-name change
-
-Revision 1.20  2002/03/23 15:13:11  swa
-renamed every reference to the old name with foobar.
-fixed "application foobar application" tag, fixed
-"the foobar" with "foobar". left junkbustser in cvs
-comments and remarks to history untouched.
-
-Revision 1.19  2002/03/21 17:01:54  hal9
-Some touch ups.
-
-Revision 1.18  2002/03/18 16:40:31  hal9
-More additions.
-
-Revision 1.17  2002/03/18 03:53:53  hal9
-Some new additions.
-
-Revision 1.16  2002/03/17 21:32:56  hal9
-A few more additions.
-
-Revision 1.15  2002/03/17 07:25:59  hal9
-Correcting some of my typos, and some additions.
-
-Revision 1.14  2002/03/17 02:39:13  hal9
-A little more added ...
-
-Revision 1.13  2002/03/17 00:22:20  hal9
-Adding new stuff, and trying to incorporate stuff from old faq.
-
-Revision 1.12  2002/03/11 20:13:21  swa
-typo
-
-Revision 1.11  2002/03/11 18:42:27  swa
-new section
-
-Revision 1.10  2002/03/11 13:13:27  swa
-correct feedback channels
-
-Revision 1.9  2002/03/10 23:34:04  swa
-more info on not hiding ip address
-
-Revision 1.8  2002/03/09 15:55:48  swa
-added default config section
-
-Revision 1.7  2002/03/07 18:16:55  swa
-looks better
-
-Revision 1.6  2002/03/07 13:16:31  oes
-Committing changes by Stefan
-
-Revision 1.5  2002/03/02 15:50:04  swa
-2.9.11 version. more input for docs.
-
-Revision 1.4  2002/02/24 14:34:24  jongfoster
-Formatting changes.  Now changing the doctype to DocBook XML 4.1
-will work - no other changes are needed.
-
-Revision 1.3  2001/09/23 10:13:48  swa
-upload process established. run make webserver and
-the documentation is moved to the webserver. documents
-are now linked correctly.
-
-Revision 1.2  2001/09/13 15:20:17  swa
-merged standards into developer manual
-
-Revision 1.1  2001/09/12 15:36:41  swa
-source files for junkbuster documentation
-
-Revision 1.3  2001/09/10 17:43:59  swa
-first proposal of a structure.
-
-Revision 1.2  2001/06/13 14:28:31  swa
-docs should have an author.
-
-Revision 1.1  2001/06/13 14:20:37  swa
-first import of project's documentation for the webserver.
-
--->
-
-</article>
diff --git a/doc/source/ldp.dsl b/doc/source/ldp.dsl
deleted file mode 100644 (file)
index e4352a5..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [\r
-<!ENTITY % html "IGNORE">\r
-<![%html;[\r
-<!ENTITY % print "IGNORE">\r
-<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/html/docbook.dsl" CDATA dsssl>\r
-]]>\r
-<!ENTITY % print "INCLUDE">\r
-<![%print;[\r
-<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets/print/docbook.dsl" CDATA dsssl>\r
-]]>\r
-]>\r
-\r
-<!--\r
-\r
-;; borrowed from the LDP stylesheet, with modifications, HB.\r
-;; Added support for css 03/20/02, and other mods.\r
-\r
--->\r
-\r
-<style-sheet>\r
-\r
-<style-specification id="print" use="docbook">\r
-<style-specification-body> \r
-\r
-;; ==============================\r
-;; customize the print stylesheet\r
-;; ==============================\r
-\r
-</style-specification-body>\r
-</style-specification>\r
-\r
-\r
-<!--\r
-;; ===================================================\r
-;; customize the html stylesheet; borrowed from Cygnus\r
-;; at http://sourceware.cygnus.com/ (cygnus-both.dsl)\r
-;; ===================================================\r
--->\r
-\r
-<style-specification id="html" use="docbook">\r
-<style-specification-body> \r
-\r
-;; this is necessary because right now jadetex does not understand\r
-;; symbolic entities, whereas things work well with numeric entities.\r
-(declare-characteristic preserve-sdata?\r
-  "UNREGISTERED::James Clark//Characteristic::preserve-sdata?"\r
-  #f)\r
-\r
-;; put the legal notice in a separate file\r
-(define %generate-legalnotice-link%\r
-  #t)\r
-\r
-;; use graphics in admonitions, and have their path be "stylesheet-images"\r
-;; NO: they do not yet look very good\r
-(define %admon-graphics-path%\r
-  "./stylesheet-images/")\r
-\r
-(define %admon-graphics%\r
-  #f)\r
-\r
-(define %funcsynopsis-decoration%\r
-  ;; make funcsynopsis look pretty\r
-  #t)\r
-\r
-(define %html-ext%\r
-  ".html")\r
-\r
-(define %generate-article-toc% \r
-  ;; Should a Table of Contents be produced for Articles?\r
-  ;; If true, a Table of Contents will be generated for each 'Article'.\r
-  #t)\r
-\r
-(define %root-filename%\r
-  ;; The filename of the root HTML document (e.g, "index").\r
-  "index")\r
-\r
-(define %generate-part-toc%\r
-  #t)\r
-\r
-(define %shade-verbatim%\r
-  #t)\r
-\r
-(define %use-id-as-filename%\r
-  ;; Use ID attributes as name for component HTML files?\r
-  #t)\r
-\r
-(define %graphic-default-extension% \r
-  "gif")\r
-\r
-(define %section-autolabel%\r
-  ;; For enumerated sections (1.1, 1.1.1, 1.2, etc.)\r
-  #t)\r
-\r
-;; HB changed TOC depth to 3 levels.\r
-(define (toc-depth nd)\r
-  3)\r
-\r
-;; HB added 03/20/02, see dbparam.dsl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\r
-\r
-(define %body-attr% \r
-  ;; REFENTRY body-attr\r
-  ;; PURP What attributes should be hung off of BODY?\r
-  ;; DESC\r
-  ;; A list of the the BODY attributes that should be generated.\r
-  ;; The format is a list of lists, each interior list contains the\r
-  ;; name and value of a BODY attribute.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  (list\r
-   (list "BGCOLOR" "#EEEEEE")\r
-   (list "TEXT" "#000000")\r
-   (list "LINK" "#0000FF")\r
-   (list "VLINK" "#840084")\r
-   (list "ALINK" "#0000FF")))\r
-\r
-(define %stylesheet%\r
-  ;; REFENTRY stylesheet\r
-  ;; PURP Name of the stylesheet to use\r
-  ;; DESC\r
-  ;; The name of the stylesheet to place in the HTML LINK TAG, or '#f' to\r
-  ;; suppress the stylesheet LINK.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  "../p_doc.css")\r
-\r
-(define %stylesheet-type%\r
-  ;; REFENTRY stylesheet-type\r
-  ;; PURP The type of the stylesheet to use\r
-  ;; DESC\r
-  ;; The type of the stylesheet to place in the HTML LINK TAG.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  "text/css")\r
-\r
-(define %css-liststyle-alist%\r
-  ;; REFENTRY css-liststyle-alist\r
-  ;; PURP Map DocBook OVERRIDE and MARK attributes to CSS\r
-  ;; DESC\r
-  ;; If '%css-decoration%' is turned on then the list-style-type property of\r
-  ;; list items will be set to reflect the list item style selected in the\r
-  ;; DocBook instance.  This associative list maps the style type names used\r
-  ;; in your instance to the appropriate CSS names.  If no mapping exists,\r
-  ;; the name from the instance will be used.\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  '(("bullet" "disc")\r
-    ("box" "square")))\r
-\r
-(define %css-decoration%\r
-  ;; REFENTRY css-decoration\r
-  ;; PURP Enable CSS decoration of elements\r
-  ;; DESC\r
-  ;; If '%css-decoration%' is turned on then HTML elements produced by the\r
-  ;; stylesheet may be decorated with STYLE attributes.  For example, the\r
-  ;; LI tags produced for list items may include a fragment of CSS in the\r
-  ;; STYLE attribute which sets the CSS property "list-style-type".\r
-  ;; /DESC\r
-  ;; AUTHOR N/A\r
-  ;; /REFENTRY\r
-  #t)\r
-\r
-\r
-</style-specification-body>\r
-</style-specification>\r
-\r
-<external-specification id="docbook" document="docbook.dsl">\r
-\r
-</style-sheet>\r
diff --git a/doc/source/user-manual.sgml b/doc/source/user-manual.sgml
deleted file mode 100644 (file)
index 1e9723e..0000000
+++ /dev/null
@@ -1,4197 +0,0 @@
-<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
-<!--
- File        :  $Source: /cvsroot/ijbswa/current/doc/source/user-manual.sgml,v $
-
- Purpose     :  user manual
-                This file belongs into
-                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-                
- $Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $
-
- Written by and Copyright (C) 2001 the SourceForge
- Privoxy team. http://www.privoxy.org/
-
- Based on the Internet Junkbuster originally written
- by and Copyright (C) 1997 Anonymous Coders and 
- Junkbusters Corporation.  http://www.junkbusters.com
--->
-
-<!--
-Sat 03/02/02 04:53:47 PM
-
-This should be ready for BETA release.
-
-Hal Burgiss <hal@foobox.net>
--->
-
-<article id="index">
-<artheader>
-<title>Privoxy User Manual</title>
-
-<pubdate>$Id: user-manual.sgml,v 1.59 2002/03/27 00:54:33 hal9 Exp $</pubdate>
-
-<authorgroup>
- <author>
-  <affiliation>
-   <orgname>By: Privoxy Developers</orgname>
-   </affiliation>
- </author>
-</authorgroup>
-
-<abstract>
- <para>
-  The user manual gives users information on how to install, configure and use
-  <application>Privoxy</application>. <application>Privoxy</application> is a
-  web proxy with advanced filtering capabilities for protecting privacy,
-  filtering web page content, managing cookies, controlling access, and
-  removing ads, banners, pop-ups and other obnoxious Internet
-  Junk. <application>Privoxy</application> has a very flexible configuration
-  and can be customized to suit individual needs and
-  tastes. <application>Privoxy</application> has application for both
-  stand-alone systems and multi-user networks.
- </para>
- <para>
-You can find the latest version of the user manual at  <ulink url="http://www.privoxy.org/user-manual/">http://www.privoxy.org/user-manual/</ulink>.
- </para>
-
-<!--   <para> -->
-<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
-<!--   </para> -->
-</abstract>
-
-</artheader>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="introduction"><title>Introduction</title>
-<para>
- <application>Privoxy</application> is a web proxy with advanced filtering
- capabilities for protecting privacy, filtering web page content, managing
- cookies, controlling access, and removing ads, banners, pop-ups and other
- obnoxious Internet junk. <application>Privoxy</application> has a very
- flexible configuration and can be customized to suit individual needs and
- tastes. <application>Privoxy</application> has application for both
- stand-alone systems and multi-user networks.
-</para>
-
-<para>
- <application>Privoxy</application> is based on the code of the 
- <application>Internet Junkbuster</application>.
- <application>Junkbuster</application> was originally written by JunkBusters
- Corporation, and was released as free open-source software under the GNU GPL.
- Stefan Waldherr made many improvements, and started the SourceForge project
- to continue development.
-</para>
-
-<para>
- <application>Privoxy</application> continues the
- <application>Junkbuster</application> tradition, but adds many 
- refinements and enhancements.
-</para>
-
-<para>
- This documentation is included with the current BETA version of
- <application>Privoxy</application> and is mostly complete at this
- point. The most up to date reference for the time being is still the comments
- in the source files and in the individual configuration files. Development
- of version 3.0 is currently nearing completion, and includes many significant
- changes and enhancements over earlier versions. The target release date for
- stable v3.0 is <quote>soon</quote> ;-)
-</para>
-
-<para>
- Since this is a BETA version, not all new features are well tested. This
- documentation may be slightly out of sync as a result (especially with 
- CVS sources). And there <emphasis>may be</emphasis> bugs, though hopefully
- not many! 
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2>
-<title>New Features</title>
-<para>
- In addition to <application>Internet Junkbuster's</application> traditional
- feature of ad and banner blocking and cookie management,
- <application>Privoxy</application> provides new features, some of them
- currently under development:
-</para>
-
-<!--
- The section is in both user-manual and faq. Please keep in sync.
--->
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-   Integrated browser based configuration and control utility (<ulink
-   url="http://p.p">http://p.p</ulink>). Browser-based tracing of rule
-   and filter effects.
-  </para>
- </listitem> 
-<!--
- <listitem>
-  <para>
-   Modularized configuration that will allow for system wide settings, and
-   individual user settings. (not implemented yet, probably a 3.1 feature)
-  </para>
- </listitem> 
--->
- <listitem>
-  <para>
-    Blocking of annoying pop-up browser windows.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Support for Perl Compatible Regular Expressions in the configuration files, and 
-   generally a more sophisticated and flexible configuration syntax over
-   previous versions. 
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   GIF de-animation. 
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Web page content filtering (removes banners based on size,
-   invisible <quote>web-bugs</quote>, JavaScript, pop-ups, status bar abuse,
-   etc.)
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Bypass many click-tracking scripts (avoids script redirection).
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   Multi-threaded (POSIX and native threads).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Auto-detection and re-reading of config file changes.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   User-customizable HTML templates (e.g. 404 error page).
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   Improved cookie management features (e.g. session based cookies).
-  </para>
-</listitem> 
-
- <listitem>
-  <para>
-   Builds from source on most UNIX-like systems. Packages available for: Linux
-   (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac OSX, OS/2, HP-UX 11 and AmigaOS.
-  </para>
- </listitem> 
-
- <listitem>
-  <para>
-   In addition, the configuration is much more powerful and versatile over-all.
-  </para>
-</listitem> 
-
- </itemizedlist>
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="installation"><title>Installation</title>
-<para>
- <application>Privoxy</application> is available as raw source code, or
- pre-compiled binaries. See the <ulink
- url="http://sourceforge.net/projects/ijbswa/">Privoxy Home Page</ulink>
- for binaries and current release info. <application>Privoxy</application>
- is also available via <ulink
- url="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/">CVS</ulink>.
- This is the recommended approach at this time. But please be aware that CVS 
- is constantly changing, and it may break in mysterious ways.
-</para>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-source"><title>Source</title>
-<para>
- For gzipped tar archives, unpack the source:
-</para>
-
-<para>
- <screen>
- tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz]
- cd privoxy-2.9.13-beta
- </screen>
-</para>
-
-<para>
- For retrieving the current CVS sources, you'll need the CVS 
- package installed first. To download CVS source:
-</para>
-
-<para>
- <screen>
-  cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-  cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co current
-  cd current
- </screen>
-</para>
-
-<para>
- This will create a directory named <filename>current/</filename>, which will 
- contain the source tree.
-</para>
-
-<para>
- Then, in either case, to build from tarball/CVS source:
-</para>
-
-<para>
- <screen>
- ./configure      (--help to see options)
- make             (the make from gnu, gmake for *BSD) 
- su 
- make -n install  (to see where all the files will go)
- make install     (to really install)
- </screen>
-</para>
-
-<para>
- For Redhat and SuSE Linux RPM packages, see below.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-rh"><title>Red Hat</title>
-<para>
- To build Redhat RPM packages, install source as above. Then:
-</para>
-
-<para>
- <screen>
- autoheader
- autoconf
- ./configure
- make redhat-dist
- </screen>
-</para>
-
-<para>
- This will create both binary and src RPMs in the usual places. Example:
-</para>
-
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm
-</para>
-
-<para>
- To install, of course:
-</para>
-
-<para>
- <screen>
- rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
- </screen>
-</para>
-
-<para>
- This will place the <application>Privoxy</application> configuration 
- files in <filename>/etc/privoxy/</filename>, and log files in 
- <filename>/var/log/privoxy/</filename>.
-</para>
-
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-suse"><title>SuSE</title>
-<para>
- To build SuSE RPM packages, install source as above. Then:
-</para>
-
-<para>
- <screen>
- autoheader
- autoconf
- ./configure
- make suse-dist
- </screen>
-</para>
-
-<para>
- This will create both binary and src RPMs in the usual places. Example:
-</para>
-
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-</para>
-<para>
- &nbsp;&nbsp;&nbsp;/usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm
-</para>
-
-<para>
- To install, of course:
-</para>
-
-<para>
- <screen>
- rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
- </screen>
-</para>
-
-<para>
- This will place the <application>Privoxy</application> configuration 
- files in <filename>/etc/privoxy/</filename>, and log files in 
- <filename>/var/log/privoxy/</filename>.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-os2"><title>OS/2</title>
-
-<!--
-Thanx David Schmidt!
--->
-
-<para>
- <application>Privoxy</application> is packaged in a WarpIN self-
- installing archive.  The self-installing program will be named depending
- on the release version, something like:
- <filename>ijbos2_setup_1.2.3.exe</filename>.  In order to install it, simply
- run this executable or double-click on its icon and follow the WarpIN
- installation panels.  A shadow of the <application>Privoxy</application>
- executable will be placed in your startup folder so it will start 
- automatically whenever OS/2 starts.
-</para>
-
-<para>
- The directory you choose to install <application>Privoxy</application>
- into will contain all of the configuration files.
-</para>
-
-<para>
- If you would like to build binary images on OS/2 yourself, you will need
- a few Unix-like tools: autoconf, autoheader and sh.  These tools will be
- used to create the required config.h file, which is not part of the 
- source distribution because it differs based on platform.  You will also
- need a compiler.
- The distribution has been created using IBM VisualAge compilers, but you
- can use any compiler you like.  GCC/EMX has the disadvantage of needing 
- to be single-threaded due to a limitation of EMX's implementation of the
- select() socket call.
-</para>
-
-<para>
- In addition to needing the source code distribution as outlined earlier,
- you will want to extract the <filename>os2seutp</filename> directory from CVS:
- <screen>
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login          
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2setup
- </screen>
- This will create a directory named os2setup/, which will contain the
- <filename>Makefile.vac</filename> makefile and <filename>os2build.cmd</filename>
- which is used to completely create the binary distribution.  The sequence
- of events for building the executable for yourself goes something like this:
- <screen>
- cd current
- autoheader
- autoconf
- sh configure
- cd ..\os2setup
- nmake -f Makefile.vac
- </screen>
- You will see this sequence laid out in <filename>os2build.cmd</filename>.
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-win"><title>Windows</title>
-<para>Click-click. (I need help on this. Not a clue here. Also for 
-configuration section below. HB.)
-</para>
-</sect2>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="installation-other"><title>Other</title>
-<para>
- Some quick notes on other Operating Systems.
-</para>
-
-<para>
- For FreeBSD (and other *BSDs?), the build will require <command>gmake</command> 
- instead of the included <command>make</command>. <command>gmake</command> is
- available from <ulink url="http://www.gnu.org">http://www.gnu.org</ulink>.
- The rest should be the same as above for Linux/Unix.
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="configuration"><title><application>Privoxy</application> Configuration</title>
- <para>
-  All <application>Privoxy</application> configuration is kept 
-  in text files. These files can be edited with a text editor.
-  Many important aspects of <application>Privoxy</application> can 
-  also be controlled easily with a web browser.
-
- </para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Controlling <application>Privoxy</application> with Your Web Browser</title>
-<para>
- <application>Privoxy</application> can be reached by the special 
- URL <ulink url="http://p.p/">http://p.p/</ulink> (or alternately
- <ulink url="http://www.privoxy.org/config/">http://www.privoxy.org/config/</ulink>), 
- which is an internal page. You will see the following section:
-
-</para>
-
-<para>
- <screen>
-
-Please choose from the following options:
-
-    * Show information about the current configuration
-    * Show the source code version numbers
-    * Show the client's request headers.
-    * Show which actions apply to a URL and why
-    * Toggle Privoxy on or off
-    * Edit the actions list
-
- </screen>
-</para>
-
-<para>
- This should be self-explanatory. Note the last item is an editor for the
- <quote>actions list</quote>, which is where much of the ad, banner, cookie,
- and URL blocking magic is configured as well as other advanced features of
- <application>Privoxy</application>. This is an easy way to adjust various
- aspects of <application>Privoxy</application> configuration. The actions
- file, and other configuration files, are explained in detail below. 
- <application>Privoxy</application> will automatically detect any changes 
- to these files.
-</para>
-
-<para>
- <quote>Toggle Privoxy On or Off</quote> is handy for sites that might 
- have problems with your current actions and filters, or just to test if 
- a site misbehaves, whether it is <application>Privoxy</application> 
- causing the problem or not. <application>Privoxy</application> continues 
- to run as a proxy in this case, but all filtering is disabled.
-
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Configuration Files Overview</title>
-<para>
- For Unix, *BSD and Linux, all configuration files are located in
- <filename>/etc/privoxy/</filename> by default. For MS Windows, OS/2, and
- AmigaOS these are all in the same directory as the 
- <application>Privoxy</application> executable. The name and number of
- configuration files has changed from previous versions, and is subject to
- change as development progresses.
-</para>
-
-<para>
- The installed defaults provide a reasonable starting point, though possibly
- aggressive by some standards. For the time being, there are only three
- default configuration files (this will change in time):
-</para>
-
-<para>
- <itemizedlist>
-
-  <listitem>
-   <para>
-     The main configuration file is named <filename>config</filename>
-     on Linux, Unix, BSD, OS/2, and AmigaOS and <filename>config.txt</filename>
-     on Windows.
-   </para>
-  </listitem> 
-
-  <listitem>
-   <para>
-    The <filename>default.action</filename> file is used  to define various 
-    <quote>actions</quote> relating to images, banners, pop-ups, access
-    restrictions, banners and cookies. There is a CGI based editor for this
-    file that can be accessed via <ulink
-    url="http://p.p">http://p.p</ulink>. (Other actions 
-    files are included as well with differing levels of filtering 
-    and blocking, e.g. <filename>ijb-basic.action</filename>.)
-   </para>
-  </listitem> 
-
-  <listitem>
-   <para>
-    The <filename>default.filter</filename> file can be used to re-write the raw
-    page content, including viewable text as well as embedded HTML and JavaScript,
-    and whatever else lurks on any given web page.
-   </para>
-  </listitem> 
-
- </itemizedlist>
-</para>
-
-<para>
- <filename>default.action</filename> and <filename>default.filter</filename> 
- can use Perl style regular expressions for maximum flexibility. All files use
- the <quote><literal>#</literal></quote> character to denote a comment. Such
- lines are not processed by <application>Privoxy</application>. After
- making any changes, there is no need to restart
- <application>Privoxy</application> in order for the changes to take
- effect. <application>Privoxy</application> should detect such changes 
- automatically.
-</para>
-
-<para>
- While under development, the configuration content is subject to change. 
- The below documentation may not be accurate by the time you read this. 
- Also, what constitutes a <quote>default</quote> setting, may change, so 
- please check all your configuration files on important issues.
-</para>
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>The Main Configuration File</title>
-<para>
- Again, the main configuration file is named <filename>config</filename> on
- Linux/Unix/BSD and OS/2, and <filename>config.txt</filename> on Windows.
- Configuration lines consist of an initial keyword followed by a list of
- values, all separated by whitespace (any number of spaces or tabs). For
- example:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>blockfile blocklist.ini</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Indicates that the blockfile is named <quote>blocklist.ini</quote>. (A 
- default installation does not use this.)
-</para>
-
-<para>
- A <quote><literal>#</literal></quote> indicates a comment.  Any part of a
- line following a <quote><literal>#</literal></quote> is ignored, except if
- the <quote><literal>#</literal></quote> is preceded by a
- <quote><literal>\</literal></quote>.
-</para>
-
-<para>
- Thus, by placing a <quote><literal>#</literal></quote> at the start of an
- existing configuration line, you can make it a comment and it will be treated
- as if it weren't there. This is called <quote>commenting out</quote> an
- option and can be useful to turn off features: If you comment out the
- <quote>logfile</quote> line, <application>Privoxy</application> will not
- log to a file at all. Watch for the <quote>default:</quote> section in each
- explanation to see what happens if the option is left unset (or commented
- out). 
-</para>
-
-<para>
- Long lines can be continued on the next line by using a
- <quote><literal>\</literal></quote> as the very last character.
-</para>
-
-<para>
- There are various aspects of <application>Privoxy</application> behavior 
- that can be tuned.
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Defining Other Configuration Files</title>
-
-<para>
- <application>Privoxy</application> can use a number of other files to tell it
- what ads to block, what cookies to accept, etc.  This section of the
- configuration file tells <application>Privoxy</application> where to find
- all those other files. 
-</para>
-
-<para>
- On <application>Windows</application> and <application>AmigaOS</application>,
- <application>Privoxy</application> looks for these files in the same
- directory as the executable.  On Unix and  OS/2,
- <application>Privoxy</application> looks for these files in the current
- working directory. In either case, an absolute path name can be used to
- avoid problems.
-</para>
-
-<para>
- When development goes modular and multi-user, the blocker, filter, and
- per-user config will be stored in subdirectories of <quote>confdir</quote>.
- For now, only <filename>confdir/templates</filename> is used for storing HTML
- templates for CGI results. 
-</para>
-
-<para>
- The location of the configuration files:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>confdir  /etc/privoxy</emphasis>       # No trailing /, please.
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The directory where all logging (i.e. <filename>logfile</filename> and 
- <filename>jarfile</filename>) takes place. No trailing
- <quote><literal>/</literal></quote>, please: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>logdir  /var/log/privoxy</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that all file specifications below are relative to 
- the above two directories!
-</para>
-
-<para>
- The <quote>default.action</quote> file contains patterns to specify the
- actions to apply to requests for each site. Default: Cookies to and from all
- destinations are kept only during the current browser session (i.e. they are
- not saved to disk). Pop-ups are disabled for all sites. All sites are
- filtered through selected sections of <quote>default.filter</quote>. No sites
- are blocked. <application>Privoxy</application> displays a checkboard type
- pattern for filtered ads and other images. The syntax of this file is
- explained in detail <link linkend="actionsfile">below</link>. Other
- <quote>actions</quote> files are included, and you are free to use any of
- them. They have varying degrees of aggressiveness.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>actionsfile  default.action</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>default.filter</quote> file contains content modification rules 
- that use <quote>regular expressions</quote>. These rules permit powerful
- changes on the content of Web pages, e.g., you could disable your favorite
- JavaScript annoyances, re-write the actual displayed text, or just have some
- fun replacing <quote>Microsoft</quote> with <quote>MicroSuck</quote> wherever
- it appears on a Web page. Default: whatever the developers are playing with
- :-/
-</para>
-
-<para>
- Filtering requires buffering the page content, which may appear to slow down
- page rendering since nothing is displayed until all content has passed 
- the filters. (It does not really take longer, but seems that way since 
- the page is not incrementally displayed.) This effect will be more noticeable
- on slower connections.
-
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>filterfile  default.filter</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The logfile is where all logging and error messages are written. The logfile
- can be useful for tracking down a problem with
- <application>Privoxy</application> (e.g., it's not blocking an ad you
- think it should block) but in most cases you probably will never look at it.
-</para>
-
-<para>
- Your logfile will grow indefinitely, and you will probably want to
- periodically remove it.  On Unix systems, you can do this with a cron job
- (see <quote>man cron</quote>). For Redhat, a <command>logrotate</command> 
- script has been included.
-</para>
-
-<para>
- On SuSE Linux systems, you can place a line like <quote>/var/log/privoxy.*
- +1024k 644 nobody.nogroup</quote> in <filename>/etc/logfiles</filename>, with
- the effect that cron.daily will automatically archive, gzip, and empty the
- log, when it exceeds 1M size.
-</para>
-
-<para>
- Default: Log to the a file named <filename>logfile</filename>. 
- Comment out to disable logging.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>logfile  logfile</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>jarfile</quote> defines where
- <application>Privoxy</application> stores the cookies it intercepts.  Note
- that if you use a <quote>jarfile</quote>, it may grow quite large. Default:
- Don't store intercepted cookies.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#jarfile  jarfile</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you specify a <quote>trustfile</quote>,
- <application>Privoxy</application> will only allow access to sites that
- are named in the trustfile. You can also mark sites as trusted referrers,
- with the effect that access to untrusted sites will be granted, if a link
- from a trusted referrer was used. The link target will then be added to the
- <quote>trustfile</quote>. This is a very restrictive feature that typical
- users most probably want to leave disabled. Default: Disabled, don't use the
- trust mechanism.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#trustfile  trust</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-<para>
- If you use the trust mechanism, it is a good idea to write up some on-line
- documentation about your blocking policy and to specify the URL(s) here. They
- will appear on the page that your users receive when they try to access
- untrusted content. Use multiple times for multiple URLs. Default: Don't
- display links on the <quote>untrusted</quote> info page.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>trust-info-url http://www.your-site.com/why_we_block.html</emphasis>
-  <emphasis>trust-info-url http://www.your-site.com/what_we_allow.html</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Other Configuration Options</title>
-
-<para>
- This part of the configuration file contains options that control how
- <application>Privoxy</application> operates.
-</para>
-
-<para>
- <quote>Admin-address</quote> should be set to the email address of the proxy
- administrator. It is used in many of the proxy-generated pages. Default:
- fill@me.in.please.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#admin-address  fill@me.in.please</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>Proxy-info-url</quote> can be set to a URL that contains more info
- about this <application>Privoxy</application> installation, it's
- configuration and policies. It is used in many of the proxy-generated pages
- and its use is highly recommended in multi-user installations, since your
- users will want to know why certain content is blocked or modified. Default:
- Don't show a link to on-line documentation.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>proxy-info-url  http://www.your-site.com/proxy.html</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>Listen-address</quote> specifies the address and port where
- <application>Privoxy</application> will listen for connections from your
- Web browser.  The default is to listen on the localhost port 8118, and
- this is suitable for most users.  (In your web browser, under proxy
- configuration, list the proxy server as <quote>localhost</quote> and the
- port as <quote>8118</quote>).
-</para>
-
-<para>
- If you already have another service running on port 8118, or if you want to
- serve requests from other machines (e.g. on your local network) as well, you
- will need to override the default. The syntax is 
- <quote>listen-address [&lt;ip-address&gt;]:&lt;port&gt;</quote>. If you leave
- out the IP address, <application>Privoxy</application> will bind to all
- interfaces (addresses) on your machine and may become reachable from the
- Internet. In that case, consider using access control lists (acl's) (see
- <quote>aclfile</quote> above), or a firewall.
-</para>
-
-<para>
- For example, suppose you are running <application>Privoxy</application> on
- a machine which has the address 192.168.0.1 on your local private network
- (192.168.0.0) and has another outside connection with a different address.
- You want it to serve requests from inside only:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>listen-address  192.168.0.1:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you want it to listen on all addresses (including the outside
- connection):
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>listen-address  :8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you do this, consider using ACLs (see <quote>aclfile</quote> above). Note:
- you will need to point your browser(s) to the address and port that you have
- configured here. Default: localhost:8118 (127.0.0.1:8118).
-</para>
-
-<para>
- The debug option sets the level of debugging information to log in the
- logfile (and to the console in the Windows version).  A debug level of 1 is
- informative because it will show you each request as it happens.  Higher
- levels of debug are probably only of interest to developers.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  debug         1 # GPC   = show each GET/POST/CONNECT request
-  debug         2 # CONN  = show each connection status
-  debug         4 # IO    = show I/O status
-  debug         8 # HDR   = show header parsing
-  debug        16 # LOG   = log all data into the logfile
-  debug        32 # FRC   = debug force feature
-  debug        64 # REF   = debug regular expression filter 
-  debug       128 #       = debug fast redirects
-  debug       256 #       = debug GIF de-animation
-  debug       512 # CLF   = Common Log Format
-  debug      1024 #       = debug kill pop-ups
-  debug      4096 # INFO  = Startup banner and warnings.
-  debug      8192 # ERROR = Non-fatal errors
-    </literallayout>
-  </msgtext>
- </literal>
-</para>
-
-<para>
- It is <emphasis>highly recommended</emphasis> that you enable ERROR
- reporting (debug 8192), at least until v3.0 is released.
-</para>
-
-<para>
- The reporting of FATAL errors (i.e. ones which crash 
- <application>Privoxy</application>) is always on and cannot be disabled.
-</para>
-
-<para>
- If you want to use CLF (Common Log Format), you should set <quote>debug
- 512</quote> ONLY, do not enable anything else.
-</para>
-
-<para>
- Multiple <quote>debug</quote> directives, are OK - they're logical-OR'd
- together. 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>debug    15     # same as setting the first 4 listed above</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Default:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>debug   1     # URLs</emphasis>
-  <emphasis>debug   4096  # Info</emphasis>
-  <emphasis>debug   8192  # Errors - *we highly recommended enabling this*</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <application>Privoxy</application> normally uses
- <quote>multi-threading</quote>, a software technique that permits it to
- handle many different requests simultaneously. In some cases you may wish to
- disable this -- particularly if you're trying to debug a problem.  The
- <quote>single-threaded</quote> option forces
- <application>Privoxy</application> to handle requests sequentially.
- Default: Multi-threaded mode.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>#single-threaded</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <quote>toggle</quote> allows you to temporarily disable all
- <application>Privoxy's</application>  filtering. Just set <quote>toggle
- 0</quote>.
-</para>
-
-<para>
- The Windows version of <application>Privoxy</application> puts an icon in
- the system tray, which also allows you to change this option.  If you
- right-click on that icon (or select the <quote>Options</quote> menu), one
- choice is <quote>Enable</quote>. Clicking on enable toggles
- <application>Privoxy</application> on and off. This is useful if you want
- to temporarily disable <application>Privoxy</application>, e.g., to access
- a site that requires cookies which you would otherwise have blocked. This can also
- be toggled via a web browser at the <application>Privoxy</application>
- internal address of <ulink url="http://p.p">http://p.p</ulink> on 
- any platform.
-</para>
-
-<para>
- <quote>toggle 1</quote> means <application>Privoxy</application> runs
- normally, <quote>toggle 0</quote> means that
- <application>Privoxy</application> becomes a non-anonymizing non-blocking
- proxy. Default: 1 (on). 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>toggle    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- For content filtering, i.e. the <quote>+filter</quote> and
- <quote>+deanimate-gif</quote> actions, it is necessary that 
- <application>Privoxy</application> buffers the entire document body.
- This can be potentially dangerous, since a server could just keep sending
- data indefinitely and wait for your RAM to exhaust. With nasty consequences.
-</para>
-
-<para>
- The <application>buffer-limit</application> option lets you set the maximum
- size in Kbytes that each buffer may use. When the documents buffer exceeds
- this size, it is flushed to the client unfiltered and no further attempt to
- filter the rest of it is made. Remember that there may multiple threads
- running, which might require increasing the <quote>buffer-limit</quote>
- Kbytes <emphasis>each</emphasis>, unless you have enabled 
- <quote>single-threaded</quote> above.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>buffer-limit    4069</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- To enable the web-based <filename>default.action</filename> file editor set
- <application>enable-edit-actions</application> to 1, or 0 to disable.  Note
- that you must have compiled <application>Privoxy</application> with
- support for this feature, otherwise this option has no effect. This 
- internal page can be reached at <ulink
- url="http://p.p">http://p.p</ulink>.
- </para>
-
-<para>
- Security note: If this is enabled, anyone who can use the proxy
- can edit the actions file, and their changes will affect all users.
- For shared proxies, you probably want to disable this. Default: enabled.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>enable-edit-actions    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Allow <application>Privoxy</application> to be toggled on and off
- remotely, using your web browser.  Set <quote>enable-remote-toggle</quote>to
- 1 to enable, and 0 to disable.  Note that you must have compiled 
- <application>Privoxy</application> with support for this feature,
- otherwise this option has no effect.
-</para>
-
-<para>
- Security note:  If this is enabled, anyone who can use the proxy can toggle
- it on or off (see <ulink url="http://p.p">http://p.p</ulink>), and
- their changes will affect all users. For shared proxies, you probably want to
- disable this. Default: enabled.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>enable-remote-toggle    1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Access Control List (ACL)</title>
-<para>
- Access controls are included at the request of some ISPs and systems
- administrators, and are not usually needed by individual users. Please note
- the warnings in the FAQ that this proxy is not intended to be a substitute
- for a firewall or to encourage anyone to defer addressing basic security
- weaknesses.
-</para>
-
-<para>
- If no access settings are specified, the proxy talks to anyone that
- connects. If any access settings file are specified, then the proxy
- talks only to IP addresses permitted somewhere in this file and not
- denied later in this file.
-</para>
-
-<para>
- Summary -- if using an ACL:
-</para>
-
- <simplelist>
-  <member>
-   Client must have permission to receive service.
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   LAST match in ACL wins.
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   Default behavior is to deny service.
-  </member>
- </simplelist>
-
-<para>
- The syntax for an entry in the Access Control List is:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  ACTION    SRC_ADDR[/SRC_MASKLEN]    [ DST_ADDR[/DST_MASKLEN] ]
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Where the individual fields are:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>ACTION</emphasis>      = <quote>permit-access</quote> or <quote>deny-access</quote>
-
- <emphasis>SRC_ADDR</emphasis>    = client hostname or dotted IP address
- <emphasis>SRC_MASKLEN</emphasis> = number of bits in the subnet mask for the source
-
- <emphasis>DST_ADDR</emphasis>    = server or forwarder hostname or dotted IP address
- <emphasis>DST_MASKLEN</emphasis> = number of bits in the subnet mask for the target
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-
-<para> 
- The field separator (FS) is whitespace (space or tab).
-</para>
-
-<para>
- IMPORTANT NOTE: If <application>Privoxy</application> is using a
- forwarder (see below) or a gateway for a particular destination URL, the
- <literal>DST_ADDR</literal> that is examined is the address of the forwarder
- or the gateway and <emphasis>NOT</emphasis> the address of the ultimate
- target. This is necessary because it may be impossible for the local
- <application>Privoxy</application> to determine the address of the
- ultimate target (that's often what gateways are used for).
-</para>
-
-<para>
- Here are a few examples to show how the ACL features work:
-</para>
-
-<para>
- <quote>localhost</quote> is OK -- no DST_ADDR implies that
- <emphasis>ALL</emphasis> destination addresses are OK:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access  localhost</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- A silly example to illustrate permitting any host on the class-C subnet with
- <application>Privoxy</application> to go anywhere:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    www.privoxy.com/24</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Except deny one particular IP address from using it at all:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>deny-access      ident.privoxy.com</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- You can also specify an explicit network address and subnet mask.
- Explicit addresses do not have to be resolved to be used.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    207.153.200.0/24</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- A subnet mask of 0 matches anything, so the next line permits everyone.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    0.0.0.0/0</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note, you <emphasis>cannot</emphasis> say:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>permit-access    .org</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- to allow all *.org domains. Every IP address listed must resolve fully.
-</para>
-
-<para>
- An ISP may want to provide a <application>Privoxy</application> that is
- accessible by <quote>the world</quote> and yet restrict use of some of their
- private content to hosts on its internal network (i.e. its own subscribers).
- Say, for instance the ISP owns the Class-B IP address block 123.124.0.0 (a 16
- bit netmask). This is how they could do it:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>permit-access 0.0.0.0/0   0.0.0.0/0</emphasis>   # other clients can go anywhere 
-                                       # with the following exceptions:
- <emphasis>deny-access</emphasis>   0.0.0.0/0   123.124.0.0/16 # block all external requests for
-                                          # sites on the ISP's network
-
- <emphasis>permit 0.0.0.0/0   www.my_isp.com</emphasis>        # except for the ISP's main 
-                                          # web site
-
- <emphasis>permit 123.124.0.0/16 0.0.0.0/0</emphasis>          # the ISP's clients can go 
-                                          # anywhere
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that if some hostnames are listed with multiple IP addresses, 
- the primary value returned by DNS (via gethostbyname()) is used. Default:
- Anyone can access the proxy.
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3 id="forwarding">
-<title>Forwarding</title>
-
-<para>
- This feature allows chaining of HTTP requests via multiple proxies.
- It can be used to better protect privacy and confidentiality when
- accessing specific domains by routing requests to those domains
- to a special purpose filtering proxy such as lpwa.com. Or to use 
- a caching proxy to speed up browsing.
-</para>
-
-<para>
- It can also be used in an environment with multiple networks to route
- requests via multiple gateways allowing transparent access to multiple
- networks without having to modify browser configurations.
-</para>
-
-<para>
- Also specified here are SOCKS proxies. <application>Privoxy</application>
- SOCKS 4 and SOCKS 4A. The difference is that SOCKS 4A will resolve the target
- hostname using DNS on the SOCKS server, not our local DNS client.
-</para>
-
-<para>
- The syntax of each line is:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward target_domain[:port] http_proxy_host[:port]</emphasis>
- <emphasis>forward-socks4  target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port]</emphasis>
- <emphasis>forward-socks4a target_domain[:port] socks_proxy_host[:port] http_proxy_host[:port]</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If http_proxy_host is <quote>.</quote>, then requests are not forwarded to a
- HTTP proxy but are made directly to the web servers.
-</para>
-
-<para>
- Lines are checked in sequence, and the last match wins.
-</para>
-
-<para>
- There is an implicit line equivalent to the following, which specifies that
- anything not finding a match on the list is to go out without forwarding
- or gateway protocol, like so:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward   .*   .       </emphasis># implicit
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- In the following common configuration, everything goes to Lucent's LPWA,
- except SSL on port 443 (which it doesn't handle):
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward   .*     lpwa.com:8000</emphasis>
- <emphasis>forward   :443   .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
-<!--
- See the FAQ for instructions on how to automate the login procedure for LPWA.
---> 
- Some users have reported difficulties related to LPWA's use of
- <quote>.</quote> as the last element of the domain, and have said that this
- can be fixed with this:
-</para>
-   
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward   lpwa.  lpwa.com:8000</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-<para>
- (NOTE: the syntax for specifying target_domain has changed since the
- previous paragraph was written -- it will not work now.  More information
- is welcome.)
-</para>
-
-<para>
- In this fictitious example, everything goes via an ISP's caching proxy,
- except requests to that ISP:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*         caching.myisp.net:8000</emphasis>
- <emphasis>forward    myisp.net  .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- For the @home network, we're told the forwarding configuration is this:
-</para>
-
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward    .*    proxy:8080</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Also, we're told they insist on getting cookies and JavaScript, so you should 
- allow cookies from home.com. We consider JavaScript a potential security risk.
- Java need not be enabled.
-</para>
-
-<para>
- In this example direct connections are made to all <quote>internal</quote>
- domains, but everything else goes through Lucent's LPWA by way of the
- company's SOCKS gateway to the Internet.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward-socks4  .*  lpwa.com:8000  firewall.my_company.com:1080</emphasis>
- <emphasis>forward    my_company.com  .</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- This is how you could set up a site that always uses SOCKS but no forwarders:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>forward-socks4a   .*  .  firewall.my_company.com:1080</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- An advanced example for network administrators:
-</para>
-
-<para>
- If you have links to multiple ISPs that provide various special content to
- their subscribers, you can configure forwarding to pass requests to the
- specific host that's connected to that ISP so that everybody can see all
- of the content on all of the ISPs.
-</para>
-
-<para>
- This is a bit tricky, but here's an example:
-</para>
-
-
-<para>
- host-a has a PPP connection to isp-a.com. And host-b has a PPP connection to
- isp-b.com. host-a can run a <application>Privoxy</application> proxy with
- forwarding like this: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*         .</emphasis>
- <emphasis>forward    isp-b.com  host-b:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- host-b can run a <application>Privoxy</application> proxy with forwarding
- like this: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward    .*          .</emphasis>
- <emphasis>forward    isp-a.com   host-a:8118</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now, <emphasis>anyone</emphasis> on the Internet (including users on host-a
- and host-b) can set their browser's proxy to <emphasis>either</emphasis>
- host-a or host-b and be able to browse the content on isp-a or isp-b.
-</para>
-
-<para>
- Here's another practical example, for University of Kent at
- Canterbury students with a network connection in their room, who
- need to use the University's Squid web cache.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- <emphasis>forward  *. ssbcache.ukc.ac.uk:3128</emphasis>  # Use the proxy, except for:
- <emphasis>forward  .ukc.ac.uk            .    </emphasis> # Anything on the same domain as us
- <emphasis>forward  *                     .    </emphasis> # Host with no domain specified
- <emphasis>forward  129.12.*.*            .    </emphasis> # A dotted IP on our /16 network.
- <emphasis>forward  127.*.*.*             .    </emphasis> # Loopback address
- <emphasis>forward  localhost.localdomain .    </emphasis> # Loopback address
- <emphasis>forward  www.ukc.mirror.ac.uk  .    </emphasis> # Specific host
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If you intend to chain <application>Privoxy</application> and 
- <application>squid</application> locally, then chain as 
- <literal>browser -> squid -> privoxy</literal> is the recommended way. 
-</para>
-
-<para>
- Your squid configuration could then look like this:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  # Define Privoxy as parent cache 
- <!-- per feedback from user...
-  cache_peer 127.0.0.1 8118 parent 0 no-query 
- --> 
-  cache_peer 127.0.0.1 parent 8118 0 no-query
-  
-  # Define ACL for protocol FTP 
-  acl FTP proto FTP 
-
-  # Do not forward ACL FTP to privoxy
-  always_direct allow FTP 
-
-  # Do not forward ACL CONNECT (https) to privoxy
-  always_direct allow CONNECT 
-
-  # Forward the rest to privoxy
-  never_direct allow all 
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Windows GUI Options</title>
-<!--
-Removed references to Win32. HB 09/23/01
--->
-<para>
- <application>Privoxy</application> has a number of options specific to the
- Windows GUI interface:
-</para>
-
-<para>
- If <quote>activity-animation</quote> is set to 1, the
- <application>Privoxy</application> icon will animate when
- <quote>Privoxy</quote> is active. To turn off, set to 0.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>activity-animation   1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>log-messages</quote> is set to 1,
- <application>Privoxy</application> will log messages to the console
- window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-messages       1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para> 
- If <quote>log-buffer-size</quote> is set to 1, the size of the log buffer,
- i.e. the amount of memory used for the log messages displayed in the
- console window, will be limited to <quote>log-max-lines</quote> (see below).
-</para>
-
-<para>
- Warning: Setting this to 0 will result in the buffer to grow infinitely and
- eat up all your memory!
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-buffer-size      1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- <application>log-max-lines</application> is the maximum number of lines held
- in the log buffer. See above.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-max-lines      200</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>log-highlight-messages</quote> is set to 1,
- <application>Privoxy</application> will highlight portions of the log
- messages with a bold-faced font:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-highlight-messages   1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The font used in the console window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-font-name        Comic Sans MS</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Font size used in the console window:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>log-font-size        8</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>  
- <quote>show-on-task-bar</quote> controls whether or not
- <application>Privoxy</application> will appear as a button on the Task bar
- when minimized:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>show-on-task-bar     0</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- If <quote>close-button-minimizes</quote> is set to 1, the Windows close
- button will minimize <application>Privoxy</application> instead of closing
- the program (close with the exit option on the File menu).
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  <emphasis>close-button-minimizes  1</emphasis>
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- The <quote>hide-console</quote> option is specific to the MS-Win console
- version of <application>Privoxy</application>. If this option is used,
- <application>Privoxy</application> will disconnect from and hide  the
- command console.
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  #hide-console
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="actionsfile">
-<title>The Actions File</title>
-
-<para>
- The <quote>default.action</quote> file (formerly
- <filename>actionsfile</filename> or <filename>ijb.action</filename>) is used to define what actions
- <application>Privoxy</application> takes, and thus determines how images,
- cookies and various other aspects of HTTP content and transactions are
- handled. Images can be anything you want, including ads, banners, or just
- some obnoxious URL that you would rather not see. Cookies can be accepted
- or rejected, or accepted only during the current browser session (i.e. 
- not written to disk). Changes to <filename>default.action</filename> should 
- be immediately visible to <application>Privoxy</application> without 
- the need to restart.
-</para>
-
-<para>
- The easiest way to edit <quote>actions</quote> file is with a browser by
- loading <ulink url="http://p.p/">http://p.p/</ulink>, and then select
- <quote>Edit Actions List</quote>. A text editor can also be used.
-</para>
-
-<para>
- To determine which actions apply to a request, the URL of the request is
- compared to all patterns in this file. Every time it matches, the list of
- applicable actions for the URL is incrementally updated. You can trace
- this process by visiting <ulink
- url="http://p.p/show-url-info">http://p.p/show-url-info</ulink>. 
-</para>
-
-
-<para>
- There are four types of lines in this file: comments (begin with a 
- <quote>#</quote> character), actions, aliases and patterns, all of which are
- explained below, as well as the configuration file syntax that 
- <application>Privoxy</application> understands.
-
-</para>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect3>
-<title>URL Domain and Path Syntax</title>
-<para>
- Generally, a pattern has the form &lt;domain&gt;/&lt;path&gt;, where both the
- &lt;domain&gt; and &lt;path&gt; part are optional. If you only specify a
- domain part, the <quote>/</quote> can be left out:
-</para>
-
-<para>
- <emphasis>www.example.com</emphasis> - is a domain only pattern and will match any request to
- <quote>www.example.com</quote>.
-</para>
-
-<para>
- <emphasis>www.example.com/</emphasis> - means exactly the same.
-</para>
-
-<para>
- <emphasis>www.example.com/index.html</emphasis> - matches only the single
- document <quote>/index.html</quote> on <quote>www.example.com</quote>.
-</para>
-
-<para>
- <emphasis>/index.html</emphasis> - matches the document <quote>/index.html</quote>, regardless of
- the domain.
-</para>
-
-<para>
- <emphasis>index.html</emphasis> - matches nothing, since it would be
- interpreted as a domain name and there is no top-level domain called
- <quote>.html</quote>.
-</para>
-
-<para>
- The matching of the domain part offers some flexible options: if the
- domain starts or ends with a dot, it becomes unanchored at that end. 
- For example:
-</para>
-
-<para>
- <emphasis>.example.com</emphasis> - matches any domain that <emphasis>ENDS</emphasis> in 
- <quote>.example.com</quote>.
-</para>
-
-<para>
- <emphasis>www.</emphasis> - matches any domain that <emphasis>STARTS</emphasis> with
- <quote>www</quote>.
-</para>
-
-<para>
- Additionally, there are wild-cards that you can use in the domain names
- themselves. They work pretty similar to shell wild-cards: <quote>*</quote>
- stands for zero or more arbitrary characters, <quote>?</quote> stands for
- any single character. And you can define character classes in square
- brackets and they can be freely mixed:
-</para>
-
-<para>
- <emphasis>ad*.example.com</emphasis> - matches <quote>adserver.example.com</quote>, 
- <quote>ads.example.com</quote>, etc but not <quote>sfads.example.com</quote>.
-</para>
-
-<para>
- <emphasis>*ad*.example.com</emphasis> - matches all of the above, and then some.
-</para>
-
-<para>
- <emphasis>.?pix.com</emphasis> - matches <quote>www.ipix.com</quote>,
- <quote>pictures.epix.com</quote>, <quote>a.b.c.d.e.upix.com</quote>, etc. 
-</para>
-
-<para>
- <emphasis>www[1-9a-ez].example.com</emphasis> - matches <quote>www1.example.com</quote>, 
- <quote>www4.example.com</quote>, <quote>wwwd.example.com</quote>, 
- <quote>wwwz.example.com</quote>, etc., but <emphasis>not</emphasis> 
- <quote>wwww.example.com</quote>.
-</para>
-
-<para>
- If <application>Privoxy</application> was compiled with
- <quote>pcre</quote> support (default), Perl compatible regular expressions
- can be used. See the <filename>pcre/docs/</filename> directory or <quote>man
- perlre</quote> (also available on  <ulink
- url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>)
- for details. A brief discussion of regular expressions is in the 
- <link linkend="regex">Appendix</link>. For instance:
-</para>
-
-<para>
- <emphasis>/.*/advert[0-9]+\.jpe?g</emphasis>  - would match a URL from any
- domain, with any path that includes <quote>advert</quote> followed
- immediately by one or more digits, then a <quote>.</quote> and ending in
- either <quote>jpeg</quote> or <quote>jpg</quote>. So we match
- <quote>example.com/ads/advert2.jpg</quote>, and
- <quote>www.example.com/ads/banners/advert39.jpeg</quote>, but not
- <quote>www.example.com/ads/banners/advert39.gif</quote> (no gifs in the
- example pattern).
-</para>
-
-<para>
- Please note that matching in the path is case
- <emphasis>INSENSITIVE</emphasis> by default, but you can switch to case
- sensitive at any point in the pattern by using the 
- <quote>(?-i)</quote> switch:
-</para>
-
-<para>
- <emphasis>www.example.com/(?-i)PaTtErN.*</emphasis> - will match only
- documents whose path starts with <quote>PaTtErN</quote> in
- <emphasis>exactly</emphasis> this capitalization.
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect3>
-<title>Actions</title>
-<para>
- Actions are enabled if preceded with a <quote>+</quote>, and disabled if 
- preceded with a <quote>-</quote>. Actions are invoked by enclosing the 
- action name in curly braces (e.g. {+some_action}), followed by a list of 
- URLs to which the action applies. There are three classes of actions:
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>  
-   Boolean (e.g. <quote>+/-block</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name}</emphasis>        # enable this action
-  <emphasis>{-name}</emphasis>        # disable this action
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
-
- <listitem>
-  <para>  
-   parameterized (e.g. <quote>+/-hide-user-agent</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name{param}}</emphasis>  # enable action and set parameter to <quote>param</quote>
-  <emphasis>{-name}</emphasis>         # disable action
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Multi-value (e.g. <quote>{+/-add-header{Name: value}}</quote>, <quote>{+/-wafer{name=value}}</quote>):
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>{+name{param}}</emphasis>   # enable action and add parameter <quote>param</quote>
-  <emphasis>{-name{param}}</emphasis>   # remove the parameter <quote>param</quote>
-  <emphasis>{-name}</emphasis>          # disable this action totally
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- </itemizedlist>
-</para>
-
-<para>
- If nothing is specified in this file, no <quote>actions</quote> are taken.
- So in this case <application>Privoxy</application> would just be a
- normal, non-blocking, non-anonymizing proxy. You must specifically
- enable the privacy and blocking features you need (although the 
- provided default <filename>default.action</filename> file will 
- give a good starting point).
-</para>
-
-<para>
- Later defined actions always over-ride earlier ones.  For multi-valued
- actions, the actions are applied in the order they are specified.
-</para>
-
-<para>
- The list of valid <application>Privoxy</application> <quote>actions</quote> are:
-</para>
-
-<para>
- <itemizedlist>
- <listitem>
-  <para>  
-   Add the specified HTTP header, which is not checked for validity.
-   You may specify this many times to specify many different headers:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+add-header{Name: value}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Block this URL totally. In a default installation, a <quote>blocked</quote>
-   URL will result in bright red banner that says <quote>BLOCKED</quote>, 
-   with a reason why it is being blocked. 
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+block</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   De-animate all animated GIF images, i.e. reduce them to their last frame.
-   This will also shrink the images considerably (in bytes, not pixels!). If
-   the option <quote>first</quote> is given, the first frame of the animation
-   is used as the replacement. If <quote>last</quote> is given, the last frame
-   of the animation is used instead, which probably makes more sense for most
-   banner animations, but also has the risk of not showing the entire last
-   frame (if it is only a delta to an earlier frame).
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+deanimate-gifs{last}</emphasis>
-  <emphasis>+deanimate-gifs{first}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>
-   <quote>+downgrade</quote> will downgrade HTTP/1.1 client requests to
-   HTTP/1.0 and downgrade the responses as well. Use this action for servers
-   that use HTTP/1.1 protocol features that
-   <application>Privoxy</application> doesn't handle well yet. HTTP/1.1 
-   is only partially implemented. Default is not to downgrade requests.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+downgrade</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem> 
- <listitem>
-  <para>  
-   Many sites, like yahoo.com, don't just link to other sites. Instead, they
-   will link to some script on their own server, giving the destination as a
-   parameter, which will then redirect you to the final target. URLs resulting
-   from this scheme typically look like:
-   http://some.place/some_script?http://some.where-else.
-  </para>
-  <para>
-   Sometimes, there are even multiple consecutive redirects encoded in the
-   URL. These redirections via scripts make your web browsing more traceable,
-   since the server from which you follow such a link can see where you go to.
-   Apart from that, valuable bandwidth and time is wasted, while your browser
-   ask the server for one redirect after the other. Plus, it feeds the
-   advertisers.
-  </para>
-  <para>
-   The <quote>+fast-redirects</quote> option enables interception of these
-   requests by <application>Privoxy</application>, who will cut off all but
-   the last valid URL in the request and send a local redirect back to your
-   browser without contacting the remote site.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+fast-redirects</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   Apply the filters in the <literal>section_header</literal> 
-   section of the <filename>default.filter</filename> file to the site(s).
-   <filename>default.filter</filename> sections are grouped according to like
-   functionality. 
-  </para> 
-   
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
- <emphasis>+filter{section_header}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-
-  <para>   
-   Filter sections that are pre-defined in the supplied
-   <filename>default.filter</filename> include:
-  </para>
-
- <blockquote>
-  <simplelist>
-   <member>
-     <emphasis>html-annoyances</emphasis>:  Get rid of particularly annoying HTML abuse.
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>js-annoyances</emphasis>:    Get rid of particularly annoying JavaScript abuse
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>no-poups</emphasis>:         Kill all popups in JS and HTML
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>frameset-borders</emphasis>: Give frames a border
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>webbugs</emphasis>:          Squish WebBugs (1x1 invisible GIFs used for user tracking)
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>no-refresh</emphasis>:       Automatic refresh sucks on auto-dialup lines
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>fun</emphasis>:              Text replacements  for subversive browsing fun!
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>nimda</emphasis>:            Remove (virus) Nimda code.
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-     <emphasis>banners-by-size</emphasis>:  Kill banners by size
-   </member>
-  </simplelist>
-  <simplelist>
-   <member>
-    <emphasis>crude-parental</emphasis>:   Kill all web pages that contain the words "sex" or "warez"
-   </member>
-  </simplelist>
- </blockquote>
-
- </listitem>
-
- <listitem>
-  <para>  
-   Block any existing X-Forwarded-for header, and do not add a new one:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-forwarded</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   If the browser sends a <quote>From:</quote> header containing your e-mail
-   address, this either completely removes the header (<quote>block</quote>), or
-   changes it to the specified e-mail address.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-from{block}</emphasis>
-  <emphasis>+hide-from{spam@sittingduck.xqq}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Don't send the <quote>Referer:</quote> (sic) header to the web site.  You
-   can block it, forge a URL to the same server as the request (which is
-   preferred because some sites will not send images otherwise) or set it to a
-   constant string of your choice.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-referer{block}</emphasis>
-  <emphasis>+hide-referer{forge}</emphasis>
-  <emphasis>+hide-referer{http://nowhere.com}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Alternative spelling of <quote>+hide-referer</quote>.  It has the same
-   parameters, and can be freely mixed with, <quote>+hide-referer</quote>.
-   (<quote>referrer</quote> is the correct English spelling, however the HTTP
-   specification has a bug - it requires it to be spelled <quote>referer</quote>.) 
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-referrer{...}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-   Change the <quote>User-Agent:</quote> header so web servers can't tell your
-   browser type.  Warning! This breaks many web sites.  Specify the
-   user-agent value you want. Example, pretend to be using Netscape on
-   Linux:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- <!-- 
-  <para>
-   Or to identify yourself explicitly as a  <application>Privoxy</application> user:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{Privoxy/1.0}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-   (Don't change the version number from 1.0 - after all, why tell them?)
-  <para>
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+hide-user-agent{browser-type}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
--->
- </listitem>
-
- <listitem>
-  <para>  
-   Treat this URL as an image.  This only matters if it's also <quote>+block</quote>ed,
-   in which case a <quote>blocked</quote> image can be sent rather than a HTML page.
-   See <quote>+image-blocker{}</quote> below for the control over what is actually sent.
-   If you want <emphasis>invisible</emphasis> ads, they should be defined as 
-   <emphasis>images</emphasis> and <emphasis>blocked</emphasis>. And also, 
-   <quote>image-blocker</quote>  should be set to <quote>blank</quote>.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+image</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para> Decides what to do with URLs that end up tagged with <quote>{+block
-  +image}</quote>, e.g an advertizement. There are five options.
-  <quote>-image-blocker</quote> will send a HTML <quote>blocked</quote> page,
-  usually resulting in a <quote>broken image</quote> icon.
-<!--   <quote>+image-blocker{logo}</quote> will send a -->
-<!--   <application>Privoxy</application> logo -->
-<!--   image. -->
-<quote>+image-blocker{blank}</quote> will send a 1x1 transparent GIF
-image. And finally, <quote>+image-blocker{http://xyz.com}</quote> will send a
-HTTP temporary redirect to the specified image. This has the advantage of the
-icon being being cached by the browser, which will speed up the display.
-<quote>+image-blocker{pattern}</quote> will send a checkboard type pattern
-<!-- , -->
-<!-- which scales better than the logo (which can get blocky if the browser -->
-<!-- enlarges it too much). -->
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-<!--   <emphasis>+image-blocker{logo}</emphasis> -->
-  <emphasis>+image-blocker{blank}</emphasis>
-  <emphasis>+image-blocker{pattern}</emphasis>
-  <emphasis>+image-blocker{http://p.p/send-banner}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-   <para> 
-   By default (i.e. in the absence of a <quote>+limit-connect</quote>
-   action), <application>Privoxy</application> will only allow CONNECT
-   requests to port 443, which is the standard port for https as a 
-   precaution.
-  </para>
-  <para>
-   The CONNECT methods exists in HTTP to allow access to secure websites
-   (https:// URLs) through proxies. It works very simply: the proxy
-   connects to the server on the specified port, and then short-circuits
-   its connections to the client <emphasis>and</emphasis> to the remote proxy.
-   This can be a big security hole, since CONNECT-enabled proxies can
-   be abused as TCP relays very easily.
-  </para>
-  
-  <para> 
-   If you want to allow CONNECT for more ports than this, or want to forbid
-   CONNECT altogether, you can specify a comma separated list of ports and
-   port ranges (the latter using dashes, with the minimum defaulting to 0 and
-   max to 65K):
-  </para>
-
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+limit-connect{443}                 # This is the default and need no be specified.</emphasis>
-  <emphasis>+limit-connect{80,443}              # Ports 80 and 443 are OK.</emphasis>
-  <emphasis>+limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to 100</emphasis>
-  <emphasis>                                    #and above 500 are OK.</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
-
- </listitem> 
- <listitem>
-  <para>
-   <quote>+no-compression</quote> prevents the website from compressing the
-   data. Some websites do this, which can be a problem for
-   <application>Privoxy</application>, since <quote>+filter</quote>,
-   <quote>+no-popup</quote> and <quote>+gif-deanimate</quote> will not work on
-   compressed data. This will slow down connections to those websites,
-   though. Default is <quote>nocompression</quote> is turned on.
-  </para>
-
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+nocompression</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem> 
- <listitem>
-  <para>  
-   If the website sets cookies, <quote>no-cookies-keep</quote> will make sure
-   they are erased when you exit and restart your web browser. This makes
-   profiling cookies useless, but won't break sites which require cookies so
-   that you can log in for transactions. Default: on.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-keep</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Prevent the website from reading cookies:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-read</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Prevent the website from setting cookies:
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-cookies-set</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   Filter the website through a built-in filter to disable those obnoxious 
-   JavaScript pop-up windows via window.open(), etc. The two alternative
-   spellings are equivalent.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+no-popup</emphasis>
-  <emphasis>+no-popups</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   This action only applies if you are using a <filename>jarfile</filename>
-   for saving cookies. It sends a cookie to every site stating that you do not
-   accept any copyright on cookies sent to you, and asking them not to track
-   you.  Of course, this is a (relatively) unique header they could use to
-   track you.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+vanilla-wafer</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
- <listitem>
-  <para>  
-   This allows you to add an arbitrary cookie. It can be specified multiple
-   times in order to add as many cookies as you like.
-  </para>
-  <para>
-   <literal>
-    <msgtext> 
-     <literallayout>
-  <emphasis>+wafer{name=value}</emphasis>
-     </literallayout>
-    </msgtext> 
-   </literal>
-  </para>
- </listitem>
-
- </itemizedlist>
-</para>
-
-<para>
- The meaning of any of the above is reversed by preceding the action with a 
- <quote>-</quote>, in place of the <quote>+</quote>.
-</para>
-
-<para>
- Some examples:
-</para>
-
-<para>
- Turn off cookies by default, then allow a few through for specified sites:
-</para>
-  
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Turn off all persistent cookies
- { +no-cookies-read }
- { +no-cookies-set }
- # Allow cookies for this browser session ONLY
- { +no-cookies-keep }
-
- # Exceptions to the above, sites that benefit from persistent cookies
- { -no-cookies-read }
- { -no-cookies-set }
- { -no-cookies-keep }
- .javasoft.com
- .sun.com
- .yahoo.com
- .msdn.microsoft.com
- .redhat.com
-
- # Alternative way of saying the same thing
- {-no-cookies-set -no-cookies-read -no-cookies-keep}
- .sourceforge.net
- .sf.net
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now turn off <quote>fast redirects</quote>, and then we allow two exceptions:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Turn them off!
- {+fast-redirects}
- # Reverse it for these two sites, which don't work right without it.
- {-fast-redirects}
- www.ukc.ac.uk/cgi-bin/wac\.cgi\?
- login.yahoo.com
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Turn on page filtering according to rules in the defined sections 
- of <filename>refilterfile</filename>, and make one exception for 
- sourceforge:
- </para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Run everything through the filter file, using only the
- # specified sections:
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
- +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-              
- # Then disable filtering of code from sourceforge!
- {-filter}
- .cvs.sourceforge.net
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Now some URLs that we want <quote>blocked</quote>, ie we won't see them.
- Many of these use regular expressions that will expand to match multiple 
- URLs:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
-  # Blocklist:
-  {+block}
-  /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))
-  /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])
-  /.*/(ng)?adclient\.cgi
-  /.*/(plain|live|rotate)[-_.]?ads?/
-  /.*/(sponsor)s?[0-9]?/
-  /.*/_?(plain|live)?ads?(-banners)?/
-  /.*/abanners/
-  /.*/ad(sdna_image|gifs?)/
-  /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-  /.*/adbanners/
-  /.*/adserver
-  /.*/adstream\.cgi
-  /.*/adv((er)?ts?|ertis(ing|ements?))?/
-  /.*/banner_?ads/
-  /.*/banners?/
-  /.*/banners?\.cgi/
-  /.*/cgi-bin/centralad/getimage
-  /.*/images/addver\.gif
-  /.*/images/marketing/.*\.(gif|jpe?g)
-  /.*/popupads/
-  /.*/siteads/
-  /.*/sponsor.*\.gif
-  /.*/sponsors?[0-9]?/
-  /.*/advert[0-9]+\.jpg
-  /Media/Images/Adds/
-  /ad_images/
-  /adimages/
-  /.*/ads/
-  /bannerfarm/
-  /grafikk/annonse/
-  /graphics/defaultAd/
-  /image\.ng/AdType
-  /image\.ng/transactionID
-  /images/.*/.*_anim\.gif # alvin brattli
-  /ip_img/.*\.(gif|jpe?g)
-  /rotateads/
-  /rotations/ 
-  /worldnet/ad\.cgi
-  /cgi-bin/nph-adclick.exe/
-  /.*/Image/BannerAdvertising/
-  /.*/ad-bin/
-  /.*/adlib/server\.cgi
-  /autoads/
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Note that many of these actions have the potential to cause a page to
- misbehave, possibly even not to display at all. There are many ways 
- a site designer may choose to design his site, and what HTTP header 
- content he may depend on. There is no way to have hard and fast rules 
- for all sites. See the <link linkend="ACTIONSANAT">Appendix</link>
- for a brief example on troubleshooting actions.
-
-</para>
-
-</sect3>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect3>
-<title>Aliases</title>
-<para>
- Custom <quote>actions</quote>, known to <application>Privoxy</application>
- as <quote>aliases</quote>, can be defined by combining other <quote>actions</quote>.
- These can in turn be invoked just like the built-in <quote>actions</quote>.
- Currently, an alias can contain any character except space, tab, <quote>=</quote>,
- <quote>{</quote> or <quote>}</quote>. But please use only <quote>a</quote>-
- <quote>z</quote>, <quote>0</quote>-<quote>9</quote>, <quote>+</quote>, and
- <quote>-</quote>. Alias names are not case sensitive, and 
- <emphasis>must be defined  before anything</emphasis> else in the
- <filename>default.action</filename>file ! And there can only be one set of
- <quote>aliases</quote> defined.
-</para>
-
-<para>
- Now let's define a few aliases:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # Useful customer aliases we can use later. These must come first!
- {{alias}}
- +no-cookies = +no-cookies-set +no-cookies-read
- -no-cookies = -no-cookies-set -no-cookies-read
- fragile     = -block -no-cookies -filter -fast-redirects -hide-referer -no-popups
- shop        = -no-cookies -filter -fast-redirects
- +imageblock = +block +image
-
- #For people who don't like to type too much:  ;-)
- c0 = +no-cookies
- c1 = -no-cookies
- c2 = -no-cookies-set +no-cookies-read
- c3 = +no-cookies-set -no-cookies-read
- #... etc.  Customize to your heart's content.
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Some examples using our <quote>shop</quote> and <quote>fragile</quote>
- aliases from above:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # These sites are very complex and require
- # minimal interference.
- {fragile}
- .office.microsoft.com
- .windowsupdate.microsoft.com
- .nytimes.com
-
- # Shopping sites - still want to block ads.
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
-
- # These shops require pop-ups
- {shop -no-popups}
- .dabs.com
- .overclockers.co.uk
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect3>
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="filterfile">
-<title>The Filter File</title>
-<para>
- Any web page can be dynamically modified with the filter file. This
- modification can be removal, or re-writing, of any web page content,
- including tags and non-visible content. The default filter file is
- <filename>default.filter</filename>, located in the config directory. 
-</para>
-
-<para>
- The included example file is divided into sections. Each section begins 
- with the <literal>FILTER</literal> keyword, followed by the identifier 
- for that section, e.g. <quote>FILTER: webbugs</quote>. Each section performs
- a similar type of filtering, such as <quote>html-annoyances</quote>.
-
-</para>
-
-<para>
- This file uses regular expressions to alter or remove any string in the
- target page. The expressions can only operate on one line at a time. Some
- examples from the included default <filename>default.filter</filename>:
-</para>
-
-<para>
- Stop web pages from displaying annoying messages in the status bar by
- deleting such references:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: html-annoyances
-
- # New browser windows should be resizeable and have a location and status
- # bar. Make it so.
- #
- s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
- s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
- s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
- s/menubar="?(no|0)"?/menubar=1/ig 
-
- # The &lt;BLINK&gt; tag was a crime!
- #
- s*&lt;blink&gt;|&lt;/blink&gt;**ig
-
- # Is this evil? 
- #
- #s/framespacing="?(no|0)"?//ig
- #s/margin(height|width)=[0-9]*//gi
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Just for kicks, replace any occurrence of <quote>Microsoft</quote> with
- <quote>MicroSuck</quote>, and have a little fun with topical buzzwords: 
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- FILTER: fun
-
- s/microsoft(?!.com)/MicroSuck/ig
-
- # Buzzword Bingo:
- #
- s/industry-leading|cutting-edge|award-winning/&lt;font color=red&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt;/ig
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-<para>
- Kill those pesky little web-bugs:
-</para>
-
-<para>
- <literal>
-  <msgtext> 
-   <literallayout>
- # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
- FILTER: webbugs
-
- s/&lt;img\s+[^&gt;]*?(width|height)\s*=\s*['"]?1\D[^&gt;]*?(width|height)\s*=\s*['"]?1(\D[^&gt;]*?)?>/&lt;!-- Squished WebBug --&gt;/sig
-   </literallayout>
-  </msgtext> 
- </literal>
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Templates</title>
-<para>
- When <application>Privoxy</application> displays one of its internal 
- pages, such as a 404 Not Found error page, it uses the appropriate template.
- On Linux, BSD, and Unix, these are located in
- <filename>/etc/privoxy/templates</filename> by default. These may be
- customized, if desired.
-
-</para>
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="quickstart"><title>Quickstart to Using <application>Privoxy</application></title>
-<para>
- Install package, then run and enjoy! <application>Privoxy</application> 
- is typically started by specifying the main configuration file to be 
- used on the command line. Example Unix startup command:
-</para>
-
-<para>
- <screen>
- # /usr/sbin/privoxy /etc/privoxy/config
- </screen>
-</para>
-
-<para>
- An init script is provided for SuSE and Redhat.
-</para>
-
-<para>
-For for SuSE: /etc/rc.d/privoxy start
-</para>
-
-<para>
-For RedHat: /etc/rc.d/init.d/privoxy start
-</para>
-
-
-<para>
- If no configuration file is specified on the command line,
- <application>Privoxy</application> will look for a file named
- <filename>config</filename> in the current directory. Except on Win32 where
- it will try <filename>config.txt</filename>. If no file is specified on the
- command line and no default configuration file can be found, 
- <application>Privoxy</application> will fail to start.
-</para>
-
-<para>
- Be sure your browser is set to use the proxy which is by default at
- localhost, port 8118. With <application>Netscape</application> (and
- <application>Mozilla</application>), this can be set under <literal>Edit
- -&gt; Preferences -&gt; Advanced -&gt; Proxies -&gt; HTTP Proxy</literal>.
- For <application>Internet Explorer</application>: <literal>Tools &gt;
- Internet Properties -&gt; Connections -&gt; LAN Setting</literal>. Then,
- check <quote>Use Proxy</quote> and fill in the appropriate info (Address:
- localhost, Port: 8118). Include if HTTPS proxy support too.
-</para>
-
-<para>
- The included default configuration files should give a reasonable starting
- point, though may be somewhat aggressive in blocking junk. You will probably
- want to keep an eye out for sites that require persistent cookies, and add these to
- <filename>default.action</filename> as needed. By default, most of these will
- be accepted only during the current browser session, until you add them to
- the configuration. If you want the browser to handle this instead, you will
- need to edit <filename>default.action</filename> and disable this feature. If you
- use more than one browser, it would make more sense to let
- <application>Privoxy</application> handle this. In which case, the
- browser(s) should be set to accept all cookies.
-</para>
-
-<para>
- If a particular site shows problems loading properly, try adding it 
- to the <literal>{fragile}</literal> section of
- <filename>default.action</filename>. This will turn off most actions for 
- this site.
-</para>
-
-<para>
- <application>Privoxy</application> is HTTP/1.1 compliant,  but not all 1.1
- features are as yet implemented. If browsers that support HTTP/1.1 (like
- <application>Mozilla</application> or recent versions of I.E.) experience
- problems, you might try to force HTTP/1.0 compatibility. For Mozilla, look
- under <literal>Edit -&gt; Preferences -&gt; Debug -&gt; Networking</literal>.
- Or set the <quote>+downgrade</quote> config option in
- <filename>default.action</filename>.
-</para>
-
-<para>
- After running <application>Privoxy</application> for a while, you can 
- start to fine tune the configuration to suit your personal, or site, 
- preferences and requirements. There are many, many aspects that can 
- be customized. <quote>Actions</quote> (as specified in <filename>default.action</filename>) 
- can be adjusted by pointing your browser to 
- <ulink url="http://p.p/">http://p.p/</ulink>, 
- and then follow the link to <quote>edit the actions list</quote>. 
- (This is an internal page and does not require Internet access.)
-</para>
-
-<para>
- In fact, various aspects of <application>Privoxy</application>
- configuration can be viewed from this page, including 
- current configuration parameters, source code version numbers, 
- the browser's request headers, and <quote>actions</quote> that apply 
- to a given URL. In addition to the <filename>default.action</filename> file 
- editor mentioned above, <application>Privoxy</application> can also 
- be turned <quote>on</quote> and <quote>off</quote> from this page.
-</para>
-
-<para>
- If you encounter problems, please verify it is a
- <application>Privoxy</application> bug, by disabling
- <application>Privoxy</application>, and then trying the same page. 
- Also, try another browser if possible to eliminate browser or site 
- problems. Before reporting it as a bug, see if there is not a configuration 
- option that is enabled that is causing the page not to load. You can 
- then add an exception for that page or site. If a bug, please report it to
- the developers (see below). 
-</para>
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>Command Line Options</title>
-<para>
- <application>Privoxy</application> may be invoked with the following
- command-line options:
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>
-    <emphasis>--version</emphasis>
-  </para>
-  <para>
-     Print version info and exit, Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-    <emphasis>--help</emphasis>
-  </para>
-  <para>
-   Print a short usage info and exit, Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--no-daemon</emphasis>
-  </para>
-  <para>
-   Don't become a daemon, i.e. don't fork and become process group
-   leader, don't detach from controlling tty. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--pidfile FILE</emphasis>
-  
-  </para>
-  <para>
-   On startup, write the process ID to <emphasis>FILE</emphasis>. Delete the
-   <emphasis>FILE</emphasis> on exit. Failiure to create or delete the
-   <emphasis>FILE</emphasis> is non-fatal. If no <emphasis>FILE</emphasis>
-   option is given, no PID file will be used. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-   <emphasis>--user USER[.GROUP]</emphasis>
-  
-  </para>
-  <para>
-   After (optionally) writing the PID file, assume the user  ID  of
-   <emphasis>USER</emphasis>, and if included the GID of GROUP.  Exit if the
-   privileges are not sufficient to do so. Unix only.
-  </para>
- </listitem> 
- <listitem>
-  <para>
-    <emphasis>configfile</emphasis>
-  </para>
-  <para>
-    If no <emphasis>configfile</emphasis> is included on the command line, 
-    <application>Privoxy</application> will look for a file named 
-    <quote>config</quote> in the current directory (except on Win32 
-    where it will look for <quote>config.txt</quote> instead). Specify 
-    full path to avoid confusion.
-  </para>
- </listitem> 
-
- </itemizedlist>
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--  ~  End section  ~  -->
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect1 id="contact"><title>Contacting the Developers, Bug Reporting and Feature
-Requests</title>
-<para>
-We value your feedback. However, to provide you with the best support,
-please note:
-
- <itemizedlist>
-
-  <listitem><para>Use the <ulink url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=211118">Sourceforge support forum</ulink> to get
-  help.</para></listitem>
-  <listitem><para>Submit bugs only thru our <ulink url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=111118">Sourceforge bug
-      forum</ulink>. 
-Make sure that the bug has not already been submitted.  Please try to
-verify that it is a <application>Privoxy</application> bug, and not
-a browser or site bug first. If you are using your own custom configuration,
-please try the stock configs to see if the problem is a configuration
-related bug.  And if not using the latest development snapshot, please
-try the latest one. Or even better, CVS sources.</para>
-</listitem>
-
-  <listitem><para>Submit feature requests only thru our <ulink
-      url="http://sourceforge.net/tracker/?atid=361118&#38;group_id=11118&#38;func=browse">Sourceforge feature request forum</ulink>.</para></listitem>
-
-
- </itemizedlist>
-
-</para>
-
-<para>
-For any other issues, feel free to use the <ulink url="http://sourceforge.net/mail/?group_id=11118">mailing lists</ulink>.
-</para>
-
-<para>
- Anyone interested in actively participating in development and related 
- discussions can join the appropriate mailing list  
- <ulink url="http://sourceforge.net/mail/?group_id=11118">here</ulink>.
- Archives are available here too.
-</para>
-
-</sect1>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="copyright"><title>Copyright and History</title>
-
-<sect2>
-<title>License</title>
-<para>
- <application>Privoxy</application> is free software; you can
- redistribute it and/or modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-</para>
-
-<para>
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
- details, which is available from <ulink
- url="http://www.gnu.org/copyleft/gpl.html">the Free Software Foundation,
- Inc</ulink>, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-
-<sect2>
-<title>History</title>
-<para>
- <application>Privoxy</application> is derived from
- <application>the Internet Junkbuster</application>, with many 
- improvments and enhancements over the original.
-</para>
-
-<para>
- <application>Junkbuster</application> was originally written by Anonymous
- Coders and <ulink
- url="http://www.junkbusters.com">Junkbuster's
- Corporation</ulink>, and was released as free open-source software under the
- GNU GPL. <ulink url="http://www.waldherr.org/junkbuster/">Stefan
- Waldherr</ulink> made many improvements, and started the <ulink
- url="http://sourceforge.net/projects/ijbswa/">SourceForge project
- Privoxy</ulink> to rekindle development. There are now several active
- developers contributing.  The last stable release of
- <application>Junkbuster</application> was v2.0.2, which has now
- grown whiskers ;-).
-</para>
-
-</sect2>
-
-</sect1>
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="seealso"><title>See also</title>
-<para>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://sourceforge.net/projects/ijbswa">http://sourceforge.net/projects/ijbswa</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.privoxy.org/">http://www.privoxy.org/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://p.p/">http://p.p/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.junkbusters.com/ht/en/cookies.html">http://www.junkbusters.com/ht/en/cookies.html</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://www.waldherr.org/junkbuster/">http://www.waldherr.org/junkbuster/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp; <ulink url="http://privacy.net/analyze/">http://privacy.net/analyze/</ulink>
-  </member>
- </simplelist>
- <simplelist>
-  <member>
-   &nbsp;<ulink url="http://www.squid-cache.org/">http://www.squid-cache.org/</ulink>
-  </member>
- </simplelist>
-
-</para>
-</sect1>
-
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect1 id="appendix"><title>Appendix</title>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="regex">
-<title>Regular Expressions</title>
-<para>
- <application>Privoxy</application> can use <quote>regular expressions</quote> 
- in various config files. Assuming support for <quote>pcre</quote> (Perl
- Compatible Regular Expressions) is compiled in, which is the default. Such
- configuration directives do not require regular expressions, but they can be
- used to increase flexibility by matching a pattern with wild-cards against
- URLs.
-</para>
-
-<para>
- If you are reading this, you probably don't understand what <quote>regular
- expressions</quote> are, or what they can do. So this will be a very brief
- introduction only. A full explanation would require a book ;-)
-</para>
-
-<para>
- <quote>Regular expressions</quote> is a way of matching one character
- expression against another to see if it matches or not. One of the
- <quote>expressions</quote> is a literal string of readable characters
- (letter, numbers, etc), and the other is a complex string of literal
- characters combined with wild-cards, and other special characters, called
- meta-characters. The <quote>meta-characters</quote> have special meanings and
- are used to build the complex pattern to be matched against. Perl Compatible
- Regular Expressions is an enhanced form of the regular expression language
- with backward compatibility.
-</para>
-
-<para>
- To make a simple analogy, we do something similar when we use wild-card
- characters when listing files with the <command>dir</command> command in DOS. 
- <literal>*.*</literal> matches all filenames. The <quote>special</quote>
- character here is the asterisk which matches any and all characters. We can be
- more specific and use <literal>?</literal> to match just individual
- characters. So <quote>dir file?.text</quote> would match
- <quote>file1.txt</quote>, <quote>file2.txt</quote>, etc. We are pattern
- matching, using a similar technique to <quote>regular expressions</quote>!
-</para>
-
-<para>
- Regular expressions do essentially the same thing, but are much, much more
- powerful. There are many more <quote>special characters</quote> and ways of 
- building complex patterns however. Let's look at a few of the common ones,
- and then some examples:
-</para>
-
-<simplelist>
- <member>
-  <emphasis>.</emphasis> - Matches any single character, e.g. <quote>a</quote>,
-  <quote>A</quote>, <quote>4</quote>, <quote>:</quote>, or <quote>@</quote>.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>?</emphasis> - The preceding character or expression is matched ZERO or ONE
-  times. Either/or.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>+</emphasis> - The preceding character or expression is matched ONE or MORE
-  times.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>*</emphasis> - The preceding character or expression is matched ZERO or MORE
-  times.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>\</emphasis> - The <quote>escape</quote> character denotes that
-  the following character should be taken literally. This is used where one of the 
-  special characters (e.g. <quote>.</quote>) needs to be taken literally and
-  not as a special meta-character.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>[]</emphasis> - Characters enclosed in brackets will be matched if
-  any of the enclosed characters are encountered.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>()</emphasis> - parentheses are used to group a sub-expression,
-  or multiple sub-expressions.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>|</emphasis> - The <quote>bar</quote> character works like an
-  <quote>or</quote> conditional statement. A match is successful if the
-  sub-expression on either side of <quote>|</quote> matches.
- </member>
-</simplelist>
-
-<simplelist>
- <member>
-  <emphasis>s/string1/string2/g</emphasis> - This is used to rewrite strings of text. 
-  <quote>string1</quote> is replaced by <quote>string2</quote> in this
-  example.
- </member>
-</simplelist>
-
-<para>
- These are just some of the ones you are likely to use when matching URLs with 
- <application>Privoxy</application>, and is a long way from a definitive
- list. This is enough to get us started with a few simple examples which may
- be more illuminating:
-</para>
-
-<para>
- <emphasis><literal>/.*/banners/.*</literal></emphasis> - A  simple example
- that uses the common combination of <quote>.</quote> and <quote>*</quote> to 
- denote any character, zero or more times. In other words, any string at all.
- So we start with a literal forward slash, then our regular expression pattern 
- (<quote>.*</quote>) another literal forward slash, the string
- <quote>banners</quote>, another forward slash, and lastly another
- <quote>.*</quote>. We are building 
- a directory path here. This will match any file with the path that has a
- directory named <quote>banners</quote> in it. The <quote>.*</quote> matches
- any characters, and this could conceivably be more forward slashes, so it
- might expand into a much longer looking path. For example, this could match:
- <quote>/eye/hate/spammers/banners/annoy_me_please.gif</quote>, or just
- <quote>/banners/annoying.html</quote>, or almost an infinite number of other
- possible combinations, just so it has <quote>banners</quote> in the path
- somewhere.
-</para>
-
-<para>
- A now something a little more complex:
-</para>
-
-<para>
- <emphasis><literal>/.*/adv((er)?ts?|ertis(ing|ements?))?/</literal></emphasis> - 
- We have several literal forward slashes again (<quote>/</quote>), so we are
- building another expression that is a file path statement. We have another 
- <quote>.*</quote>, so we are matching against any conceivable sub-path, just so
- it matches our expression. The only true literal that <emphasis>must
- match</emphasis> our pattern is <application>adv</application>, together with
- the forward slashes. What comes after the <quote>adv</quote> string is the
- interesting part. 
-</para>
-
-<para>
- Remember the <quote>?</quote> means the preceding expression (either a
- literal character or anything grouped with <quote>(...)</quote> in this case)
- can exist or not, since this means either zero or one match. So
- <quote>((er)?ts?|ertis(ing|ements?))</quote> is optional, as are the
- individual sub-expressions: <quote>(er)</quote>,
- <quote>(ing|ements?)</quote>, and the <quote>s</quote>. The <quote>|</quote>
- means <quote>or</quote>. We have two of those. For instance, 
- <quote>(ing|ements?)</quote>, can expand to match either <quote>ing</quote> 
- <emphasis>OR</emphasis> <quote>ements?</quote>. What is being done here, is an
- attempt at matching as many variations of <quote>advertisement</quote>, and 
- similar, as possible. So this would expand to match just <quote>adv</quote>,
- or <quote>advert</quote>, or <quote>adverts</quote>, or
- <quote>advertising</quote>, or <quote>advertisement</quote>, or
- <quote>advertisements</quote>. You get the idea. But it would not match 
- <quote>advertizements</quote> (with a <quote>z</quote>). We could fix that by
- changing our regular expression to: 
- <quote>/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/</quote>, which would then match
- either spelling.
-</para>
-
-<para>
- <emphasis><literal>/.*/advert[0-9]+\.(gif|jpe?g)</literal></emphasis> - Again 
- another path statement with forward slashes. Anything in the square brackets 
- <quote>[]</quote> can be matched. This is using <quote>0-9</quote> as a
- shorthand expression to mean any digit one through nine. It is the same as
- saying <quote>0123456789</quote>. So any digit matches. The <quote>+</quote>
- means one or more of the preceding expression must be included. The preceding 
- expression here is what is in the square brackets -- in this case, any digit 
- one through nine. Then, at the end, we have a grouping: <quote>(gif|jpe?g)</quote>. 
- This includes a <quote>|</quote>, so this needs to match the expression on
- either side of that bar character also. A simple <quote>gif</quote> on one side, and the other
- side will in turn match either <quote>jpeg</quote> or <quote>jpg</quote>,
- since the <quote>?</quote> means the letter <quote>e</quote> is optional and
- can be matched once or not at all. So we are building an expression here to
- match image GIF or JPEG type image file. It must include the literal
- string <quote>advert</quote>, then one or more digits, and a <quote>.</quote>
- (which is now a literal, and not a special character, since it is escaped
- with <quote>\</quote>), and lastly either <quote>gif</quote>, or
- <quote>jpeg</quote>, or <quote>jpg</quote>. Some possible matches would
- include: <quote>//advert1.jpg</quote>,
- <quote>/nasty/ads/advert1234.gif</quote>,
- <quote>/banners/from/hell/advert99.jpg</quote>. It would not match
- <quote>advert1.gif</quote> (no leading slash), or
- <quote>/adverts232.jpg</quote> (the expression does not include an
- <quote>s</quote>), or <quote>/advert1.jsp</quote> (<quote>jsp</quote> is not
- in the expression anywhere).
-</para>
-
-<para>
- <emphasis><literal>s/microsoft(?!.com)/MicroSuck/i</literal></emphasis> - This is 
- a substitution. <quote>MicroSuck</quote> will replace any occurrence of 
- <quote>microsoft</quote>.  The <quote>i</quote> at the end of the expression
- means ignore case. The <quote>(?!.com)</quote> means 
- the match should fail if <quote>microsoft</quote> is followed by
- <quote>.com</quote>. In other words, this acts like a <quote>NOT</quote>
- modifier. In case this is a hyperlink, we don't want to break it ;-).
-</para>
-
-<para>
- We are barely scratching the surface of regular expressions here so that you
- can understand the default <application>Privoxy</application>
- configuration files, and maybe use this knowledge to customize your own
- installation. There is much, much more that can be done with regular
- expressions. Now that you know enough to get started, you can learn more on
- your own :/
-</para>
-
-<para>
- More reading on Perl Compatible Regular expressions: 
- <ulink url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>
-</para>
-
-</sect2>
-
-<!--  ~  End section  ~  -->
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2>
-<title><application>Privoxy</application>'s Internal Pages</title>
-
-<para>
- Since <application>Privoxy</application> proxies each requested 
- web page, it is easy for <application>Privoxy</application> to 
- trap certain URLs. In this way, we can talk directly to
- <application>Privoxy</application>, and see how it is 
- configured, see how our rules are being applied, change these 
- rules and other configuration options, and even turn
- <application>Privoxy's</application> filtering off, all with 
- a web browser.
-
-</para>
-
-<para>
- The URLs listed below are the special ones that allow direct access 
- to <application>Privoxy</application>. Of course,
- <application>Privoxy</application> must be running to access these. If 
- not, you will get a friendly error message. Internet access is not 
- necessary either.
-</para>
-
-<para>
- <itemizedlist>
-
- <listitem>
-  <para>  
-   Privoxy main page: 
-  </para>
-  <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/">http://www.privoxy.org/config/</ulink>
-   </para>
-  </blockquote>
-  <para>
-   Alternately, this may be reached at <ulink
-   url="http://p.p/">http://p.p/</ulink>, but this
-   variation may not work as reliably as the above in some configurations.
-  </para>
- </listitem>
-
- <listitem>
-  <para>  
-    Show information about the current configuration: 
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-status">http://www.privoxy.org/config/show-status</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-    Show the source code version numbers:
-  </para>
-  <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-version">http://www.privoxy.org/config/show-version</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Show the client's request headers:
-  </para>
-  <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-request">http://www.privoxy.org/config/show-request</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Show which actions apply to a URL and why:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
-   </para>
-  </blockquote>
- </listitem>
- <listitem>
-  <para>  
-   Toggle Privoxy on or off:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/toggle">http://www.privoxy.org/config/toggle</ulink>
-   </para>
-  </blockquote>
-  <para>
-   Short cuts. Turn off, then on: 
-  </para>
-   <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/toggle?set=disable">http://www.privoxy.org/config/toggle?set=disable</ulink>
-   </para>
-  </blockquote>
-   <blockquote>
-   <para> 
-     <ulink url="http://www.privoxy.org/config/toggle?set=enable">http://www.privoxy.org/config/toggle?set=enable</ulink>
-   </para>
-  </blockquote>
- </listitem>
-
- <listitem>
-  <para>  
-   Edit the actions list file:
-  </para>
-   <blockquote>
-   <para> 
-    <ulink url="http://www.privoxy.org/config/edit-actions">http://www.privoxy.org/config/edit-actions</ulink>
-   </para>
-  </blockquote>
- </listitem>
- </itemizedlist>
-</para>
-
-<para>
- These may be bookmarked for quick reference.
-
-</para>
-
-</sect2>
-
-
-<!--   ~~~~~       New section      ~~~~~     -->
-<sect2 id="actionsanat">
-<title>Anatomy of an Action</title>
-
-<para>
- The way <application>Privoxy</application> applies <quote>actions</quote>
- to any given URL can be complex, and not always so easy to understand what 
- is happening. And sometimes we need to be able to <emphasis>see</emphasis>
- just what <application>Privoxy</application> is doing. Especially, 
- if something <application>Privoxy</application> is doing is causing 
- us a problem inadvertantly. It can be a little daunting to look at 
- the actions files themselves, since they tend to be filled with 
- <quote>regular expressions</quote> whose consequences are not always 
- so obvious. <application>Privoxy</application> provides the 
- <ulink url="http://www.privoxy.org/config/show-url-info">http://www.privoxy.org/config/show-url-info</ulink>
- page that can show us very specifically how <application>actions</application>
- are being applied to any given URL. This is a big help for troubleshooting.
- </para>
-
-<para>
- First, enter one URL (or partial URL) at the prompt, and then
- <application>Privoxy</application> will tell us 
- how the current configuration will handle it. This will not
- help with filtering effects from the <filename>default.filter</filename> file! It
- also will not tell you about any other URLs that may be embedded within the
- URL you are testing. For instance, images such as ads are expressed as URLs
- within the raw page source of HTML pages. So you will only get info for the
- actual URL that is pasted into the prompt area -- not any sub-URLs. If you
- want to know about embedded URLs like ads, you will have to dig those out of
- the HTML source. Use your browser's <quote>View Page Source</quote> option
- for this.
-</para>
-
-<para>
- Let's look at an example, <ulink url="http://google.com">google.com</ulink>, 
- one section at a time:
-</para>
-
-<para>
- <screen>
- System default actions:
-
- { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter 
-   -hide-forwarded -hide-from -hide-referer -hide-user-agent -image 
-   -image-blocker -limit-connect -no-compression -no-cookies-keep 
-   -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer }
- </screen>
-</para>
-
-<para>
- This is the top section, and only tells us of the compiled in defaults. This 
- is basically what <application>Privoxy</application> would do if there 
- were not any <quote>actions</quote> defined, i.e. it does nothing. Every action 
- is disabled. This is not particularly informative for our purposes here. OK,
- next section:
-</para>
-
-<para>
- <screen>
-
- Matches for http://google.com:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects 
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
-   -hide-user-agent -image +image-blocker{blank} +no-compression 
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups 
-   -vanilla-wafer -wafer }
-   /
-
- { -no-cookies-keep -no-cookies-read -no-cookies-set }
-  .google.com
-
- { -fast-redirects }
-  .google.com
-
- </screen>
-</para>
-
-<para>
- This is much more informative, and tells us how we have defined our 
- <quote>actions</quote>, and which ones match for our example, 
- <quote>google.com</quote>. The first grouping shows our default 
- settings, which would apply to all URLs. If you look at your <quote>actions</quote>
- file, this would be the section just below the <quote>aliases</quote> section 
- near the top. This applies to all URLs as signified by the single forward
- slash -- <quote>/</quote>.
-</para>
-
-<para>
- These are the default actions we have enabled. But we can define additional
- actions that would be exceptions to these general rules, and then list 
- specific URLs that these exceptions would apply to. Last match wins.
- Just below this then are two explict matches for <quote>.google.com</quote>.
- The first is negating our various cookie blocking actions (i.e. we will allow
- cookies here). The second is allowing <quote>fast-redirects</quote>. Note
- that there is a leading dot here -- <quote>.google.com</quote>. This will
- match any hosts and sub-domains, in the google.com domain also, such as
- <quote>www.google.com</quote>. So, apparently, we have these actions defined
- somewhere in the lower part of our actions file, and
- <quote>google.com</quote> is referenced in these sections.
-
-</para>
-
-<para>
- And now we pull it altogether in the bottom section and summarize how
- <application>Privoxy</application> is appying all its <quote>actions</quote> 
- to <quote>google.com</quote>:
-
-</para>
-
-<para>
- <screen>
-
- Final results:
-
- -add-header -block -deanimate-gifs -downgrade -fast-redirects 
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
- +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
- +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
- -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression 
- -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer 
- -wafer
-
- </screen>
-</para>
-
-<para>
- Now another example, <quote>ad.doubleclick.net</quote>:
-</para>
-
-<para>
- <screen>
-
- { +block +image }
-  .ad.doubleclick.net
-
- { +block +image }
-  ad*.
-
- { +block +image }
-  .doubleclick.net
-
- </screen>
-</para>
-
-<para>
- We'll just show the interesting part here, the explicit matches. It is 
- matched three different times. Each as an <quote>+block +image</quote>,
- which is the expanded form of one of our aliases that had been defined as: 
- <quote>+imageblock</quote>. (<quote>Aliases</quote> are defined in the 
- first section of the actions file and typically used to combine more 
- than one action.)
-</para>
-
-<para>
- Any one of these would have done the trick and blocked this as an unwanted 
- image. This is unnecessarily redundant since the last case effectively 
- would also cover the first. No point in taking chances with these guys 
- though ;-) Note that if you want an ad or obnoxious 
- URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote>
- is done here -- as both a <quote>+block</quote> <emphasis>and</emphasis> an
- <quote>+image</quote>. The custom alias <quote>+imageblock</quote> does this
- for us.
-</para>
-
-<para>
- One last example. Let's try <quote>http://www.rhapsodyk.net/adsl/HOWTO/</quote>.
- This one is giving us problems. We are getting a blank page. Hmmm...
-</para>
-
-<para>
- <screen>
-
- Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects 
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups} 
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal} 
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge} 
-   -hide-user-agent -image +image-blocker{blank} +no-compression 
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups 
-   -vanilla-wafer -wafer }
-   /
-
- { +block +image }
-  /ads
-
- </screen>
-</para>
-
-<para>
- Ooops, the <quote>/adsl/</quote> is matching <quote>/ads</quote>! But 
- we did not want this at all! Now we see why we get the blank page. We could
- now add a new action below this that explictly does <emphasis>not</emphasis>
- block (-block) pages with <quote>adsl</quote>. There are various ways to
- handle such exceptions. Example:
-</para>
-
-<para>
- <screen>
-
- { -block }
-  /adsl
- </screen>
-</para>
-
-<para>
- Now the page displays ;-)
-
-</para>
-
-<para>
- But now what about a situation where we get no explicit matches like 
- we did with:
-
-</para>
-
-<para>
- <screen>
-
- { -block }
-  /adsl
- </screen>
-</para>
-
-<para>
- That actually was very telling and pointed us quickly to where the problem
- was. If you don't get this kind of match, then it means one of the default 
- rules in the first section is causing the problem. This would require some 
- guesswork, and maybe a little trial and error to isolate the offending rule.
- One likely cause would be one of the <quote>{+filter}</quote> actions. Try 
- adding the URL for the site to one of aliases that turn off <quote>+filter</quote>:
-</para>
-
-<para>
- <screen>
-
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
- .forbes.com
- </screen>
-</para>
-
-<para>
- <quote>{shop}</quote> is an <quote>alias</quote> that expands to 
- <quote>{ -filter -no-cookies -no-cookies-keep }</quote>. Or you could do 
- your own exception to negate filtering:
-
-</para>
-
-<para>
- <screen>
-
- {-filter}
- .forbes.com
- </screen>
-</para>
-
-</sect2>
-
-</sect1>
-
- <!--
-
- This program is free software; you can redistribute it 
- and/or modify it under the terms of the GNU General
- Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will
- be useful, but WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A
- PARTICULAR PURPOSE.  See the GNU General Public
- License for more details.
-
- The GNU General Public License should be included with
- this file.  If not, you can view it at
- http://www.gnu.org/copyleft/gpl.html
- or write to the Free Software Foundation, Inc., 59
- Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
- $Log: user-manual.sgml,v $
- Revision 1.59  2002/03/27 00:54:33  hal9
- Touch up intro for new name.
-
- Revision 1.58  2002/03/26 22:29:55  swa
- we have a new homepage!
-
- Revision 1.57  2002/03/24 20:33:30  hal9
- A few minor catch ups with name change.
-
- Revision 1.56  2002/03/24 16:17:06  swa
- configure needs to be generated.
-
- Revision 1.55  2002/03/24 16:08:08  swa
- we are too lazy to make a block-built
- privoxy logo. hence removed the option.
-
- Revision 1.54  2002/03/24 15:46:20  swa
- name change related issue.
-
- Revision 1.53  2002/03/24 11:51:00  swa
- name change. changed filenames.
-
- Revision 1.52  2002/03/24 11:01:06  swa
- name change
-
- Revision 1.51  2002/03/23 15:13:11  swa
- renamed every reference to the old name with foobar.
- fixed "application foobar application" tag, fixed
- "the foobar" with "foobar". left junkbustser in cvs
- comments and remarks to history untouched.
-
- Revision 1.50  2002/03/23 05:06:21  hal9
- Touch up.
-
- Revision 1.49  2002/03/21 17:01:05  hal9
- New section in Appendix.
-
- Revision 1.48  2002/03/12 06:33:01  hal9
- Catching up to Andreas and re_filterfile changes.
-
- Revision 1.47  2002/03/11 13:13:27  swa
- correct feedback channels
-
- Revision 1.46  2002/03/10 00:51:08  hal9
- Added section on JB internal pages in Appendix.
-
- Revision 1.45  2002/03/09 17:43:53  swa
- more distros
-
- Revision 1.44  2002/03/09 17:08:48  hal9
- New section on Jon's actions file editor, and move some stuff around.
-
- Revision 1.43  2002/03/08 00:47:32  hal9
- Added imageblock{pattern}.
-
- Revision 1.42  2002/03/07 18:16:55  swa
- looks better
-
- Revision 1.41  2002/03/07 16:46:43  hal9
- Fix a few markup problems for jade.
-
- Revision 1.40  2002/03/07 16:28:39  swa
- provide correct feedback channels
-
- Revision 1.39  2002/03/06 16:19:28  hal9
- Note on perceived filtering slowdown per FR.
-
- Revision 1.38  2002/03/05 23:55:14  hal9
- Stupid I did it again. Double hyphen in comment breaks jade.
-
- Revision 1.37  2002/03/05 23:53:49  hal9
- jade barfs on '- -' embedded in comments. - -user option broke it.
-
- Revision 1.36  2002/03/05 22:53:28  hal9
- Add new - - user option.
-
- Revision 1.35  2002/03/05 00:17:27  hal9
- Added section on command line options.
-
- Revision 1.34  2002/03/04 19:32:07  oes
- Changed default port to 8118
-
- Revision 1.33  2002/03/03 19:46:13  hal9
- Emphasis on where/how to report bugs, etc
-
- Revision 1.32  2002/03/03 09:26:06  joergs
- AmigaOS changes, config is now loaded from PROGDIR: instead of
- AmiTCP:db/junkbuster/ if no configuration file is specified on the
- command line.
-
- Revision 1.31  2002/03/02 22:45:52  david__schmidt
- Just tweaking
-
- Revision 1.30  2002/03/02 22:00:14  hal9
- Updated 'New Features' list. Ran through spell-checker.
-
- Revision 1.29  2002/03/02 20:34:07  david__schmidt
- Update OS/2 build section
-
- Revision 1.28  2002/02/24 14:34:24  jongfoster
- Formatting changes.  Now changing the doctype to DocBook XML 4.1
- will work - no other changes are needed.
-
- Revision 1.27  2002/01/11 14:14:32  hal9
- Added a very short section on Templates
-
- Revision 1.26  2002/01/09 20:02:50  hal9
- Fix bug re: auto-detect config file changes.
-
- Revision 1.25  2002/01/09 18:20:30  hal9
- Touch ups for *.action files.
-
- Revision 1.24  2001/12/02 01:13:42  hal9
- Fix typo.
-
- Revision 1.23  2001/12/02 00:20:41  hal9
- Updates for recent changes.
-
- Revision 1.22  2001/11/05 23:57:51  hal9
- Minor update for startup now daemon mode.
-
- Revision 1.21  2001/10/31 21:11:03  hal9
- Correct 2 minor errors
-
- Revision 1.18  2001/10/24 18:45:26  hal9
- *** empty log message ***
-
- Revision 1.17  2001/10/24 17:10:55  hal9
- Catching up with Jon's recent work, and a few other things.
-
- Revision 1.16  2001/10/21 17:19:21  swa
- wrong url in documentation
-
- Revision 1.15  2001/10/14 23:46:24  hal9
- Various minor changes. Fleshed out SEE ALSO section.
-
- Revision 1.13  2001/10/10 17:28:33  hal9
- Very minor changes.
-
- Revision 1.12  2001/09/28 02:57:04  hal9
- Ditto :/
-
- Revision 1.11  2001/09/28 02:25:20  hal9
- Ditto.
-
- Revision 1.9  2001/09/27 23:50:29  hal9
- A few changes. A short section on regular expression in appendix.
-
- Revision 1.8  2001/09/25 00:34:59  hal9
- Some additions, and re-arranging.
-
- Revision 1.7  2001/09/24 14:31:36  hal9
- Diddling.
-
- Revision 1.6  2001/09/24 14:10:32  hal9
- Including David's OS/2 installation instructions.
-
- Revision 1.2  2001/09/13 15:27:40  swa
- cosmetics
-
- Revision 1.1  2001/09/12 15:36:41  swa
- source files for junkbuster documentation
-
- Revision 1.3  2001/09/10 17:43:59  swa
- first proposal of a structure.
-
- Revision 1.2  2001/06/13 14:28:31  swa
- docs should have an author.
-
- Revision 1.1  2001/06/13 14:20:37  swa
- first import of project's documentation for the webserver.
-
- -->
-
-</article>
diff --git a/doc/text/developer-manual.txt b/doc/text/developer-manual.txt
deleted file mode 100644 (file)
index e0a8685..0000000
+++ /dev/null
@@ -1,1315 +0,0 @@
-
-Privoxy Developer Manual
-
-   By: Privoxy Developers
-   
-   $Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:41 hal9 Exp $
-   
-   The developer manual gives the users information on how to help the
-   developer team. It provides guidance on coding, testing, documentation
-   and other issues.
-   
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development. Other developers have since joined Stefan.
-   
-   You can find the latest version of the user manual at
-   [1]http://www.privoxy.org/developer-manual/. Please see the Contact
-   section in the user-manual if you want to contact the developers.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [2]Introduction
-   2. [3]Quickstart to Privoxy Development
-   3. [4]Documentation Guidelines
-   4. [5]Coding Guidelines
-          
-        4.1. [6]Introduction
-        4.2. [7]Using Comments
-                
-              4.2.1. [8]Comment, Comment, Comment
-              4.2.2. [9]Use blocks for comments
-              4.2.3. [10]Keep Comments on their own line
-              4.2.4. [11]Comment each logical step
-              4.2.5. [12]Comment All Functions Thoroughly
-              4.2.6. [13]Comment at the end of braces if the content is
-                      more than one screen length
-                      
-        4.3. [14]Naming Conventions
-                
-              4.3.1. [15]Variable Names
-              4.3.2. [16]Function Names
-              4.3.3. [17]Header file prototypes
-              4.3.4. [18]Enumerations, and #defines
-              4.3.5. [19]Constants
-                      
-        4.4. [20]Using Space
-                
-              4.4.1. [21]Put braces on a line by themselves.
-              4.4.2. [22]ALL control statements should have a block
-              4.4.3. [23]Do not belabor/blow-up boolean expressions
-              4.4.4. [24]Use white space freely because it is free
-              4.4.5. [25]Don't use white space around structure operators
-              4.4.6. [26]Make the last brace of a function stand out
-              4.4.7. [27]Use 3 character indentions
-                      
-        4.5. [28]Initializing
-                
-              4.5.1. [29]Initialize all variables
-                      
-        4.6. [30]Functions
-                
-              4.6.1. [31]Name functions that return a boolean as a
-                      question.
-                      
-              4.6.2. [32]Always specify a return type for a function.
-              4.6.3. [33]Minimize function calls when iterating by using
-                      variables
-                      
-              4.6.4. [34]Pass and Return by Const Reference
-              4.6.5. [35]Pass and Return by Value
-              4.6.6. [36]Names of include files
-              4.6.7. [37]Provide multiple inclusion protection
-              4.6.8. [38]Use `extern "C"` when appropriate
-              4.6.9. [39]Where Possible, Use Forward Struct Declaration
-                      Instead of Includes
-                      
-        4.7. [40]General Coding Practices
-                
-              4.7.1. [41]Turn on warnings
-              4.7.2. [42]Provide a default case for all switch statements
-              4.7.3. [43]Try to avoid falling through cases in a switch
-                      statement.
-                      
-              4.7.4. [44]Use 'long' or 'short' Instead of 'int'
-              4.7.5. [45]Don't mix size_t and other types
-              4.7.6. [46]Declare each variable and struct on its own
-                      line.
-                      
-              4.7.7. [47]Use malloc/zalloc sparingly
-              4.7.8. [48]The Programmer Who Uses 'malloc' is Responsible
-                      for Ensuring 'free'
-                      
-              4.7.9. [49]Add loaders to the `file_list' structure and in
-                      order
-                      
-              4.7.10. [50]"Uncertain" new code and/or changes to exitinst
-                      code, use FIXME
-                      
-        4.8. [51]Addendum: Template for files and function comment
-                blocks:
-                
-   5. [52]Version Control Guidelines
-   6. [53]Testing Guidelines
-          
-        6.1. [54]Testplan for releases
-        6.2. [55]Test reports
-                
-   7. [56]Contact the developers
-   8. [57]Copyright and History
-   9. [58]See also
-          
-1. Introduction
-
-   To be filled.
-     _________________________________________________________________
-   
-2. Quickstart to Privoxy Development
-
-   You'll need an account on Sourceforge to support our development. Mail
-   you ID to the list and wait until a project manager has added you. For
-   the time beeing (read, this section is under construction), please
-   note the following guidelines for changing stuff in the code. If it is
-   
-    1. A bugfix / clean-up / cosmetic thing: shoot
-    2. A new feature that can be turned off: shoot
-    3. A clear improvement w/o side effects on other parts of the code:
-       shoot
-    4. A matter of taste: ask the list
-    5. A major redesign of some part of the code: ask the list
-     _________________________________________________________________
-   
-3. Documentation Guidelines
-
-   All docs are in SGML format and located in the doc/source directory.
-   
-   How do you update the webserver (i.e. the pages on sourceforge)?
-   
-    1. Run make dok (which uses the documents in doc/source to update all
-       text files in doc/text and to update all web documents in
-       doc/webserver.
-    2. Run make webserver which copies all files from doc/webserver to
-       the sourceforge webserver via scp.
-     _________________________________________________________________
-   
-4. Coding Guidelines
-
-4.1. Introduction
-
-   This set of standards is designed to make our lives easier. It is
-   developed with the simple goal of helping us keep the "new and
-   improved Privoxy" consistent and reliable. Thus making maintenance
-   easier and increasing chances of success of the project.
-   
-   And that of course comes back to us as individuals. If we can increase
-   our development and product efficiencies then we can solve more of the
-   request for changes/improvements and in general feel good about
-   ourselves. ;->
-     _________________________________________________________________
-   
-4.2. Using Comments
-
-4.2.1. Comment, Comment, Comment
-
-   Explanation:
-   
-   Comment as much as possible without commenting the obvious. For
-   example do not comment "aVariable is equal to bVariable". Instead
-   explain why aVariable should be equal to the bVariable. Just because a
-   person can read code does not mean they will understand why or what is
-   being done. A reader may spend a lot more time figuring out what is
-   going on when a simple comment or explanation would have prevented the
-   extra research. Please help your brother IJB'ers out!
-   
-   The comments will also help justify the intent of the code. If the
-   comment describes something different than what the code is doing then
-   maybe a programming error is occurring.
-   
-   Example:
-/* if page size greater than 1k ... */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-/* if page size is small, send it in blocks */
-if ( PageLength() > 1024 )
-{
-    ... "block" the page up ...
-}
-
-This demonstrates 2 cases of "what not to do".  The first is a
-"syntax comment".  The second is a comment that does not fit what
-is actually being done.
-     _________________________________________________________________
-   
-4.2.2. Use blocks for comments
-
-   Explanation:
-   
-   Comments can help or they can clutter. They help when they are
-   differentiated from the code they describe. One line comments do not
-   offer effective separation between the comment and the code. Block
-   identifiers do, by surrounding the code with a clear, definable
-   pattern.
-   
-   Example:
-/*********************************************************************
- * This will stand out clearly in your code!
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-/* unfortunately, this may not */
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-
-if ( thisVariable == thatVariable ) /* this may not either */
-{
-   DoSomethingVeryImportant();
-}
-
-   Exception:
-   
-   If you are trying to add a small logic comment and do not wish to
-   "disrubt" the flow of the code, feel free to use a 1 line comment
-   which is NOT on the same line as the code.
-     _________________________________________________________________
-   
-4.2.3. Keep Comments on their own line
-
-   Explanation:
-   
-   It goes back to the question of readability. If the comment is on the
-   same line as the code it will be harder to read than the comment that
-   is on its own line.
-   
-   There are three exceptions to this rule, which should be violated
-   freely and often: during the definition of variables, at the end of
-   closing braces, when used to comment parameters.
-   
-   Example:
-/*********************************************************************
- * This will stand out clearly in your code,
- * But the second example won't.
- *********************************************************************/
-if ( thisVariable == thatVariable )
-{
-   DoSomethingVeryImportant();
-}
-
-if ( thisVariable == thatVariable ) /*can you see me?*/
-{
-   DoSomethingVeryImportant(); /*not easily*/
-}
-
-
-/*********************************************************************
- * But, the encouraged exceptions:
- *********************************************************************/
-int urls_read     = 0;     /* # of urls read + rejected */
-int urls_rejected = 0;     /* # of urls rejected */
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-}
-
-
-short DoSomethingVeryImportant(
-   short firstparam,   /* represents something */
-   short nextparam     /* represents something else */ )
-{
-   ...code here...
-
-}   /* -END- DoSomethingVeryImportant */
-     _________________________________________________________________
-   
-4.2.4. Comment each logical step
-
-   Explanation:
-   
-   Logical steps should be commented to help others follow the intent of
-   the written code and comments will make the code more readable.
-   
-   If you have 25 lines of code without a comment, you should probably go
-   back into it to see where you forgot to put one.
-   
-   Most "for", "while", "do", etc... loops _probably_ need a comment.
-   After all, these are usually major logic containers.
-     _________________________________________________________________
-   
-4.2.5. Comment All Functions Thoroughly
-
-   Explanation:
-   
-   A reader of the code should be able to look at the comments just prior
-   to the beginning of a function and discern the reason for its
-   existence and the consequences of using it. The reader should not have
-   to read through the code to determine if a given function is safe for
-   a desired use. The proper information thoroughly presented at the
-   introduction of a function not only saves time for subsequent
-   maintenance or debugging, it more importantly aids in code reuse by
-   allowing a user to determine the safety and applicability of any
-   function for the problem at hand. As a result of such benefits, all
-   functions should contain the information presented in the addendum
-   section of this document.
-     _________________________________________________________________
-   
-4.2.6. Comment at the end of braces if the content is more than one screen
-length
-
-   Explanation:
-   
-   Each closing brace should be followed on the same line by a comment
-   that describes the origination of the brace if the original brace is
-   off of the screen, or otherwise far away from the closing brace. This
-   will simplify the debugging, maintenance, and readability of the code.
-   
-   As a suggestion , use the following flags to make the comment and its
-   brace more readable:
-   
-   use following a closing brace: } /* -END- if() or while () or etc...
-   */
-   
-   Example:
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if x is 1 */
-
-or:
-
-if ( 1 == X )
-{
-   DoSomethingVeryImportant();
-   ...some long list of commands...
-} /* -END- if ( 1 == X ) */
-     _________________________________________________________________
-   
-4.3. Naming Conventions
-
-4.3.1. Variable Names
-
-   Explanation:
-   
-   Use all lowercase, and seperate words via an underscore ('_'). Do not
-   start an identifier with an underscore. (ANSI C reserves these for use
-   by the compiler and system headers.) Do not use identifiers which are
-   reserved in ANSI C++. (E.g. template, class, true, false, ...). This
-   is in case we ever decide to port Privoxy to C++.
-   
-   Example:
-int ms_iis5_hack = 0;
-
-   Instead of:
-   
-int msiis5hack = 0; int msIis5Hack = 0;
-     _________________________________________________________________
-   
-4.3.2. Function Names
-
-   Explanation:
-   
-   Use all lowercase, and seperate words via an underscore ('_'). Do not
-   start an identifier with an underscore. (ANSI C reserves these for use
-   by the compiler and system headers.) Do not use identifiers which are
-   reserved in ANSI C++. (E.g. template, class, true, false, ...). This
-   is in case we ever decide to port Privoxy to C++.
-   
-   Example:
-int load_some_file( struct client_state *csp )
-
-   Instead of:
-   
-int loadsomefile( struct client_state *csp )
-int loadSomeFile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.3.3. Header file prototypes
-
-   Explanation:
-   
-   Use a descriptive parameter name in the function prototype in header
-   files. Use the same parameter name in the header file that you use in
-   the c file.
-   
-   Example:
-(.h) extern int load_aclfile( struct client_state *csp );
-(.c) int load_aclfile( struct client_state *csp )
-
-   Instead of:
-(.h) extern int load_aclfile( struct client_state * ); or
-(.h) extern int load_aclfile();
-(.c) int load_aclfile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.3.4. Enumerations, and #defines
-
-   Explanation:
-   
-   Use all capital letters, with underscores between words. Do not start
-   an identifier with an underscore. (ANSI C reserves these for use by
-   the compiler and system headers.)
-   
-   Example:
-(enumeration) : enum Boolean { FALSE, TRUE };
-(#define) : #define DEFAULT_SIZE 100;
-
-   Note: We have a standard naming scheme for #defines that toggle a
-   feature in the preprocessor: FEATURE_>, where > is a short (preferably
-   1 or 2 word) description.
-   
-   Example:
-#define FEATURE_FORCE 1
-
-#ifdef FEATURE_FORCE
-#define FORCE_PREFIX blah
-#endif /* def FEATURE_FORCE */
-     _________________________________________________________________
-   
-4.3.5. Constants
-
-   Explanation:
-   
-   Spell common words out entirely (do not remove vowels).
-   
-   Use only widely-known domain acronyms and abbreviations. Capitalize
-   all letters of an acronym.
-   
-   Use underscore (_) to separate adjacent acronyms and abbreviations.
-   Never terminate a name with an underscore.
-   
-   Example:
-#define USE_IMAGE_LIST 1
-
-   Instead of:
-   
-#define USE_IMG_LST 1 or
-#define _USE_IMAGE_LIST 1 or
-#define USE_IMAGE_LIST_ 1 or
-#define use_image_list 1 or
-#define UseImageList 1
-     _________________________________________________________________
-   
-4.4. Using Space
-
-4.4.1. Put braces on a line by themselves.
-
-   Explanation:
-   
-   The brace needs to be on a line all by itself, not at the end of the
-   statement. Curly braces should line up with the construct that they're
-   associated with. This practice makes it easier to identify the opening
-   and closing braces for a block.
-   
-   Example:
-if ( this == that )
-{
-   ...
-}
-
-   Instead of:
-   
-   if ( this == that ) { ... }
-   
-   or
-   
-   if ( this == that ) { ... }
-   
-   Note: In the special case that the if-statement is inside a loop, and
-   it is trivial, i.e. it tests for a condidtion that is obvious from the
-   purpose of the block, one-liners as above may optically preserve the
-   loop structure and make it easier to read.
-   
-   Status: developer-discrection.
-   
-   Example exception:
-while ( more lines are read )
-{
-   /* Please document what is/is not a comment line here */
-   if ( it's a comment ) continue;
-
-   do_something( line );
-}
-     _________________________________________________________________
-   
-4.4.2. ALL control statements should have a block
-
-   Explanation:
-   
-   Using braces to make a block will make your code more readable and
-   less prone to error. All control statements should have a block
-   defined.
-   
-   Example:
-if ( this == that )
-{
-   DoSomething();
-   DoSomethingElse();
-}
-
-   Instead of:
-   
-   if ( this == that ) DoSomething(); DoSomethingElse();
-   
-   or
-   
-   if ( this == that ) DoSomething();
-   
-   Note: The first example in "Instead of" will execute in a manner other
-   than that which the developer desired (per indentation). Using code
-   braces would have prevented this "feature". The "explanation" and
-   "exception" from the point above also applies.
-     _________________________________________________________________
-   
-4.4.3. Do not belabor/blow-up boolean expressions
-
-   Example:
-structure->flag = ( condition );
-
-   Instead of:
-   
-   if ( condition ) { structure->flag = 1; } else { structure->flag = 0;
-   }
-   
-   Note: The former is readable and consice. The later is wordy and
-   inefficient. Please assume that any developer new to the project has
-   at least a "good" knowledge of C/C++. (Hope I do not offend by that
-   last comment ... 8-)
-     _________________________________________________________________
-   
-4.4.4. Use white space freely because it is free
-
-   Explanation:
-   
-   Make it readable. The notable exception to using white space freely is
-   listed in the next guideline.
-   
-   Example:
-int firstValue   = 0;
-int someValue    = 0;
-int anotherValue = 0;
-int thisVariable = 0;
-
-if ( thisVariable == thatVariable )
-
-firstValue = oldValue + ( ( someValue - anotherValue ) - whatever )
-     _________________________________________________________________
-   
-4.4.5. Don't use white space around structure operators
-
-   Explanation:
-   
-   - structure pointer operator ( "->" ) - member operator ( "." ) -
-   functions and parentheses
-   
-   It is a general coding practice to put pointers, references, and
-   function parentheses next to names. With spaces, the connection
-   between the object and variable/function name is not as clear.
-   
-   Example:
-aStruct->aMember;
-aStruct.aMember;
-FunctionName();
-
-   Instead of: aStruct -> aMember; aStruct . aMember; FunctionName ();
-     _________________________________________________________________
-   
-4.4.6. Make the last brace of a function stand out
-
-   Example:
-int function1( ... )
-{
-   ...code...
-   return( retCode );
-
-}   /* -END- function1 */
-
-
-int function2( ... )
-{
-}   /* -END- function2 */
-
-   Instead of:
-   
-   int function1( ... ) { ...code... return( retCode ); } int function2(
-   ... ) { }
-   
-   Note: Use 1 blank line before the closing brace and 2 lines
-   afterwards. This makes the end of function standout to the most casual
-   viewer. Although function comments help seperate functions, this is
-   still a good coding practice. In fact, I follow these rules when using
-   blocks in "for", "while", "do" loops, and long if {} statements too.
-   After all whitespace is free!
-   
-   Status: developer-discrection on the number of blank lines. Enforced
-   is the end of function comments.
-     _________________________________________________________________
-   
-4.4.7. Use 3 character indentions
-
-   Explanation:
-   
-   If some use 8 character TABs and some use 3 character TABs, the code
-   can look *very* ragged. So use 3 character indentions only. If you
-   like to use TABs, pass your code through a filter such as "expand -t3"
-   before checking in your code.
-   
-   Example:
-static const char * const url_code_map[256] =
-{
-   NULL, ...
-};
-
-
-int function1( ... )
-{
-   if ( 1 )
-   {
-      return( ALWAYS_TRUE );
-   }
-   else
-   {
-      return( HOW_DID_YOU_GET_HERE );
-   }
-
-   return( NEVER_GETS_HERE );
-
-}
-     _________________________________________________________________
-   
-4.5. Initializing
-
-4.5.1. Initialize all variables
-
-   Explanation:
-   
-   Do not assume that the variables declared will not be used until after
-   they have been assigned a value somewhere else in the code. Remove the
-   chance of accidentally using an unassigned variable.
-   
-   Example:
-short anShort = 0;
-float aFloat  = 0;
-struct *ptr = NULL;
-
-   Note: It is much easier to debug a SIGSEGV if the message says you are
-   trying to access memory address 00000000 and not 129FA012; or
-   arrayPtr[20] causes a SIGSEV vs. arrayPtr[0].
-   
-   Status: developer-discrection if and only if the variable is assigned
-   a value "shortly after" declaration.
-     _________________________________________________________________
-   
-4.6. Functions
-
-4.6.1. Name functions that return a boolean as a question.
-
-   Explanation:
-   
-   Value should be phrased as a question that would logically be answered
-   as a true or false statement
-   
-   Example:
-ShouldWeBlockThis();
-ContainsAnImage();
-IsWebPageBlank();
-     _________________________________________________________________
-   
-4.6.2. Always specify a return type for a function.
-
-   Explanation:
-   
-   The default return for a function is an int. To avoid ambiguity,
-   create a return for a function when the return has a purpose, and
-   create a void return type if the function does not need to return
-   anything.
-     _________________________________________________________________
-   
-4.6.3. Minimize function calls when iterating by using variables
-
-   Explanation:
-   
-   It is easy to write the following code, and a clear argument can be
-   made that the code is easy to understand:
-   
-   Example:
-for ( size_t cnt = 0; cnt < blockListLength(); cnt ++ )
-{
-   ....
-}
-
-   Note: Unfortunately, this makes a function call for each and every
-   iteration. This increases the overhead in the program, because the
-   compiler has to look up the function each time, call it, and return a
-   value. Depending on what occurs in the blockListLength() call, it
-   might even be creating and destroying structures with each iteration,
-   even though in each case it is comparing "cnt" to the same value, over
-   and over. Remember too - even a call to blockListLength() is a
-   function call, with the same overhead.
-   
-   Instead of using a function call during the iterations, assign the
-   value to a variable, and evaluate using the variable.
-   
-   Example:
-size_t len = blockListLength();
-
-for ( size_t cnt = 0; cnt < len; cnt ++ )
-{
-   ....
-}
-
-   Exceptions: if the value of blockListLength() *may* change or could
-   *potentially* change, then you must code the function call in the
-   for/while loop.
-     _________________________________________________________________
-   
-4.6.4. Pass and Return by Const Reference
-
-   Explanation:
-   
-   This allows a developer to define a const pointer and call your
-   function. If your function does not have the const keyword, we may not
-   be able to use your function. Consider strcmp, if it were defined as:
-   extern int strcmp( char *s1, char *s2 );
-   
-   I could then not use it to compare argv's in main: int main( int argc,
-   const char *argv[] ) { strcmp( argv[0], "privoxy" ); }
-   
-   Both these pointers are *const*! If the c runtime library maintainers
-   do it, we should too.
-     _________________________________________________________________
-   
-4.6.5. Pass and Return by Value
-
-   Explanation:
-   
-   Most structures cannot fit onto a normal stack entry (i.e. they are
-   not 4 bytes or less). Aka, a function declaration like: int
-   load_aclfile( struct client_state csp )
-   
-   would not work. So, to be consistent, we should declare all prototypes
-   with "pass by value": int load_aclfile( struct client_state *csp )
-     _________________________________________________________________
-   
-4.6.6. Names of include files
-
-   Explanation:
-   
-   Your include statements should contain the file name without a path.
-   The path should be listed in the Makefile, using -I as processor
-   directive to search the indicated paths. An exception to this would be
-   for some proprietary software that utilizes a partial path to
-   distinguish their header files from system or other header files.
-   
-   Example:
-#include <iostream.h>     /* This is not a local include */
-#include "config.h"       /* This IS a local include */
-
-   Exception:
-   
-/* This is not a local include, but requires a path element. */
-#include <sys/fileName.h>
-
-   Note: Please! do not add "-I." to the Makefile without a _very_ good
-   reason. This duplicates the #include "file.h" behaviour.
-     _________________________________________________________________
-   
-4.6.7. Provide multiple inclusion protection
-
-   Explanation:
-   
-   Prevents compiler and linker errors resulting from redefinition of
-   items.
-   
-   Wrap each header file with the following syntax to prevent multiple
-   inclusions of the file. Of course, replace PROJECT_H with your file
-   name, with "." Changed to "_", and make it uppercase.
-   
-   Example:
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
- ...
-#endif /* ndef PROJECT_H_INCLUDED */
-     _________________________________________________________________
-   
-4.6.8. Use `extern "C"` when appropriate
-
-   Explanation:
-   
-   If our headers are included from C++, they must declare our functions
-   as `extern "C"`. This has no cost in C, but increases the potential
-   re-usability of our code.
-   
-   Example:
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* def __cplusplus */
-
-... function definitions here ...
-
-#ifdef __cplusplus
-}
-#endif /* def __cplusplus */
-     _________________________________________________________________
-   
-4.6.9. Where Possible, Use Forward Struct Declaration Instead of Includes
-
-   Explanation:
-   
-   Useful in headers that include pointers to other struct's.
-   Modifications to excess header files may cause needless compiles.
-   
-   Example:
-/*********************************************************************
- * We're avoiding an include statement here!
- *********************************************************************/
-struct file_list;
-extern file_list *xyz;
-
-   Note: If you declare "file_list xyz;" (without the pointer), then
-   including the proper header file is necessary. If you only want to
-   prototype a pointer, however, the header file is unneccessary.
-   
-   Status: Use with discrection.
-     _________________________________________________________________
-   
-4.7. General Coding Practices
-
-4.7.1. Turn on warnings
-
-   Explanation
-   
-   Compiler warnings are meant to help you find bugs. You should turn on
-   as many as possible. With GCC, the switch is "-Wall". Try and fix as
-   many warnings as possible.
-     _________________________________________________________________
-   
-4.7.2. Provide a default case for all switch statements
-
-   Explanation:
-   
-   What you think is guaranteed is never really guaranteed. The value
-   that you don't think you need to check is the one that someday will be
-   passed. So, to protect yourself from the unknown, always have a
-   default step in a switch statement.
-   
-   Example:
-switch( hash_string( cmd ) )
-{
-   case hash_actions_file :
-      ... code ...
-      break;
-
-   case hash_confdir :
-      ... code ...
-      break;
-
-   default :
-      log_error( ... );
-      ... anomly code goes here ...
-      continue; / break; / exit( 1 ); / etc ...
-
-} /* end switch( hash_string( cmd ) ) */
-
-   Note: If you already have a default condition, you are obviously
-   exempt from this point. Of note, most of the WIN32 code calls
-   `DefWindowProc' after the switch statement. This API call *should* be
-   included in a default statement.
-   
-   Another Note: This is not so much a readability issue as a robust
-   programming issue. The "anomly code goes here" may be no more than a
-   print to the STDERR stream (as in load_config). Or it may really be an
-   ABEND condition.
-   
-   Status: Programmer discretion is advised.
-     _________________________________________________________________
-   
-4.7.3. Try to avoid falling through cases in a switch statement.
-
-   Explanation:
-   
-   In general, you will want to have a 'break' statement within each
-   'case' of a switch statement. This allows for the code to be more
-   readable and understandable, and furthermore can prevent unwanted
-   surprises if someone else later gets creative and moves the code
-   around.
-   
-   The language allows you to plan the fall through from one case
-   statement to another simply by omitting the break statement within the
-   case statement. This feature does have benefits, but should only be
-   used in rare cases. In general, use a break statement for each case
-   statement.
-   
-   If you choose to allow fall through, you should comment both the fact
-   of the fall through and reason why you felt it was necessary.
-     _________________________________________________________________
-   
-4.7.4. Use 'long' or 'short' Instead of 'int'
-
-   Explanation:
-   
-   On 32-bit platforms, int usually has the range of long. On 16-bit
-   platforms, int has the range of short.
-   
-   Status: open-to-debate. In the case of most FSF projects (including
-   X/GNU-Emacs), there are typedefs to int4, int8, int16, (or equivalence
-   ... I forget the exact typedefs now). Should we add these to IJB now
-   that we have a "configure" script?
-     _________________________________________________________________
-   
-4.7.5. Don't mix size_t and other types
-
-   Explanation:
-   
-   The type of size_t varies across platforms. Do not make assumptions
-   about whether it is signed or unsigned, or about how long it is. Do
-   not compare a size_t against another variable of a different type (or
-   even against a constant) without casting one of the values. Try to
-   avoid using size_t if you can.
-     _________________________________________________________________
-   
-4.7.6. Declare each variable and struct on its own line.
-
-   Explanation:
-   
-   It can be tempting to declare a series of variables all on one line.
-   Don't.
-   
-   Example:
-long a = 0;
-long b = 0;
-long c = 0;
-
-   Instead of:
-   
-   long a, b, c;
-   
-   Explanation: - there is more room for comments on the individual
-   variables - easier to add new variables without messing up the
-   original ones - when searching on a variable to find its type, there
-   is less clutter to "visually" eliminate
-   
-   Exceptions: when you want to declare a bunch of loop variables or
-   other trivial variables; feel free to declare them on 1 line. You
-   should, although, provide a good comment on their functions.
-   
-   Status: developer-discrection.
-     _________________________________________________________________
-   
-4.7.7. Use malloc/zalloc sparingly
-
-   Explanation:
-   
-   Create a local stuct (on the stack) if the variable will live and die
-   within the context of one function call.
-   
-   Only "malloc" a struct (on the heap) if the variable's life will
-   extend beyond the context of one function call.
-   
-   Example:
-If a function creates a struct and stores a pointer to it in a
-list, then it should definately be allocated via `malloc'.
-     _________________________________________________________________
-   
-4.7.8. The Programmer Who Uses 'malloc' is Responsible for Ensuring 'free'
-
-   Explanation:
-   
-   If you have to "malloc" an instance, you are responsible for insuring
-   that the instance is `free'd, even if the deallocation event falls
-   within some other programmer's code. You are also responsible for
-   ensuring that deletion is timely (i.e. not too soon, not too late).
-   This is known as "low-coupling" and is a "good thing (tm)". You may
-   need to offer a free/unload/destuctor type function to accomodate
-   this.
-   
-   Example:
-int load_re_filterfile( struct client_state *csp ) { ... }
-static void unload_re_filterfile( void *f ) { ... }
-
-   Exceptions:
-   
-   The developer cannot be expected to provide `free'ing functions for C
-   run-time library functions ... such as `strdup'.
-   
-   Status: developer-discrection. The "main" use of this standard is for
-   allocating and freeing data structures (complex or nested).
-     _________________________________________________________________
-   
-4.7.9. Add loaders to the `file_list' structure and in order
-
-   Explanation:
-   
-   I have ordered all of the "blocker" file code to be in alpha order. It
-   is easier to add/read new blockers when you expect a certain order.
-   
-   Note: It may appear that the alpha order is broken in places by POPUP
-   tests coming before PCRS tests. But since POPUPs can also be referred
-   to as KILLPOPUPs, it is clear that it should come first.
-     _________________________________________________________________
-   
-4.7.10. "Uncertain" new code and/or changes to exitinst code, use FIXME
-
-   Explanation:
-   
-   If you have enough confidence in new code or confidence in your
-   changes, but are not *quite* sure of the reprocussions, add this:
-   
-   /* FIXME: this code has a logic error on platform XYZ, * attempthing
-   to fix */ #ifdef PLATFORM ...changed code here... #endif
-   
-   or:
-   
-   /* FIXME: I think the original author really meant this... */
-   ...changed code here...
-   
-   or:
-   
-   /* FIXME: new code that *may* break something else... */ ...new code
-   here...
-   
-   Note: If you make it clear that this may or may not be a "good thing
-   (tm)", it will be easier to identify and include in the project (or
-   conversly exclude from the project).
-     _________________________________________________________________
-   
-4.8. Addendum: Template for files and function comment blocks:
-
-   Example for file comments:
-const char FILENAME_rcs[] = "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16
-:41 hal9 Exp $";
-/*********************************************************************
- *
- * File        :  $Source$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log$
- *
- *********************************************************************/
-
-
-#include "config.h"
-
-   ...necessary include files for us to do our work...
-
-const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
-
-   Note: This declares the rcs variables that should be added to the
-   "show-proxy-args" page. If this is a brand new creation by you, you
-   are free to change the "Copyright" section to represent the rights you
-   wish to maintain.
-   
-   Note: The formfeed character that is present right after the comment
-   flower box is handy for (X|GNU)Emacs users to skip the verbige and get
-   to the heart of the code (via `forward-page' and `backward-page').
-   Please include it if you can.
-   
-   Example for file header comments:
-#ifndef _FILENAME_H
-#define _FILENAME_H
-#define FILENAME_H_VERSION "$Id: developer-manual.sgml,v 1.13 2002/03/27 01:16:
-41 hal9 Exp $"
-/*********************************************************************
- *
- * File        :  $Source$
- *
- * Purpose     :  (Fill me in with a good description!)
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log$
- *
- *********************************************************************/
-
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-   ... function headers here ...
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char FILENAME_rcs[];
-extern const char FILENAME_h_rcs[];
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef _FILENAME_H */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
-
-   Example for function comments:
-/*********************************************************************
- *
- * Function    :  FUNCTION_NAME
- *
- * Description :  (Fill me in with a good description!)
- *
- * parameters  :
- *          1  :  param1 = pointer to an important thing
- *          2  :  x      = pointer to something else
- *
- * Returns     :  0 => Ok, everything else is an error.
- *
- *********************************************************************/
-int FUNCTION_NAME( void *param1, const char *x )
-{
-   ...
-   return( 0 );
-
-}
-
-   Note: If we all follow this practice, we should be able to parse our
-   code to create a "self-documenting" web page.
-     _________________________________________________________________
-   
-5. Version Control Guidelines
-
-   To be filled. note on cvs comments. don't comment what you did,
-   comment why you did it.
-     _________________________________________________________________
-   
-6. Testing Guidelines
-
-   To be filled.
-     _________________________________________________________________
-   
-6.1. Testplan for releases
-
-   Explain release numbers. major, minor. developer releases. etc.
-   
-    1. Remove any existing rpm with rpm -e
-    2. Remove any file that was left over. This includes (but is not
-       limited to)
-          + /var/log/privoxy
-          + /etc/privoxy
-          + /usr/sbin/privoxy
-          + /etc/init.d/privoxy
-          + /usr/doc/privoxy*
-    3. Install the rpm. Any error messages?
-    4. start,stop,status Privoxy with the specific script (e.g.
-       /etc/rc.d/init/privoxy stop). Reboot your machine. Does autostart
-       work?
-    5. Start browsing. Does Privoxy work? Logfile written?
-    6. Remove the rpm. Any error messages? All files removed?
-     _________________________________________________________________
-   
-6.2. Test reports
-
-   Please submit test reports only with the [59]test form at sourceforge.
-   Three simple steps:
-   
-     * Select category: the distribution you test on.
-     * Select group: the version of Privoxy that we are about to release.
-     * Fill the Summary and Detailed Description with something
-       intelligent (keep it short and precise).
-       
-   Do not mail to the mailinglist (we cannot keep track on issues there).
-     _________________________________________________________________
-   
-7. Contact the developers
-
-   Please see the user manual for information on how to contact the
-   developers.
-     _________________________________________________________________
-   
-8. Copyright and History
-
-   Please see the user manual for information on Copyright and History.
-     _________________________________________________________________
-   
-9. See also
-
-   Please see the user manual for information on references.
-
-References
-
-   1. http://www.privoxy.org/developer-manual/
-   2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DOCUMENTATION
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CODING
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S1
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S2
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S3
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S4
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S5
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S6
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S7
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S8
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S9
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S10
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S11
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S12
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S13
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S14
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S15
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S16
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S17
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S18
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S19
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S20
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S21
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S22
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S23
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S24
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S25
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S26
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S27
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S28
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S29
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S30
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S31
-  37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S32
-  38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S33
-  39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S34
-  40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S35
-  41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S36
-  42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S37
-  43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S38
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S39
-  45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S40
-  46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S41
-  47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S42
-  48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S43
-  49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S44
-  50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S45
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#S46
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CVS
-  53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING
-  54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-PLAN
-  55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TESTING-REPORT
-  56. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT
-  57. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  58. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  59. http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005
diff --git a/doc/text/faq.txt b/doc/text/faq.txt
deleted file mode 100644 (file)
index 2e9bfbb..0000000
+++ /dev/null
@@ -1,881 +0,0 @@
-
-Privoxy Frequently Asked Questions
-
-   By: Privoxy Developers
-   
-   $Id: faq.sgml,v 1.32 2002/03/27 00:57:03 hal9 Exp $
-   
-   This FAQ gives users and developers alike answers to frequently asked
-   questions about Privoxy.
-   
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development.
-   
-   You can find the latest version of the document at
-   [1]http://www.privoxy.org/faq/. Please see the Contact section in the
-   [2]user-manual if you want to contact the developers.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [3]Frequently Asked Questions
-          
-        1.1. [4]General Information
-                
-              1.1.1. [5]What is this new version of Privoxy?
-              1.1.2. [6]Why "Privoxy"? Why a name change at all?
-              1.1.3. [7]How does it differ from the old Junkbuster?
-              1.1.4. [8]What are some of the new features?
-              1.1.5. [9]What is a "proxy"? How does Privoxy work?
-              1.1.6. [10]My browser does the same things as Privoxy. Why
-                      should I use Privoxy at all?
-                      
-              1.1.7. [11]Is there is a license or fee? What about a
-                      warranty? Registration?
-                      
-              1.1.8. [12]I would like to help you, what do I do?
-                      
-        1.2. [13]Installation
-                
-              1.2.1. [14]Which browsers are supported by Privoxy?
-              1.2.2. [15]Which operating systems are supported?
-              1.2.3. [16]Can I install Privoxy over Junkbuster?
-              1.2.4. [17]I just installed Privoxy. Is there anything
-                      special I have to do now?
-                      
-              1.2.5. [18]What is the proxy address of Privoxy?
-              1.2.6. [19]I just installed Privoxy, and nothing is
-                      happening. All the ads are there. What's wrong?
-                      
-        1.3. [20]Configuration
-                
-              1.3.1. [21]Can I use my old config files?
-              1.3.2. [22]What is an "actions" file?
-              1.3.3. [23]The "actions"concept confuses me. Please list
-                      some of these "actions".
-                      
-              1.3.4. [24]How are actions files configured? What is the
-                      easiest way to do this?
-                      
-              1.3.5. [25]What are the differences between
-                      intermediate.action, basic.action, etc.?
-                      
-              1.3.6. [26]Why can I change the configuration with a
-                      browser? Does that not raise security issues?
-                      
-              1.3.7. [27]What is a "default.filter"?
-              1.3.8. [28]How can I set up Privoxy to act as a proxy for
-                      my LAN?
-                      
-              1.3.9. [29]Instead of ads, now I get a checkerboard
-                      pattern. I don't want to see anything.
-                      
-              1.3.10. [30]Why would anybody want to see a checkerboard
-                      pattern?
-                      
-              1.3.11. [31]I see large red banners on some pages that say
-                      "Blocked". How do I get rid of this?
-                      
-              1.3.12. [32]How can I make Privoxy work with other proxies
-                      like Squid?
-                      
-        1.4. [33]Miscellaneous
-                
-              1.4.1. [34]How much does Privoxy slow my browsing down?
-                      This has to add extra time to browsing.
-                      
-              1.4.2. [35]I noticed considerable delays in page requests
-                      compared to the old Junkbuster. What's wrong?
-                      
-              1.4.3. [36]What is the "http://p.p/"?
-              1.4.4. [37]Do you still maintain the blocklists?
-              1.4.5. [38]How can I submit new ads?
-              1.4.6. [39]How can I hide my IP address?
-              1.4.7. [40]Can Privoxy guarantee I am anonymous?
-              1.4.8. [41]Might some things break because header
-                      information is being altered?
-                      
-              1.4.9. [42]Can Privoxy act as a "caching" proxy to speed up
-                      web browsing?
-                      
-              1.4.10. [43]What about as a firewall? Can Privoxy protect
-                      me?
-                      
-              1.4.11. [44]The Privoxy logo that replaces ads is very
-                      blocky and ugly looking. Can't a better font be
-                      used?
-                      
-              1.4.12. [45]I have large empty spaces now where ads used to
-                      be. Why does Privoxy leave these large gaps?
-                      
-              1.4.13. [46]How can Privoxy filter Secure (HTTPS) URLs?
-              1.4.14. [47]Privoxy runs as a "server". How secure is it?
-                      Do I need to take any special precautions?
-                      
-              1.4.15. [48]How can I temporarily disable Privoxy?
-                      
-        1.5. [49]Troubleshooting
-                
-              1.5.1. [50]I just upgraded and am getting "connection
-                      refused" with every web page?
-                      
-              1.5.2. [51]I just added a new rule, but the steenkin ad is
-                      still getting through. How?
-                      
-              1.5.3. [52]One of my favorite sites does not work with
-                      Privoxy. What can I do?
-                      
-              1.5.4. [53]What time is it?
-                      
-   2. [54]Copyright and History
-   3. [55]See also
-          
-1. Frequently Asked Questions
-
-1.1. General Information
-
-1.1.1. What is this new version of Privoxy?
-
-   The original Internet Junkbuster (tm) is a copyrighted product of
-   [56]Junkbusters Corporation. Development of this effort stopped some
-   time ago as of version 2.0.2. Stefan Waldherr started the ijbswa
-   project on [57]Sourceforge to rekindle development. Other developers
-   subsequently joined with Stefan, and have since added many new
-   features, refinements and enhancements.
-   
-   The new Privoxy started with the same Junkbuster code base, but has
-   changed significantly at this point.
-     _________________________________________________________________
-   
-1.1.2. Why "Privoxy"? Why a name change at all?
-
-   Privoxy is for "Privacy Enhancing Proxy". There are possible legal
-   complications from the continued use of the Junkbuster name, which is
-   a trademark of [58]Junkbusters Corporation. (There are no objections
-   from Junkbusters Corporation to the Privoxy project itself though, and
-   they in fact still share our ideals and goals.)
-   
-   The developers also believed that there so many changes from the
-   original code, that it was time to make a clean break from the past
-   and make a name in their own right, especially now with the pending
-   release of version 3.0.
-     _________________________________________________________________
-   
-1.1.3. How does it differ from the old Junkbuster?
-
-   All the old features remain. The new Privoxy still blocks ads and
-   banners, still manages cookies, and still helps protect your privacy.
-   But, these are all enhanced, and many new features have been added,
-   all in the same vein.
-   
-   The configuration has changed significantly as well. This is something
-   that users will notice right off the bat. The "blocklist" file does
-   not exist any more. This is replaced by "actions" files, such as
-   default.actions. This is where most of the per site configuration is
-   now.
-     _________________________________________________________________
-   
-1.1.4. What are some of the new features?
-
-     * Integrated browser based configuration and control utility
-       ([59]http://p.p). Browser-based tracing of rule and filter
-       effects.
-     * Blocking of annoying pop-up browser windows.
-     * HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-     * Support for Perl Compatible Regular Expressions in the
-       configuration files, and generally a more sophisticated and
-       flexible configuration syntax over previous versions.
-     * GIF de-animation.
-     * Web page content filtering (removes banners based on size,
-       invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.)
-     * Bypass many click-tracking scripts (avoids script redirection).
-     * Multi-threaded (POSIX and native threads).
-     * Auto-detection and re-reading of config file changes.
-     * User-customizable HTML templates (e.g. 404 error page).
-     * Improved cookie management features (e.g. session based cookies).
-     * Builds from source on most UNIX-like systems. Packages available
-       for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac
-       OSX, OS/2, HP-UX 11 and AmigaOS.
-     * In addition, the configuration is much more powerful and versatile
-       over-all.
-     _________________________________________________________________
-   
-1.1.5. What is a "proxy"? How does Privoxy work?
-
-   When you connect to a web site with Privoxy, you are really connecting
-   to your locally running version of Privoxy. Privoxy intercepts your
-   requests for the web page, and relays that to the "real" web site. The
-   web site sends the HTTP data stream back to Privoxy, where Privoxy can
-   work its magic before it relays this data back to your web browser.
-   
-   Since Privoxy sits between you and the WWW, it is in a position to
-   intercept and completely manage all web traffic and HTTP content
-   before it gets to your browser. Privoxy uses various programming
-   methods to do this, all of which is under your control via the various
-   configuration files and options.
-   
-   There are many kinds of proxies. Privoxy best fits the "filtering
-   proxy" category.
-     _________________________________________________________________
-   
-1.1.6. My browser does the same things as Privoxy. Why should I use Privoxy
-at all?
-
-   Modern browsers do indeed have some of the same functionality as
-   Privoxy. Maybe this is adequate for you. But Privoxy is much more
-   versatile and powerful, and can do a number of things that browsers
-   just can't.
-   
-   In addition, a proxy is good choice if you use multiple browsers, or
-   have a LAN with multiple computers. This way all the configuration is
-   in one place, and you don't have to maintain a similar configuration
-   for possibly many browsers.
-     _________________________________________________________________
-   
-1.1.7. Is there is a license or fee? What about a warranty? Registration?
-
-   Privoxy is licensed under the GNU General Public License (GPL). It is
-   free to use, copy, modify or distribute as you wish under the terms of
-   this license. See [60]http://www.gnu.org/copyleft/gpl.html for
-   specifics.
-   
-   There is no warranty of any kind, expressed, implied or otherwise.
-   That is something that would cost real money ;-) There is no
-   registration either. Privoxy really is free in every respect!
-     _________________________________________________________________
-   
-1.1.8. I would like to help you, what do I do?
-
-1.1.8.1. Money Money Money
-
-   We, of course, welcome donations and use the money for domain
-   registering, regular world-wide get-togethers (hahaha). Anyway, we'll
-   soon describe the process how to donate money to the team.
-     _________________________________________________________________
-   
-1.1.8.2. You want to work with us?
-
-   Well, helping the team is always a good idea. We welcome new
-   developers, RPM gurus or documentation makers. Simply get an account
-   on sourceforge.net and mail your id to the developer mailing list.
-   Then read the section Quickstart in the developers manual.
-   
-   Once we have added you to the team, you'll have write access to the
-   CVS repository, and together we'll find a suitable task for you.
-     _________________________________________________________________
-   
-1.2. Installation
-
-1.2.1. Which browsers are supported by Privoxy?
-
-   Any browser that can be configured to use a "proxy", which is probably
-   almost all browsers. Direct browser support is not necessary since
-   Privoxy runs as a separate application and just exchanges standard
-   HTML data with your browser.
-     _________________________________________________________________
-   
-1.2.2. Which operating systems are supported?
-
-   Right now Win32, Mac OSX, OS/2, AmigaOS, Linux, and many flavors of
-   Unix.
-   
-   Source code is available, so porting to other operating systems, is
-   always a possibility.
-     _________________________________________________________________
-   
-1.2.3. Can I install Privoxy over Junkbuster?
-
-   We recommend you uninstall Junkbuster first to minimize conflicts and
-   confusion. You may want to save your old configuration files for
-   future reference. The configuration is substantially changed.
-   
-   See the [61]user-manual for platform specific installation
-   instructions. [FIXME: This is meant for after the name change for
-   3.0!]
-     _________________________________________________________________
-   
-1.2.4. I just installed Privoxy. Is there anything special I have to do now?
-
-   All browsers must be told to use Privoxy as a proxy by specifying the
-   correct proxy address and port number in the appropriate configuration
-   area for the browser. See below.
-     _________________________________________________________________
-   
-1.2.5. What is the proxy address of Privoxy?
-
-   If you set up the Privoxy to run on the computer you browse from
-   (rather than your ISP's server or some networked computer on a LAN),
-   the proxy will be on "localhost" (which is the special name used by
-   every computer on the Internet to refer to itself) and the port will
-   be 8118 (unless you have Privoxy to run on a different port with the
-   listen-address config option).
-   
-   When configuring your browser's proxy settings you typically enter the
-   word "localhost" in the boxes next to "HTTP" and "Secure" (HTTPS) and
-   then the number "8118" for "port". This tells your browser to send all
-   web requests to Privoxy instead of directly to the Internet.
-   
-   Privoxy can also be used to proxy for a Local Area Network. In this
-   case, your would enter either the IP address of the LAN host where
-   Privoxy is running, or the equivalent hostname. Port assignment would
-   be same as above.
-   
-   Privoxy does not currently handle protocols such as FTP, SMTP, IM,
-   IRC, ICQ, or other Internet protocols.
-     _________________________________________________________________
-   
-1.2.6. I just installed Privoxy, and nothing is happening. All the ads are
-there. What's wrong?
-
-   Did you configure your browser to use Privoxy as a proxy? It does not
-   sound like it. See above. You might also try flushing the browser's
-   caches to force a full re-reading of pages. You can verify that
-   Privoxy is running, and your browser is correctly configured by
-   entering the special URL: [62]http://p.p/. This should give you a
-   banner that says "This is Privoxy" and access to Privoxy's internal
-   configuration. If you see this, then you are good to go. If not, the
-   browser or Privoxy are not set up correctly.
-     _________________________________________________________________
-   
-1.3. Configuration
-
-1.3.1. Can I use my old config files?
-
-   There are major changes to Junkbuster configuration from version 2.0.x
-   to 2.9.x and later. The older files will not work at all. If this is
-   the case, you will need to re-enter your old data into the new
-   configuration structure. This is probably also a good recommendation
-   even if upgrading from 2.9.x to 3.x since there were many minor
-   changes along the way.
-     _________________________________________________________________
-   
-1.3.2. What is an "actions" file?
-
-   "actions" files are where various actions that Privoxy might take, are
-   configured. Typically, you would define a set of default actions that
-   apply to all URLs, then add exceptions to these defaults.
-   
-   Actions can be defined on a per site basis, or for groups of sites.
-   Actions can also be grouped together and then applied to one or more
-   sites. There are many possible actions that might apply to any given
-   site. As an example, if we are blocking cookies as one of our default
-   actions, but need to accept cookies from a given site, we would define
-   this in our "actions" file.
-   
-   Privoxy comes with several default actions files, with varying degrees
-   of filtering and blocking, as starting points for your own
-   configuration (see below).
-     _________________________________________________________________
-   
-1.3.3. The "actions"concept confuses me. Please list some of these
-"actions".
-
-   These are all explained in the [63]user-manual. Please refer to that.
-     _________________________________________________________________
-   
-1.3.4. How are actions files configured? What is the easiest way to do this?
-
-   The easiest way to do this, is to access Privoxy with your web browser
-   at [64]http://p.p/, and then select "[65]Edit the actions list" from
-   the selection list. You can also do this by editing the appropriate
-   file with a text editor.
-   
-   Please see the [66]user-manual for a detailed explanation of these and
-   other configuration files, and their various options and syntax.
-     _________________________________________________________________
-   
-1.3.5. What are the differences between intermediate.action, basic.action,
-etc.?
-
-   Configuring Privoxy is not easy. To help you get started, we provide
-   you with three different default configurations. The following table
-   shows you, which features are enabled in each configuration.
-   
-   Table 1. Default Configurations
-   Feature default.action basic.action intermediate.action
-   advanced.action
-   ad-filtering ? x x x
-   blank image ? x x x
-   de-animate GIFs ? x x x
-   referer forging ? x x x
-   jon's +no-cookies-keep (i.e. session cookies only) ? x x x
-   no-popup windows ?   x x
-   fast redirects ?   x x
-   hide-referrer ?   x x
-   hide-useragent ?   x x
-   content-modification ?     x
-   feature-x ?
-   feature-y ?
-   feature-z ?
-     _________________________________________________________________
-   
-1.3.6. Why can I change the configuration with a browser? Does that not
-raise security issues?
-
-   What I don't understand, is how I can browser edit the config file as
-   a regular user, while the whole /etc/privoxy hierarchy belongs to the
-   user "privoxy", with only 644 perms.
-   
-   When you use the browser-based editor, Privoxy itself is writing to
-   the config files. Because Privoxy is running as the user "privoxy", it
-   can update the config files.
-   
-   If you don't like this, setting "enable-edit-actions 0" in the config
-   file will disable the browser-based editor. If you're that paranoid,
-   you should also consider setting "enable-remote-toggle 0" to prevent
-   browser-based enabling/disabling of Privoxy.
-   
-   Note that normally only local users can connect to Privoxy, so this is
-   not (normally) a security problem.
-     _________________________________________________________________
-   
-1.3.7. What is a "default.filter"?
-
-   The "default.filter" file is used to "filter" any web page content. By
-   "filtering" we mean it can modify, remove, or change anything on the
-   page, including HTML tags, and JavaScript. Regular expressions are
-   used to accomplish this, and operate on a line by line basis. This is
-   potentially a very powerful feature, but requires some expertise.
-   
-   If you are familiar with regular expressions, and HTML, you can look
-   at the provided default.filter with a text editor and see some of
-   things it can be used for.
-   
-   Presently, there is no GUI editor option for this part of the
-   configuration, but you can disable/enable various sections of the
-   included default file with the "Actions List Editor" from your
-   browser.
-     _________________________________________________________________
-   
-1.3.8. How can I set up Privoxy to act as a proxy for my LAN?
-
-   By default, Privoxy only responds to requests from localhost. To have
-   it act as a server for a network, this needs to be changed in the main
-   config file where the Privoxy configuration is located. In that file
-   is a "listen-address" option. It may be commented out with a "#"
-   symbol. Make sure it is uncommented, and assign it the address of the
-   LAN gateway interface, and port number to use:
-   
-  listen-address  192.168.1.1:8118
-
-   Save the file, and restart Privoxy. Configure all browsers on the
-   network then to use this address and port number.
-     _________________________________________________________________
-   
-1.3.9. Instead of ads, now I get a checkerboard pattern. I don't want to see
-anything.
-
-   This is a configuration option for images that Privoxy is stopping.
-   You have the choice a checkerboard pattern, a transparent 1x1 GIF
-   image (aka "blank"), or a custom URL or your choice.
-   
-   If you want to see nothing, then change the "+image-blocker" action to
-   "+image-blocker{blank}". This can be done from the "Edit Actions List"
-   selection at [67]http://p.p/. Or by hand editing the appropriate
-   actions file. This will only effect what is defined as "images"
-   though.
-     _________________________________________________________________
-   
-1.3.10. Why would anybody want to see a checkerboard pattern?
-
-   This can be helpful for troubleshooting problems. It might also be
-   good for anyone new to Privoxy so that they can see if their favorite
-   pages are displaying correctly, and Privoxy is not inadvertently
-   removing something important.
-     _________________________________________________________________
-   
-1.3.11. I see large red banners on some pages that say "Blocked". How do I
-get rid of this?
-
-   These are URLs that match something in one of Privoxy's block actions
-   (+block). It is meant to be a warning so that you know something has
-   been blocked and an easy way for you to see why. These are handled
-   differently than what has been defined as "images" (e.g. ad banners).
-   If you want them to be treated as if they were images, so that they
-   can be made invisible, then move the offending URL from the "+block"
-   section to the "+imageblock" section of your actions file.
-   Alternately, you could modify the "block" HTML template that is used
-   by Privoxy to display this, and make it something more to your liking.
-     _________________________________________________________________
-   
-1.3.12. How can I make Privoxy work with other proxies like Squid?
-
-   This can be done. See the [68]user manual, which describes how to do
-   this.
-     _________________________________________________________________
-   
-1.4. Miscellaneous
-
-1.4.1. How much does Privoxy slow my browsing down? This has to add extra
-time to browsing.
-
-   It should not slow you down any in real terms, and may actually help
-   speed things up since ads, banners and other junk are not being
-   displayed. The actual processing time required by Privoxy itself for
-   each page, is relatively small in the overall scheme of things, and
-   happens very quickly. This is typically more than offset by time saved
-   not downloading and rendering ad images.
-   
-   "Filtering" via the filterfile mechanism may cause a perceived
-   slowdown, since the entire page is buffered before displaying. See
-   below.
-     _________________________________________________________________
-   
-1.4.2. I noticed considerable delays in page requests compared to the old
-Junkbuster. What's wrong?
-
-   Using the default filtering configuration, I noticed considerable
-   delays in page requests compared to the old Junkbuster. Loading pages
-   with large contents seemed to take forever, then suddenly delivering
-   all the content at once.
-   
-   The whole content must be loaded in order to filter, and nothing is is
-   sent to the browser during this time. The loading time does not really
-   change in real numbers, but the feeling is different, because most
-   browsers are able to start rendering incomplete content, giving the
-   user a feeling of "it works".
-   
-   To modify the content of a page (i.e. make frames resizeable again,
-   etc.) and not just replace ads, Privoxy needs to download the entire
-   page first, do its content magic and then send the page to the
-   browser.
-     _________________________________________________________________
-   
-1.4.3. What is the "http://p.p/"?
-
-   Since Privoxy sits between your web browser and the Internet, it can
-   be programmed to handle certain pages specially.
-   
-   With recent versions of Privoxy (version 2.9.x), you can get some
-   information about Privoxy and change some settings by going to
-   http://p.p/ or, equivalently, http://www.privoxy.org/config/ (Note
-   that p.p is far easier to type but may not work in some
-   configurations).
-   
-   These pages are *not* forwarded to a server on the Internet - instead
-   they are handled by a special web server which is built in to Privoxy.
-   
-   If you are not running Privoxy, then http://p.p/ will fail, and
-   http://www.privoxy.org/config/ will return a web page telling you
-   you're not running Privoxy.
-   
-   If you have version 2.0.2, then the equivalent is
-   http://example.com/show-proxy-args (but you get far less information,
-   and you should really consider upgrading to 2.9.x).
-     _________________________________________________________________
-   
-1.4.4. Do you still maintain the blocklists?
-
-   No. The format of the blocklists has changed significantly in the
-   versions 2.9.x. Once we have released the new version, there will
-   again be blocklists that you can update automatically.
-     _________________________________________________________________
-   
-1.4.5. How can I submit new ads?
-
-   As of now, please discontinue to submit new ad blocking infos. Once we
-   have released the new version, there will again be a form on the
-   website, which you can use to contribute new ads.
-     _________________________________________________________________
-   
-1.4.6. How can I hide my IP address?
-
-   You cannot hide your IP address with Privoxy or any other software,
-   since the server needs to know your IP address to send the answer to
-   you.
-   
-   Fortunately there are many publicly usable anonymous proxies out
-   there, which solve the problem by providing a further level of
-   indirection between you and the web server, shared by many people and
-   thus letting your requests "drown" in white noise of unrelated
-   requests as far as user tracking is concerned.
-   
-   Most of them will, however, log your IP address and make it available
-   to the authorities in case you abuse that anonymity for criminal
-   purposes. In fact you can't even rule out that some of them only exist
-   to *collect* information on (those suspicious) people with a more than
-   average preference for privacy.
-   
-   You can find a list of anonymous public proxies at [69]multiproxy.org
-   and many more through Google.
-     _________________________________________________________________
-   
-1.4.7. Can Privoxy guarantee I am anonymous?
-
-   No. Your chances of remaining anonymous are greatly improved, but
-   unless you are an expert on Internet security it would be safest to
-   assume that everything you do on the Web can be traced back to you.
-   
-   Privoxy can remove various information about you, and allows you more
-   freedom to decide which sites you can trust. But it's still possible
-   that web sites can find out who you are. Here's one way this can
-   happen.
-   
-   A few browsers disclose the user's email address in certain
-   situations, such as when transferring a file by FTP. Privoxy does not
-   filter FTP. If you need this feature, or are concerned about the mail
-   handler of your browser disclosing your email address, you might
-   consider products such as NSClean.
-   
-   Browsers available only as binaries could use non-standard headers to
-   give out any information they can have access to: see the
-   manufacturer's license agreement. It's impossible to anticipate and
-   prevent every breach of privacy that might occur. The professionally
-   paranoid prefer browsers available as source code, because
-   anticipating their behavior is easier. Trust the source, Luke!
-     _________________________________________________________________
-   
-1.4.8. Might some things break because header information is being altered?
-
-   Definitely. More and more sites use HTTP header content to decide what
-   to display and how to display it. There is many ways that this can be
-   handled, so having hard and fast rules, is tricky.
-   
-   "USER AGENT" in particular is often used in this way to identify the
-   browser, and adjust content accordingly. Changing this now is not
-   recommended, since so many sites do look for this. You may get
-   undesirable results by changing this.
-   
-   For instance, different browsers use different encodings of Russian
-   and Czech characters, certain web servers convert pages on-the-fly
-   according to the User Agent header. Giving a "User Agent" with the
-   wrong operating system or browser manufacturer causes some sites in
-   these languages to be garbled; Surfers to Eastern European sites
-   should change it to something closer. And then some page access
-   counters work by looking at the "REFERER" header; they may fail or
-   break if unavailable. The weather maps of Intellicast have been
-   blocked by their server when no "REFERER" or cookie is provided, is
-   another example. There are many, many other ways things can go wrong
-   when trying to fool a web server.
-   
-   If you have problems with a site, you will have to adjust your
-   configuration accordingly. Cookies are probably the most likely
-   adjustment that may be required, but by no means the only one.
-     _________________________________________________________________
-   
-1.4.9. Can Privoxy act as a "caching" proxy to speed up web browsing?
-
-   No, it does not have this ability at all. You want something like
-   [70]Squid for this. And, yes, before you ask, Privoxy can co-exist
-   with other kinds of proxies like "Squid".
-     _________________________________________________________________
-   
-1.4.10. What about as a firewall? Can Privoxy protect me?
-
-   Not in the way you mean, or in the way a true firewall can, or a proxy
-   that has this specific capability. Privoxy can help protect your
-   privacy, but not really protect you from intrusion attempts.
-     _________________________________________________________________
-   
-1.4.11. The Privoxy logo that replaces ads is very blocky and ugly looking.
-Can't a better font be used?
-
-   This is not a font problem. The logo is an image that is created by
-   Privoxy on the fly. So as to not waste memory, the image is rather
-   small. The blockiness comes when the image is scaled to fill a largish
-   area. There is not much to be done about this, other than to use one
-   of the other "imageblock" directives: pattern, blank, or a URL of your
-   choosing.
-   
-   Given the above problem, we have decided to remove the logo option
-   entirely [as of v2.9.13].
-     _________________________________________________________________
-   
-1.4.12. I have large empty spaces now where ads used to be. Why does Privoxy
-leave these large gaps?
-
-   It would be easy enough to just eliminate this space altogether,
-   rather than fill it with blank space. But, this would create problems
-   with many pages that use the overall size of the ad to help organize
-   the page layout and position the various components of the page where
-   they were intended to be. It is best left this way.
-     _________________________________________________________________
-   
-1.4.13. How can Privoxy filter Secure (HTTPS) URLs?
-
-   This is a limitation since HTTPS transactions are encrypted SSL
-   sessions between your browser and the secure site, and are meant to be
-   reliably secure and private. This means that all cookies and HTTP
-   header information are also encrypted from the time they leave your
-   browser, to the site, and vice versa. Privoxy does not try to
-   unencrypt this information, so it just passes through as is. Privoxy
-   can still catch images and ads that are embedded in the SSL stream
-   though.
-     _________________________________________________________________
-   
-1.4.14. Privoxy runs as a "server". How secure is it? Do I need to take any
-special precautions?
-
-   There are no known exploits that might effect Privoxy. On Unix-like
-   systems, Privoxy can run as a non-privileged user, which is how we
-   recommend it be run. Also, by default Privoxy only listens to requests
-   from "localhost". It is not itself directly exposed to the Internet in
-   this configuration. If you want to have Privoxy serve as a LAN proxy,
-   this will have to be opened up to allow for LAN requests. In this
-   case, we'd recommend you specify only the LAN gateway address, e.g.
-   192.168.1.1 in the main Privoxy config file. All LAN hosts can then
-   use this as their proxy address in the browser proxy configuration. In
-   this way, Privoxy will not listen on any external ports. Of course, a
-   firewall is always good too. Better safe than sorry.
-     _________________________________________________________________
-   
-1.4.15. How can I temporarily disable Privoxy?
-
-   The easiest way is to access Privoxy with your browser by using the
-   special URL: [71]http://p.p/ and select "Toggle Privoxy on or off"
-   from that page.
-     _________________________________________________________________
-   
-1.5. Troubleshooting
-
-1.5.1. I just upgraded and am getting "connection refused" with every web
-page?
-
-   Either Privoxy is not running, or your browser is configured for a
-   different port than what Privoxy is using.
-   
-   The old Privoxy (and also Junkbuster) used port 8000 by default. This
-   has been changed to port 8118 now, due to a conflict with NAS (Network
-   Audio Service), which uses port 8000. If you haven't, you need to
-   change your browser to the new port number, or alternately change
-   Privoxy's "listen-address" setting in the config file used to start
-   Privoxy.
-     _________________________________________________________________
-   
-1.5.2. I just added a new rule, but the steenkin ad is still getting
-through. How?
-
-   If the ad had been displayed before you added its URL, it will
-   probably be held in the browser's cache for some time, so it will be
-   displayed without the need for any request to the server, and Privoxy
-   will not be in the picture. The best thing to do is try flushing the
-   browser's caches. And then try again.
-   
-   If this doesn't help, you probably have an error in the rule you
-   applied. Try pasting the full URL of the offending ad into
-   [72]http://www.privoxy.org/config/show-url-info and see if any actions
-   match your new rule.
-     _________________________________________________________________
-   
-1.5.3. One of my favorite sites does not work with Privoxy. What can I do?
-
-   First verify that it is indeed a Privoxy problem, by disabling Privoxy
-   filtering and blocking. Go to [73]http://p.p/ and click on "Toggle
-   Privoxy On or Off", then disable it. Now try that page again.
-   
-   If still a problem, go to "Show which actions apply to a URL and why"
-   from [74]http://p.p/ and paste the full URL of the page in question
-   into the prompt. See which actions are being applied to the URL. Now,
-   armed with this information, go to "Edit the actions list". Here you
-   should see various sections that have various Privoxy features
-   disabled for specific sites. Disabled "actions" will have a "-" (minus
-   sign) in front of them. Add your problem page URL to one of these
-   sections that looks like it is disabling the feature that is causing
-   the problem. Re-try the page. There might be some trial and error
-   involved. This is discussed in a little more detail in the
-   [75]user-manual appendix.
-   
-   Alternately, if you are comfortable with a text editor, you can
-   accomplish the same thing by editing the appropriate "actions" file.
-     _________________________________________________________________
-   
-1.5.4. What time is it?
-
-   Time for you to go!
-     _________________________________________________________________
-   
-2. Copyright and History
-
-   Please see the user manual for information on Copyright and History.
-     _________________________________________________________________
-   
-3. See also
-
-   Please see the user manual for information on references.
-
-References
-
-   1. http://www.privoxy.org/faq/
-   2. http://www.privoxy.org/user-manual/contact.html
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUESTIONS
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#GENERAL
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWJB
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN37
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#DIFFERS
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FEATURES
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#PROXYMORON
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSERS2
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LICENSE
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#JOINTEAM
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHBROWSERS
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#WHICHOS
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWINSTALL
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN151
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOCALHOST
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN176
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWCONFIG
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN192
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSS
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN210
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGFILES
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BROWSECONFIG
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN327
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN339
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN351
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN362
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN367
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#OTHERPROXY
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#MISC
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN386
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#LOADINGTIMES
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURL
-  37. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#BLOCKLIST
-  38. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#NEWADS
-  39. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#IP
-  40. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN427
-  41. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN438
-  42. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN448
-  43. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN456
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN461
-  45. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN470
-  46. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN474
-  47. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN481
-  48. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#TURNOFF
-  49. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN499
-  50. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN501
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN514
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN520
-  53. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN538
-  54. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  55. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  56. http://www.junkbusters.com/
-  57. http://ijbswa.sourceforge.net/
-  58. http://junkbusters.com/
-  59. http://p.p/
-  60. http://www.gnu.org/copyleft/gpl.html
-  61. http://www.privoxy.org/user-manual/
-  62. http://p.p/
-  63. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE
-  64. http://p.p/
-  65. http://www.privoxy.org/config/edit-actions
-  66. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#ACTIONSFILE
-  67. http://p.p/
-  68. file://localhost/home/swa/sf/current-org/doc/user-manual/configuration.html#FORWARDING
-  69. http://www.multiproxy.org/anon_list.htm
-  70. http://www.squid-cache.org/
-  71. http://p.p/
-  72. http://www.privoxy.org/config/show-url-info
-  73. http://p.p/
-  74. http://p.p/
-  75. file://localhost/home/swa/sf/current-org/doc/user-manual/appendix.html#ACTIONSANAT
diff --git a/doc/text/user-manual.txt b/doc/text/user-manual.txt
deleted file mode 100644 (file)
index 5a33782..0000000
+++ /dev/null
@@ -1,2097 +0,0 @@
-
-Privoxy User Manual
-
-   By: Privoxy Developers
-   
-   $Id: user-manual.sgml,v 1.60 2002/03/27 01:57:34 hal9 Exp $
-   
-   The user manual gives users information on how to install, configure
-   and use Privoxy. Privoxy is a web proxy with advanced filtering
-   capabilities for protecting privacy, filtering web page content,
-   managing cookies, controlling access, and removing ads, banners,
-   pop-ups and other obnoxious Internet Junk. Privoxy has a very flexible
-   configuration and can be customized to suit individual needs and
-   tastes. Privoxy has application for both stand-alone systems and
-   multi-user networks.
-   
-   You can find the latest version of the user manual at
-   [1]http://www.privoxy.org/user-manual/.
-     _________________________________________________________________
-   
-   Table of Contents
-   1. [2]Introduction
-          
-        1.1. [3]New Features
-                
-   2. [4]Installation
-          
-        2.1. [5]Source
-        2.2. [6]Red Hat
-        2.3. [7]SuSE
-        2.4. [8]OS/2
-        2.5. [9]Windows
-        2.6. [10]Other
-                
-   3. [11]Privoxy Configuration
-          
-        3.1. [12]Controlling Privoxy with Your Web Browser
-        3.2. [13]Configuration Files Overview
-        3.3. [14]The Main Configuration File
-                
-              3.3.1. [15]Defining Other Configuration Files
-              3.3.2. [16]Other Configuration Options
-              3.3.3. [17]Access Control List (ACL)
-              3.3.4. [18]Forwarding
-              3.3.5. [19]Windows GUI Options
-                      
-        3.4. [20]The Actions File
-                
-              3.4.1. [21]URL Domain and Path Syntax
-              3.4.2. [22]Actions
-              3.4.3. [23]Aliases
-                      
-        3.5. [24]The Filter File
-        3.6. [25]Templates
-                
-   4. [26]Quickstart to Using Privoxy
-          
-        4.1. [27]Command Line Options
-                
-   5. [28]Contacting the Developers, Bug Reporting and Feature Requests
-   6. [29]Copyright and History
-          
-        6.1. [30]License
-        6.2. [31]History
-                
-   7. [32]See also
-   8. [33]Appendix
-          
-        8.1. [34]Regular Expressions
-                
-              21
-              22
-              23
-              24
-              25
-              26
-              27
-              28
-              29
-                      
-        8.2. [35]Privoxy's Internal Pages
-        8.3. [36]Anatomy of an Action
-                
-1. Introduction
-
-   Privoxy is a web proxy with advanced filtering capabilities for
-   protecting privacy, filtering web page content, managing cookies,
-   controlling access, and removing ads, banners, pop-ups and other
-   obnoxious Internet junk. Privoxy has a very flexible configuration and
-   can be customized to suit individual needs and tastes. Privoxy has
-   application for both stand-alone systems and multi-user networks.
-   
-   Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-   was originally written by JunkBusters Corporation, and was released as
-   free open-source software under the GNU GPL. Stefan Waldherr made many
-   improvements, and started the SourceForge project to continue
-   development.
-   
-   Privoxy continues the Junkbuster tradition, but adds many refinements
-   and enhancements.
-   
-   This documentation is included with the current BETA version of
-   Privoxy and is mostly complete at this point. The most up to date
-   reference for the time being is still the comments in the source files
-   and in the individual configuration files. Development of version 3.0
-   is currently nearing completion, and includes many significant changes
-   and enhancements over earlier versions. The target release date for
-   stable v3.0 is "soon" ;-)
-   
-   Since this is a BETA version, not all new features are well tested.
-   This documentation may be slightly out of sync as a result (especially
-   with CVS sources). And there may be bugs, though hopefully not many!
-     _________________________________________________________________
-   
-1.1. New Features
-
-   In addition to Internet Junkbuster's traditional feature of ad and
-   banner blocking and cookie management, Privoxy provides new features,
-   some of them currently under development:
-   
-     * Integrated browser based configuration and control utility
-       ([37]http://p.p). Browser-based tracing of rule and filter
-       effects.
-     * Blocking of annoying pop-up browser windows.
-     * HTTP/1.1 compliant (most, but not all 1.1 features are supported).
-     * Support for Perl Compatible Regular Expressions in the
-       configuration files, and generally a more sophisticated and
-       flexible configuration syntax over previous versions.
-     * GIF de-animation.
-     * Web page content filtering (removes banners based on size,
-       invisible "web-bugs", JavaScript, pop-ups, status bar abuse, etc.)
-     * Bypass many click-tracking scripts (avoids script redirection).
-     * Multi-threaded (POSIX and native threads).
-     * Auto-detection and re-reading of config file changes.
-     * User-customizable HTML templates (e.g. 404 error page).
-     * Improved cookie management features (e.g. session based cookies).
-     * Builds from source on most UNIX-like systems. Packages available
-       for: Linux (RedHat, SuSE, or Debian), Windows, Sun Solaris, Mac
-       OSX, OS/2, HP-UX 11 and AmigaOS.
-     * In addition, the configuration is much more powerful and versatile
-       over-all.
-     _________________________________________________________________
-   
-2. Installation
-
-   Privoxy is available as raw source code, or pre-compiled binaries. See
-   the [38]Privoxy Home Page for binaries and current release info.
-   Privoxy is also available via [39]CVS. This is the recommended
-   approach at this time. But please be aware that CVS is constantly
-   changing, and it may break in mysterious ways.
-     _________________________________________________________________
-   
-2.1. Source
-
-   For gzipped tar archives, unpack the source:
-   
- tar xzvf privoxy-2.9.13-beta-src* [.tgz or .tar.gz]
- cd privoxy-2.9.13-beta
-
-   For retrieving the current CVS sources, you'll need the CVS package
-   installed first. To download CVS source:
-   
-  cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-  cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co cu
-rrent
-  cd current
-
-   This will create a directory named current/, which will contain the
-   source tree.
-   
-   Then, in either case, to build from tarball/CVS source:
-   
- ./configure      (--help to see options)
- make             (the make from gnu, gmake for *BSD)
- su
- make -n install  (to see where all the files will go)
- make install     (to really install)
-
-   For Redhat and SuSE Linux RPM packages, see below.
-     _________________________________________________________________
-   
-2.2. Red Hat
-
-   To build Redhat RPM packages, install source as above. Then:
-   
- autoheader
- autoconf
- ./configure
- make redhat-dist
-
-   This will create both binary and src RPMs in the usual places.
-   Example:
-   
-      /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-   
-      /usr/src/redhat/SRPMS/privoxy-2.9.11-1.src.rpm
-   
-   To install, of course:
-   
- rpm -Uvv /usr/src/redhat/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-
-   This will place the Privoxy configuration files in /etc/privoxy/, and
-   log files in /var/log/privoxy/.
-     _________________________________________________________________
-   
-2.3. SuSE
-
-   To build SuSE RPM packages, install source as above. Then:
-   
- autoheader
- autoconf
- ./configure
- make suse-dist
-
-   This will create both binary and src RPMs in the usual places.
-   Example:
-   
-      /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-   
-      /usr/src/packages/SRPMS/privoxy-2.9.11-1.src.rpm
-   
-   To install, of course:
-   
- rpm -Uvv /usr/src/packages/RPMS/i686/privoxy-2.9.11-1.i686.rpm
-
-   This will place the Privoxy configuration files in /etc/privoxy/, and
-   log files in /var/log/privoxy/.
-     _________________________________________________________________
-   
-2.4. OS/2
-
-   Privoxy is packaged in a WarpIN self- installing archive. The
-   self-installing program will be named depending on the release
-   version, something like: ijbos2_setup_1.2.3.exe. In order to install
-   it, simply run this executable or double-click on its icon and follow
-   the WarpIN installation panels. A shadow of the Privoxy executable
-   will be placed in your startup folder so it will start automatically
-   whenever OS/2 starts.
-   
-   The directory you choose to install Privoxy into will contain all of
-   the configuration files.
-   
-   If you would like to build binary images on OS/2 yourself, you will
-   need a few Unix-like tools: autoconf, autoheader and sh. These tools
-   will be used to create the required config.h file, which is not part
-   of the source distribution because it differs based on platform. You
-   will also need a compiler. The distribution has been created using IBM
-   VisualAge compilers, but you can use any compiler you like. GCC/EMX
-   has the disadvantage of needing to be single-threaded due to a
-   limitation of EMX's implementation of the select() socket call.
-   
-   In addition to needing the source code distribution as outlined
-   earlier, you will want to extract the os2seutp directory from CVS:
- cvs -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa login
-
- cvs -z3 -d:pserver:anonymous@cvs.ijbswa.sourceforge.net:/cvsroot/ijbswa co os2
-setup
-
-   This will create a directory named os2setup/, which will contain the
-   Makefile.vac makefile and os2build.cmd which is used to completely
-   create the binary distribution. The sequence of events for building
-   the executable for yourself goes something like this:
- cd current
- autoheader
- autoconf
- sh configure
- cd ..\os2setup
- nmake -f Makefile.vac
-
-   You will see this sequence laid out in os2build.cmd.
-     _________________________________________________________________
-   
-2.5. Windows
-
-   Click-click. (I need help on this. Not a clue here. Also for
-   configuration section below. HB.)
-     _________________________________________________________________
-   
-2.6. Other
-
-   Some quick notes on other Operating Systems.
-   
-   For FreeBSD (and other *BSDs?), the build will require gmake instead
-   of the included make. gmake is available from [40]http://www.gnu.org.
-   The rest should be the same as above for Linux/Unix.
-     _________________________________________________________________
-   
-3. Privoxy Configuration
-
-   All Privoxy configuration is kept in text files. These files can be
-   edited with a text editor. Many important aspects of Privoxy can also
-   be controlled easily with a web browser.
-     _________________________________________________________________
-   
-3.1. Controlling Privoxy with Your Web Browser
-
-   Privoxy can be reached by the special URL [41]http://p.p/ (or
-   alternately [42]http://www.privoxy.org/config/), which is an internal
-   page. You will see the following section:
-   
-Please choose from the following options:
-
-    * Show information about the current configuration
-    * Show the source code version numbers
-    * Show the client's request headers.
-    * Show which actions apply to a URL and why
-    * Toggle Privoxy on or off
-    * Edit the actions list
-
-
-   This should be self-explanatory. Note the last item is an editor for
-   the "actions list", which is where much of the ad, banner, cookie, and
-   URL blocking magic is configured as well as other advanced features of
-   Privoxy. This is an easy way to adjust various aspects of Privoxy
-   configuration. The actions file, and other configuration files, are
-   explained in detail below. Privoxy will automatically detect any
-   changes to these files.
-   
-   "Toggle Privoxy On or Off" is handy for sites that might have problems
-   with your current actions and filters, or just to test if a site
-   misbehaves, whether it is Privoxy causing the problem or not. Privoxy
-   continues to run as a proxy in this case, but all filtering is
-   disabled.
-     _________________________________________________________________
-   
-3.2. Configuration Files Overview
-
-   For Unix, *BSD and Linux, all configuration files are located in
-   /etc/privoxy/ by default. For MS Windows, OS/2, and AmigaOS these are
-   all in the same directory as the Privoxy executable. The name and
-   number of configuration files has changed from previous versions, and
-   is subject to change as development progresses.
-   
-   The installed defaults provide a reasonable starting point, though
-   possibly aggressive by some standards. For the time being, there are
-   only three default configuration files (this will change in time):
-   
-     * The main configuration file is named config on Linux, Unix, BSD,
-       OS/2, and AmigaOS and config.txt on Windows.
-     * The default.action file is used to define various "actions"
-       relating to images, banners, pop-ups, access restrictions, banners
-       and cookies. There is a CGI based editor for this file that can be
-       accessed via [43]http://p.p. (Other actions files are included as
-       well with differing levels of filtering and blocking, e.g.
-       ijb-basic.action.)
-     * The default.filter file can be used to re-write the raw page
-       content, including viewable text as well as embedded HTML and
-       JavaScript, and whatever else lurks on any given web page.
-       
-   default.action and default.filter can use Perl style regular
-   expressions for maximum flexibility. All files use the "#" character
-   to denote a comment. Such lines are not processed by Privoxy. After
-   making any changes, there is no need to restart Privoxy in order for
-   the changes to take effect. Privoxy should detect such changes
-   automatically.
-   
-   While under development, the configuration content is subject to
-   change. The below documentation may not be accurate by the time you
-   read this. Also, what constitutes a "default" setting, may change, so
-   please check all your configuration files on important issues.
-     _________________________________________________________________
-   
-3.3. The Main Configuration File
-
-   Again, the main configuration file is named config on Linux/Unix/BSD
-   and OS/2, and config.txt on Windows. Configuration lines consist of an
-   initial keyword followed by a list of values, all separated by
-   whitespace (any number of spaces or tabs). For example:
-   
-     blockfile blocklist.ini
-   
-   Indicates that the blockfile is named "blocklist.ini". (A default
-   installation does not use this.)
-   
-   A "#" indicates a comment. Any part of a line following a "#" is
-   ignored, except if the "#" is preceded by a "\".
-   
-   Thus, by placing a "#" at the start of an existing configuration line,
-   you can make it a comment and it will be treated as if it weren't
-   there. This is called "commenting out" an option and can be useful to
-   turn off features: If you comment out the "logfile" line, Privoxy will
-   not log to a file at all. Watch for the "default:" section in each
-   explanation to see what happens if the option is left unset (or
-   commented out).
-   
-   Long lines can be continued on the next line by using a "\" as the
-   very last character.
-   
-   There are various aspects of Privoxy behavior that can be tuned.
-     _________________________________________________________________
-   
-3.3.1. Defining Other Configuration Files
-
-   Privoxy can use a number of other files to tell it what ads to block,
-   what cookies to accept, etc. This section of the configuration file
-   tells Privoxy where to find all those other files.
-   
-   On Windows and AmigaOS, Privoxy looks for these files in the same
-   directory as the executable. On Unix and OS/2, Privoxy looks for these
-   files in the current working directory. In either case, an absolute
-   path name can be used to avoid problems.
-   
-   When development goes modular and multi-user, the blocker, filter, and
-   per-user config will be stored in subdirectories of "confdir". For
-   now, only confdir/templates is used for storing HTML templates for CGI
-   results.
-   
-   The location of the configuration files:
-   
-     confdir /etc/privoxy       # No trailing /, please.
-   
-   The directory where all logging (i.e. logfile and jarfile) takes
-   place. No trailing "/", please:
-   
-     logdir /var/log/privoxy
-   
-   Note that all file specifications below are relative to the above two
-   directories!
-   
-   The "default.action" file contains patterns to specify the actions to
-   apply to requests for each site. Default: Cookies to and from all
-   destinations are kept only during the current browser session (i.e.
-   they are not saved to disk). Pop-ups are disabled for all sites. All
-   sites are filtered through selected sections of "default.filter". No
-   sites are blocked. Privoxy displays a checkboard type pattern for
-   filtered ads and other images. The syntax of this file is explained in
-   detail [44]below. Other "actions" files are included, and you are free
-   to use any of them. They have varying degrees of aggressiveness.
-   
-     actionsfile default.action
-   
-   The "default.filter" file contains content modification rules that use
-   "regular expressions". These rules permit powerful changes on the
-   content of Web pages, e.g., you could disable your favorite JavaScript
-   annoyances, re-write the actual displayed text, or just have some fun
-   replacing "Microsoft" with "MicroSuck" wherever it appears on a Web
-   page. Default: whatever the developers are playing with :-/
-   
-   Filtering requires buffering the page content, which may appear to
-   slow down page rendering since nothing is displayed until all content
-   has passed the filters. (It does not really take longer, but seems
-   that way since the page is not incrementally displayed.) This effect
-   will be more noticeable on slower connections.
-   
-     filterfile default.filter
-   
-   The logfile is where all logging and error messages are written. The
-   logfile can be useful for tracking down a problem with Privoxy (e.g.,
-   it's not blocking an ad you think it should block) but in most cases
-   you probably will never look at it.
-   
-   Your logfile will grow indefinitely, and you will probably want to
-   periodically remove it. On Unix systems, you can do this with a cron
-   job (see "man cron"). For Redhat, a logrotate script has been
-   included.
-   
-   On SuSE Linux systems, you can place a line like "/var/log/privoxy.*
-   +1024k 644 nobody.nogroup" in /etc/logfiles, with the effect that
-   cron.daily will automatically archive, gzip, and empty the log, when
-   it exceeds 1M size.
-   
-   Default: Log to the a file named logfile. Comment out to disable
-   logging.
-   
-     logfile logfile
-   
-   The "jarfile" defines where Privoxy stores the cookies it intercepts.
-   Note that if you use a "jarfile", it may grow quite large. Default:
-   Don't store intercepted cookies.
-   
-     #jarfile jarfile
-   
-   If you specify a "trustfile", Privoxy will only allow access to sites
-   that are named in the trustfile. You can also mark sites as trusted
-   referrers, with the effect that access to untrusted sites will be
-   granted, if a link from a trusted referrer was used. The link target
-   will then be added to the "trustfile". This is a very restrictive
-   feature that typical users most probably want to leave disabled.
-   Default: Disabled, don't use the trust mechanism.
-   
-     #trustfile trust
-   
-   If you use the trust mechanism, it is a good idea to write up some
-   on-line documentation about your blocking policy and to specify the
-   URL(s) here. They will appear on the page that your users receive when
-   they try to access untrusted content. Use multiple times for multiple
-   URLs. Default: Don't display links on the "untrusted" info page.
-   
-     trust-info-url http://www.your-site.com/why_we_block.html
-     trust-info-url http://www.your-site.com/what_we_allow.html
-     _________________________________________________________________
-   
-3.3.2. Other Configuration Options
-
-   This part of the configuration file contains options that control how
-   Privoxy operates.
-   
-   "Admin-address" should be set to the email address of the proxy
-   administrator. It is used in many of the proxy-generated pages.
-   Default: fill@me.in.please.
-   
-     #admin-address fill@me.in.please
-   
-   "Proxy-info-url" can be set to a URL that contains more info about
-   this Privoxy installation, it's configuration and policies. It is used
-   in many of the proxy-generated pages and its use is highly recommended
-   in multi-user installations, since your users will want to know why
-   certain content is blocked or modified. Default: Don't show a link to
-   on-line documentation.
-   
-     proxy-info-url http://www.your-site.com/proxy.html
-   
-   "Listen-address" specifies the address and port where Privoxy will
-   listen for connections from your Web browser. The default is to listen
-   on the localhost port 8118, and this is suitable for most users. (In
-   your web browser, under proxy configuration, list the proxy server as
-   "localhost" and the port as "8118").
-   
-   If you already have another service running on port 8118, or if you
-   want to serve requests from other machines (e.g. on your local
-   network) as well, you will need to override the default. The syntax is
-   "listen-address [<ip-address>]:<port>". If you leave out the IP
-   address, Privoxy will bind to all interfaces (addresses) on your
-   machine and may become reachable from the Internet. In that case,
-   consider using access control lists (acl's) (see "aclfile" above), or
-   a firewall.
-   
-   For example, suppose you are running Privoxy on a machine which has
-   the address 192.168.0.1 on your local private network (192.168.0.0)
-   and has another outside connection with a different address. You want
-   it to serve requests from inside only:
-   
-     listen-address 192.168.0.1:8118
-   
-   If you want it to listen on all addresses (including the outside
-   connection):
-   
-     listen-address :8118
-   
-   If you do this, consider using ACLs (see "aclfile" above). Note: you
-   will need to point your browser(s) to the address and port that you
-   have configured here. Default: localhost:8118 (127.0.0.1:8118).
-   
-   The debug option sets the level of debugging information to log in the
-   logfile (and to the console in the Windows version). A debug level of
-   1 is informative because it will show you each request as it happens.
-   Higher levels of debug are probably only of interest to developers.
-   
-     debug         1 # GPC   = show each GET/POST/CONNECT request
-     debug         2 # CONN  = show each connection status
-     debug         4 # IO    = show I/O status
-     debug         8 # HDR   = show header parsing
-     debug        16 # LOG   = log all data into the logfile
-     debug        32 # FRC   = debug force feature
-     debug        64 # REF   = debug regular expression filter
-     debug       128 #       = debug fast redirects
-     debug       256 #       = debug GIF de-animation
-     debug       512 # CLF   = Common Log Format
-     debug      1024 #       = debug kill pop-ups
-     debug      4096 # INFO  = Startup banner and warnings.
-     debug      8192 # ERROR = Non-fatal errors
-   
-   It is highly recommended that you enable ERROR reporting (debug 8192),
-   at least until v3.0 is released.
-   
-   The reporting of FATAL errors (i.e. ones which crash Privoxy) is
-   always on and cannot be disabled.
-   
-   If you want to use CLF (Common Log Format), you should set "debug 512"
-   ONLY, do not enable anything else.
-   
-   Multiple "debug" directives, are OK - they're logical-OR'd together.
-   
-     debug 15 # same as setting the first 4 listed above
-   
-   Default:
-   
-     debug 1 # URLs
-     debug 4096 # Info
-     debug 8192 # Errors - *we highly recommended enabling this*
-   
-   Privoxy normally uses "multi-threading", a software technique that
-   permits it to handle many different requests simultaneously. In some
-   cases you may wish to disable this -- particularly if you're trying to
-   debug a problem. The "single-threaded" option forces Privoxy to handle
-   requests sequentially. Default: Multi-threaded mode.
-   
-     #single-threaded
-   
-   "toggle" allows you to temporarily disable all Privoxy's filtering.
-   Just set "toggle 0".
-   
-   The Windows version of Privoxy puts an icon in the system tray, which
-   also allows you to change this option. If you right-click on that icon
-   (or select the "Options" menu), one choice is "Enable". Clicking on
-   enable toggles Privoxy on and off. This is useful if you want to
-   temporarily disable Privoxy, e.g., to access a site that requires
-   cookies which you would otherwise have blocked. This can also be
-   toggled via a web browser at the Privoxy internal address of
-   [45]http://p.p on any platform.
-   
-   "toggle 1" means Privoxy runs normally, "toggle 0" means that Privoxy
-   becomes a non-anonymizing non-blocking proxy. Default: 1 (on).
-   
-     toggle 1
-   
-   For content filtering, i.e. the "+filter" and "+deanimate-gif"
-   actions, it is necessary that Privoxy buffers the entire document
-   body. This can be potentially dangerous, since a server could just
-   keep sending data indefinitely and wait for your RAM to exhaust. With
-   nasty consequences.
-   
-   The buffer-limit option lets you set the maximum size in Kbytes that
-   each buffer may use. When the documents buffer exceeds this size, it
-   is flushed to the client unfiltered and no further attempt to filter
-   the rest of it is made. Remember that there may multiple threads
-   running, which might require increasing the "buffer-limit" Kbytes
-   each, unless you have enabled "single-threaded" above.
-   
-     buffer-limit 4069
-   
-   To enable the web-based default.action file editor set
-   enable-edit-actions to 1, or 0 to disable. Note that you must have
-   compiled Privoxy with support for this feature, otherwise this option
-   has no effect. This internal page can be reached at [46]http://p.p.
-   
-   Security note: If this is enabled, anyone who can use the proxy can
-   edit the actions file, and their changes will affect all users. For
-   shared proxies, you probably want to disable this. Default: enabled.
-   
-     enable-edit-actions 1
-   
-   Allow Privoxy to be toggled on and off remotely, using your web
-   browser. Set "enable-remote-toggle"to 1 to enable, and 0 to disable.
-   Note that you must have compiled Privoxy with support for this
-   feature, otherwise this option has no effect.
-   
-   Security note: If this is enabled, anyone who can use the proxy can
-   toggle it on or off (see [47]http://p.p), and their changes will
-   affect all users. For shared proxies, you probably want to disable
-   this. Default: enabled.
-   
-     enable-remote-toggle 1
-     _________________________________________________________________
-   
-3.3.3. Access Control List (ACL)
-
-   Access controls are included at the request of some ISPs and systems
-   administrators, and are not usually needed by individual users. Please
-   note the warnings in the FAQ that this proxy is not intended to be a
-   substitute for a firewall or to encourage anyone to defer addressing
-   basic security weaknesses.
-   
-   If no access settings are specified, the proxy talks to anyone that
-   connects. If any access settings file are specified, then the proxy
-   talks only to IP addresses permitted somewhere in this file and not
-   denied later in this file.
-   
-   Summary -- if using an ACL:
-   
-   Client must have permission to receive service.
-   
-   LAST match in ACL wins.
-   
-   Default behavior is to deny service.
-   
-   The syntax for an entry in the Access Control List is:
-   
-     ACTION    SRC_ADDR[/SRC_MASKLEN]    [ DST_ADDR[/DST_MASKLEN] ]
-   
-   Where the individual fields are:
-   
-    ACTION      = "permit-access" or "deny-access"
-    SRC_ADDR    = client hostname or dotted IP address
-    SRC_MASKLEN = number of bits in the subnet mask for the source
-    DST_ADDR    = server or forwarder hostname or dotted IP address
-    DST_MASKLEN = number of bits in the subnet mask for the target
-   
-   The field separator (FS) is whitespace (space or tab).
-   
-   IMPORTANT NOTE: If Privoxy is using a forwarder (see below) or a
-   gateway for a particular destination URL, the DST_ADDR that is
-   examined is the address of the forwarder or the gateway and NOT the
-   address of the ultimate target. This is necessary because it may be
-   impossible for the local Privoxy to determine the address of the
-   ultimate target (that's often what gateways are used for).
-   
-   Here are a few examples to show how the ACL features work:
-   
-   "localhost" is OK -- no DST_ADDR implies that ALL destination
-   addresses are OK:
-   
-     permit-access localhost
-   
-   A silly example to illustrate permitting any host on the class-C
-   subnet with Privoxy to go anywhere:
-   
-     permit-access www.privoxy.com/24
-   
-   Except deny one particular IP address from using it at all:
-   
-     deny-access ident.privoxy.com
-   
-   You can also specify an explicit network address and subnet mask.
-   Explicit addresses do not have to be resolved to be used.
-   
-     permit-access 207.153.200.0/24
-   
-   A subnet mask of 0 matches anything, so the next line permits
-   everyone.
-   
-     permit-access 0.0.0.0/0
-   
-   Note, you cannot say:
-   
-     permit-access .org
-   
-   to allow all *.org domains. Every IP address listed must resolve
-   fully.
-   
-   An ISP may want to provide a Privoxy that is accessible by "the world"
-   and yet restrict use of some of their private content to hosts on its
-   internal network (i.e. its own subscribers). Say, for instance the ISP
-   owns the Class-B IP address block 123.124.0.0 (a 16 bit netmask). This
-   is how they could do it:
-   
-    permit-access 0.0.0.0/0 0.0.0.0/0   # other clients can go anywhere
-                                          # with the following exceptions
-   :
-   
-    deny-access   0.0.0.0/0   123.124.0.0/16 # block all external request
-   s for
-                                             # sites on the ISP's network
-    permit 0.0.0.0/0 www.my_isp.com        # except for the ISP's main
-                                             # web site
-    permit 123.124.0.0/16 0.0.0.0/0          # the ISP's clients can go
-                                             # anywhere
-   
-   Note that if some hostnames are listed with multiple IP addresses, the
-   primary value returned by DNS (via gethostbyname()) is used. Default:
-   Anyone can access the proxy.
-     _________________________________________________________________
-   
-3.3.4. Forwarding
-
-   This feature allows chaining of HTTP requests via multiple proxies. It
-   can be used to better protect privacy and confidentiality when
-   accessing specific domains by routing requests to those domains to a
-   special purpose filtering proxy such as lpwa.com. Or to use a caching
-   proxy to speed up browsing.
-   
-   It can also be used in an environment with multiple networks to route
-   requests via multiple gateways allowing transparent access to multiple
-   networks without having to modify browser configurations.
-   
-   Also specified here are SOCKS proxies. Privoxy SOCKS 4 and SOCKS 4A.
-   The difference is that SOCKS 4A will resolve the target hostname using
-   DNS on the SOCKS server, not our local DNS client.
-   
-   The syntax of each line is:
-   
-    forward target_domain[:port] http_proxy_host[:port]
-    forward-socks4 target_domain[:port] socks_proxy_host[:port]
-   http_proxy_host[:port]
-    forward-socks4a target_domain[:port] socks_proxy_host[:port]
-   http_proxy_host[:port]
-   
-   If http_proxy_host is ".", then requests are not forwarded to a HTTP
-   proxy but are made directly to the web servers.
-   
-   Lines are checked in sequence, and the last match wins.
-   
-   There is an implicit line equivalent to the following, which specifies
-   that anything not finding a match on the list is to go out without
-   forwarding or gateway protocol, like so:
-   
-     forward .* . # implicit
-   
-   In the following common configuration, everything goes to Lucent's
-   LPWA, except SSL on port 443 (which it doesn't handle):
-   
-    forward .* lpwa.com:8000
-    forward :443 .
-   
-   Some users have reported difficulties related to LPWA's use of "." as
-   the last element of the domain, and have said that this can be fixed
-   with this:
-   
-     forward lpwa. lpwa.com:8000
-   
-   (NOTE: the syntax for specifying target_domain has changed since the
-   previous paragraph was written -- it will not work now. More
-   information is welcome.)
-   
-   In this fictitious example, everything goes via an ISP's caching
-   proxy, except requests to that ISP:
-   
-    forward .* caching.myisp.net:8000
-    forward myisp.net .
-   
-   For the @home network, we're told the forwarding configuration is
-   this:
-   
-     forward .* proxy:8080
-   
-   Also, we're told they insist on getting cookies and JavaScript, so you
-   should allow cookies from home.com. We consider JavaScript a potential
-   security risk. Java need not be enabled.
-   
-   In this example direct connections are made to all "internal" domains,
-   but everything else goes through Lucent's LPWA by way of the company's
-   SOCKS gateway to the Internet.
-   
-    forward-socks4 .* lpwa.com:8000 firewall.my_company.com:1080
-    forward my_company.com .
-   
-   This is how you could set up a site that always uses SOCKS but no
-   forwarders:
-   
-     forward-socks4a .* . firewall.my_company.com:1080
-   
-   An advanced example for network administrators:
-   
-   If you have links to multiple ISPs that provide various special
-   content to their subscribers, you can configure forwarding to pass
-   requests to the specific host that's connected to that ISP so that
-   everybody can see all of the content on all of the ISPs.
-   
-   This is a bit tricky, but here's an example:
-   
-   host-a has a PPP connection to isp-a.com. And host-b has a PPP
-   connection to isp-b.com. host-a can run a Privoxy proxy with
-   forwarding like this:
-   
-    forward .* .
-    forward isp-b.com host-b:8118
-   
-   host-b can run a Privoxy proxy with forwarding like this:
-   
-    forward .* .
-    forward isp-a.com host-a:8118
-   
-   Now, anyone on the Internet (including users on host-a and host-b) can
-   set their browser's proxy to either host-a or host-b and be able to
-   browse the content on isp-a or isp-b.
-   
-   Here's another practical example, for University of Kent at Canterbury
-   students with a network connection in their room, who need to use the
-   University's Squid web cache.
-   
-    forward *. ssbcache.ukc.ac.uk:3128  # Use the proxy, except for:
-    forward .ukc.ac.uk .  # Anything on the same domain as us
-    forward * .  # Host with no domain specified
-    forward 129.12.*.* .  # A dotted IP on our /16 network.
-    forward 127.*.*.* .  # Loopback address
-    forward localhost.localdomain .  # Loopback address
-    forward www.ukc.mirror.ac.uk .  # Specific host
-   
-   If you intend to chain Privoxy and squid locally, then chain as
-   browser -> squid -> privoxy is the recommended way.
-   
-   Your squid configuration could then look like this:
-   
-     # Define Privoxy as parent cache
-   
-     cache_peer 127.0.0.1 parent 8118 0 no-query
-   
-     # Define ACL for protocol FTP
-     acl FTP proto FTP
-     # Do not forward ACL FTP to privoxy
-     always_direct allow FTP
-     # Do not forward ACL CONNECT (https) to privoxy
-     always_direct allow CONNECT
-     # Forward the rest to privoxy
-     never_direct allow all
-     _________________________________________________________________
-   
-3.3.5. Windows GUI Options
-
-   Privoxy has a number of options specific to the Windows GUI interface:
-   
-   If "activity-animation" is set to 1, the Privoxy icon will animate
-   when "Privoxy" is active. To turn off, set to 0.
-   
-     activity-animation 1
-   
-   If "log-messages" is set to 1, Privoxy will log messages to the
-   console window:
-   
-     log-messages 1
-   
-   If "log-buffer-size" is set to 1, the size of the log buffer, i.e. the
-   amount of memory used for the log messages displayed in the console
-   window, will be limited to "log-max-lines" (see below).
-   
-   Warning: Setting this to 0 will result in the buffer to grow
-   infinitely and eat up all your memory!
-   
-     log-buffer-size 1
-   
-   log-max-lines is the maximum number of lines held in the log buffer.
-   See above.
-   
-     log-max-lines 200
-   
-   If "log-highlight-messages" is set to 1, Privoxy will highlight
-   portions of the log messages with a bold-faced font:
-   
-     log-highlight-messages 1
-   
-   The font used in the console window:
-   
-     log-font-name Comic Sans MS
-   
-   Font size used in the console window:
-   
-     log-font-size 8
-   
-   "show-on-task-bar" controls whether or not Privoxy will appear as a
-   button on the Task bar when minimized:
-   
-     show-on-task-bar 0
-   
-   If "close-button-minimizes" is set to 1, the Windows close button will
-   minimize Privoxy instead of closing the program (close with the exit
-   option on the File menu).
-   
-     close-button-minimizes 1
-   
-   The "hide-console" option is specific to the MS-Win console version of
-   Privoxy. If this option is used, Privoxy will disconnect from and hide
-   the command console.
-   
-     #hide-console
-     _________________________________________________________________
-   
-3.4. The Actions File
-
-   The "default.action" file (formerly actionsfile or ijb.action) is used
-   to define what actions Privoxy takes, and thus determines how images,
-   cookies and various other aspects of HTTP content and transactions are
-   handled. Images can be anything you want, including ads, banners, or
-   just some obnoxious URL that you would rather not see. Cookies can be
-   accepted or rejected, or accepted only during the current browser
-   session (i.e. not written to disk). Changes to default.action should
-   be immediately visible to Privoxy without the need to restart.
-   
-   The easiest way to edit "actions" file is with a browser by loading
-   [48]http://p.p/, and then select "Edit Actions List". A text editor
-   can also be used.
-   
-   To determine which actions apply to a request, the URL of the request
-   is compared to all patterns in this file. Every time it matches, the
-   list of applicable actions for the URL is incrementally updated. You
-   can trace this process by visiting [49]http://p.p/show-url-info.
-   
-   There are four types of lines in this file: comments (begin with a "#"
-   character), actions, aliases and patterns, all of which are explained
-   below, as well as the configuration file syntax that Privoxy
-   understands.
-     _________________________________________________________________
-   
-3.4.1. URL Domain and Path Syntax
-
-   Generally, a pattern has the form <domain>/<path>, where both the
-   <domain> and <path> part are optional. If you only specify a domain
-   part, the "/" can be left out:
-   
-   www.example.com - is a domain only pattern and will match any request
-   to "www.example.com".
-   
-   www.example.com/ - means exactly the same.
-   
-   www.example.com/index.html - matches only the single document
-   "/index.html" on "www.example.com".
-   
-   /index.html - matches the document "/index.html", regardless of the
-   domain.
-   
-   index.html - matches nothing, since it would be interpreted as a
-   domain name and there is no top-level domain called ".html".
-   
-   The matching of the domain part offers some flexible options: if the
-   domain starts or ends with a dot, it becomes unanchored at that end.
-   For example:
-   
-   .example.com - matches any domain that ENDS in ".example.com".
-   
-   www. - matches any domain that STARTS with "www".
-   
-   Additionally, there are wild-cards that you can use in the domain
-   names themselves. They work pretty similar to shell wild-cards: "*"
-   stands for zero or more arbitrary characters, "?" stands for any
-   single character. And you can define character classes in square
-   brackets and they can be freely mixed:
-   
-   ad*.example.com - matches "adserver.example.com", "ads.example.com",
-   etc but not "sfads.example.com".
-   
-   *ad*.example.com - matches all of the above, and then some.
-   
-   .?pix.com - matches "www.ipix.com", "pictures.epix.com",
-   "a.b.c.d.e.upix.com", etc.
-   
-   www[1-9a-ez].example.com - matches "www1.example.com",
-   "www4.example.com", "wwwd.example.com", "wwwz.example.com", etc., but
-   not "wwww.example.com".
-   
-   If Privoxy was compiled with "pcre" support (default), Perl compatible
-   regular expressions can be used. See the pcre/docs/ directory or "man
-   perlre" (also available on
-   [50]http://www.perldoc.com/perl5.6/pod/perlre.html) for details. A
-   brief discussion of regular expressions is in the [51]Appendix. For
-   instance:
-   
-   /.*/advert[0-9]+\.jpe?g - would match a URL from any domain, with any
-   path that includes "advert" followed immediately by one or more
-   digits, then a "." and ending in either "jpeg" or "jpg". So we match
-   "example.com/ads/advert2.jpg", and
-   "www.example.com/ads/banners/advert39.jpeg", but not
-   "www.example.com/ads/banners/advert39.gif" (no gifs in the example
-   pattern).
-   
-   Please note that matching in the path is case INSENSITIVE by default,
-   but you can switch to case sensitive at any point in the pattern by
-   using the "(?-i)" switch:
-   
-   www.example.com/(?-i)PaTtErN.* - will match only documents whose path
-   starts with "PaTtErN" in exactly this capitalization.
-     _________________________________________________________________
-   
-3.4.2. Actions
-
-   Actions are enabled if preceded with a "+", and disabled if preceded
-   with a "-". Actions are invoked by enclosing the action name in curly
-   braces (e.g. {+some_action}), followed by a list of URLs to which the
-   action applies. There are three classes of actions:
-   
-     * Boolean (e.g. "+/-block"):
-         {+name}        # enable this action
-         {-name}        # disable this action
-       
-     * parameterized (e.g. "+/-hide-user-agent"):
-         {+name{param}}  # enable action and set parameter to "param"
-         {-name}         # disable action
-       
-     * Multi-value (e.g. "{+/-add-header{Name: value}}",
-       "{+/-wafer{name=value}}"):
-         {+name{param}}   # enable action and add parameter "param"
-         {-name{param}}   # remove the parameter "param"
-         {-name}          # disable this action totally
-       
-   If nothing is specified in this file, no "actions" are taken. So in
-   this case Privoxy would just be a normal, non-blocking,
-   non-anonymizing proxy. You must specifically enable the privacy and
-   blocking features you need (although the provided default
-   default.action file will give a good starting point).
-   
-   Later defined actions always over-ride earlier ones. For multi-valued
-   actions, the actions are applied in the order they are specified.
-   
-   The list of valid Privoxy "actions" are:
-   
-     * Add the specified HTTP header, which is not checked for validity.
-       You may specify this many times to specify many different headers:
-         +add-header{Name: value}
-       
-     * Block this URL totally. In a default installation, a "blocked" URL
-       will result in bright red banner that says "BLOCKED", with a
-       reason why it is being blocked.
-         +block
-       
-     * De-animate all animated GIF images, i.e. reduce them to their last
-       frame. This will also shrink the images considerably (in bytes,
-       not pixels!). If the option "first" is given, the first frame of
-       the animation is used as the replacement. If "last" is given, the
-       last frame of the animation is used instead, which probably makes
-       more sense for most banner animations, but also has the risk of
-       not showing the entire last frame (if it is only a delta to an
-       earlier frame).
-         +deanimate-gifs{last}
-         +deanimate-gifs{first}
-       
-     * "+downgrade" will downgrade HTTP/1.1 client requests to HTTP/1.0
-       and downgrade the responses as well. Use this action for servers
-       that use HTTP/1.1 protocol features that Privoxy doesn't handle
-       well yet. HTTP/1.1 is only partially implemented. Default is not
-       to downgrade requests.
-         +downgrade
-       
-     * Many sites, like yahoo.com, don't just link to other sites.
-       Instead, they will link to some script on their own server, giving
-       the destination as a parameter, which will then redirect you to
-       the final target. URLs resulting from this scheme typically look
-       like: http://some.place/some_script?http://some.where-else.
-       Sometimes, there are even multiple consecutive redirects encoded
-       in the URL. These redirections via scripts make your web browsing
-       more traceable, since the server from which you follow such a link
-       can see where you go to. Apart from that, valuable bandwidth and
-       time is wasted, while your browser ask the server for one redirect
-       after the other. Plus, it feeds the advertisers.
-       The "+fast-redirects" option enables interception of these
-       requests by Privoxy, who will cut off all but the last valid URL
-       in the request and send a local redirect back to your browser
-       without contacting the remote site.
-         +fast-redirects
-       
-     * Apply the filters in the section_header section of the
-       default.filter file to the site(s). default.filter sections are
-       grouped according to like functionality.
-        +filter{section_header}
-       
-       Filter sections that are pre-defined in the supplied
-       default.filter include:
-       
-   html-annoyances: Get rid of particularly annoying HTML abuse.
-   
-   js-annoyances: Get rid of particularly annoying JavaScript abuse
-   
-   no-poups: Kill all popups in JS and HTML
-   
-   frameset-borders: Give frames a border
-   
-   webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-   
-   no-refresh: Automatic refresh sucks on auto-dialup lines
-   
-   fun: Text replacements for subversive browsing fun!
-   
-   nimda: Remove (virus) Nimda code.
-   
-   banners-by-size: Kill banners by size
-   
-   crude-parental: Kill all web pages that contain the words "sex" or
-   "warez"
-   
-     * Block any existing X-Forwarded-for header, and do not add a new
-       one:
-         +hide-forwarded
-       
-     * If the browser sends a "From:" header containing your e-mail
-       address, this either completely removes the header ("block"), or
-       changes it to the specified e-mail address.
-         +hide-from{block}
-         +hide-from{spam@sittingduck.xqq}
-       
-     * Don't send the "Referer:" (sic) header to the web site. You can
-       block it, forge a URL to the same server as the request (which is
-       preferred because some sites will not send images otherwise) or
-       set it to a constant string of your choice.
-         +hide-referer{block}
-         +hide-referer{forge}
-         +hide-referer{http://nowhere.com}
-       
-     * Alternative spelling of "+hide-referer". It has the same
-       parameters, and can be freely mixed with, "+hide-referer".
-       ("referrer" is the correct English spelling, however the HTTP
-       specification has a bug - it requires it to be spelled "referer".)
-         +hide-referrer{...}
-       
-     * Change the "User-Agent:" header so web servers can't tell your
-       browser type. Warning! This breaks many web sites. Specify the
-       user-agent value you want. Example, pretend to be using Netscape
-       on Linux:
-         +hide-user-agent{Mozilla (X11; I; Linux 2.0.32 i586)}
-       
-     * Treat this URL as an image. This only matters if it's also
-       "+block"ed, in which case a "blocked" image can be sent rather
-       than a HTML page. See "+image-blocker{}" below for the control
-       over what is actually sent. If you want invisible ads, they should
-       be defined as images and blocked. And also, "image-blocker" should
-       be set to "blank".
-         +image
-       
-     * Decides what to do with URLs that end up tagged with "{+block
-       +image}", e.g an advertizement. There are five options.
-       "-image-blocker" will send a HTML "blocked" page, usually
-       resulting in a "broken image" icon. "+image-blocker{blank}" will
-       send a 1x1 transparent GIF image. And finally,
-       "+image-blocker{http://xyz.com}" will send a HTTP temporary
-       redirect to the specified image. This has the advantage of the
-       icon being being cached by the browser, which will speed up the
-       display. "+image-blocker{pattern}" will send a checkboard type
-       pattern
-         +image-blocker{blank}
-         +image-blocker{pattern}
-         +image-blocker{http://p.p/send-banner}
-       
-     * By default (i.e. in the absence of a "+limit-connect" action),
-       Privoxy will only allow CONNECT requests to port 443, which is the
-       standard port for https as a precaution.
-       The CONNECT methods exists in HTTP to allow access to secure
-       websites (https:// URLs) through proxies. It works very simply:
-       the proxy connects to the server on the specified port, and then
-       short-circuits its connections to the client and to the remote
-       proxy. This can be a big security hole, since CONNECT-enabled
-       proxies can be abused as TCP relays very easily.
-       If you want to allow CONNECT for more ports than this, or want to
-       forbid CONNECT altogether, you can specify a comma separated list
-       of ports and port ranges (the latter using dashes, with the
-       minimum defaulting to 0 and max to 65K):
-         +limit-connect{443} # This is the default and need no be
-       specified.
-         +limit-connect{80,443} # Ports 80 and 443 are OK.
-         +limit-connect{-3, 7, 20-100, 500-} # Port less than 3, 7, 20 to
-       100
-          #and above 500 are OK.
-       
-     * "+no-compression" prevents the website from compressing the data.
-       Some websites do this, which can be a problem for Privoxy, since
-       "+filter", "+no-popup" and "+gif-deanimate" will not work on
-       compressed data. This will slow down connections to those
-       websites, though. Default is "nocompression" is turned on.
-         +nocompression
-       
-     * If the website sets cookies, "no-cookies-keep" will make sure they
-       are erased when you exit and restart your web browser. This makes
-       profiling cookies useless, but won't break sites which require
-       cookies so that you can log in for transactions. Default: on.
-         +no-cookies-keep
-       
-     * Prevent the website from reading cookies:
-         +no-cookies-read
-       
-     * Prevent the website from setting cookies:
-         +no-cookies-set
-       
-     * Filter the website through a built-in filter to disable those
-       obnoxious JavaScript pop-up windows via window.open(), etc. The
-       two alternative spellings are equivalent.
-         +no-popup
-         +no-popups
-       
-     * This action only applies if you are using a jarfile for saving
-       cookies. It sends a cookie to every site stating that you do not
-       accept any copyright on cookies sent to you, and asking them not
-       to track you. Of course, this is a (relatively) unique header they
-       could use to track you.
-         +vanilla-wafer
-       
-     * This allows you to add an arbitrary cookie. It can be specified
-       multiple times in order to add as many cookies as you like.
-         +wafer{name=value}
-       
-   The meaning of any of the above is reversed by preceding the action
-   with a "-", in place of the "+".
-   
-   Some examples:
-   
-   Turn off cookies by default, then allow a few through for specified
-   sites:
-   
-    # Turn off all persistent cookies
-    { +no-cookies-read }
-    { +no-cookies-set }
-    # Allow cookies for this browser session ONLY
-    { +no-cookies-keep }
-    # Exceptions to the above, sites that benefit from persistent cookies
-    { -no-cookies-read }
-    { -no-cookies-set }
-    { -no-cookies-keep }
-    .javasoft.com
-    .sun.com
-    .yahoo.com
-    .msdn.microsoft.com
-    .redhat.com
-    # Alternative way of saying the same thing
-    {-no-cookies-set -no-cookies-read -no-cookies-keep}
-    .sourceforge.net
-    .sf.net
-   
-   Now turn off "fast redirects", and then we allow two exceptions:
-   
-    # Turn them off!
-    {+fast-redirects}
-   
-    # Reverse it for these two sites, which don't work right without it.
-    {-fast-redirects}
-    www.ukc.ac.uk/cgi-bin/wac\.cgi\?
-    login.yahoo.com
-   
-   Turn on page filtering according to rules in the defined sections of
-   refilterfile, and make one exception for sourceforge:
-   
-    # Run everything through the filter file, using only the
-    # specified sections:
-    +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}\
-    +filter{webbugs} +filter{nimda} +filter{banners-by-size}
-   
-    # Then disable filtering of code from sourceforge!
-    {-filter}
-    .cvs.sourceforge.net
-   
-   Now some URLs that we want "blocked", ie we won't see them. Many of
-   these use regular expressions that will expand to match multiple URLs:
-   
-     # Blocklist:
-     {+block}
-     /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\.(gif|jpe?g))
-     /.*/(.*[-_.])?count(er)?(\.cgi|\.dll|\.exe|[?/])
-     /.*/(ng)?adclient\.cgi
-     /.*/(plain|live|rotate)[-_.]?ads?/
-     /.*/(sponsor)s?[0-9]?/
-     /.*/_?(plain|live)?ads?(-banners)?/
-     /.*/abanners/
-     /.*/ad(sdna_image|gifs?)/
-     /.*/ad(server|stream|juggler)\.(cgi|pl|dll|exe)
-     /.*/adbanners/
-     /.*/adserver
-     /.*/adstream\.cgi
-     /.*/adv((er)?ts?|ertis(ing|ements?))?/
-     /.*/banner_?ads/
-     /.*/banners?/
-     /.*/banners?\.cgi/
-     /.*/cgi-bin/centralad/getimage
-     /.*/images/addver\.gif
-     /.*/images/marketing/.*\.(gif|jpe?g)
-     /.*/popupads/
-     /.*/siteads/
-     /.*/sponsor.*\.gif
-     /.*/sponsors?[0-9]?/
-     /.*/advert[0-9]+\.jpg
-     /Media/Images/Adds/
-     /ad_images/
-     /adimages/
-     /.*/ads/
-     /bannerfarm/
-     /grafikk/annonse/
-     /graphics/defaultAd/
-     /image\.ng/AdType
-     /image\.ng/transactionID
-     /images/.*/.*_anim\.gif # alvin brattli
-     /ip_img/.*\.(gif|jpe?g)
-     /rotateads/
-     /rotations/
-     /worldnet/ad\.cgi
-     /cgi-bin/nph-adclick.exe/
-     /.*/Image/BannerAdvertising/
-     /.*/ad-bin/
-     /.*/adlib/server\.cgi
-     /autoads/
-   
-   Note that many of these actions have the potential to cause a page to
-   misbehave, possibly even not to display at all. There are many ways a
-   site designer may choose to design his site, and what HTTP header
-   content he may depend on. There is no way to have hard and fast rules
-   for all sites. See the [52]Appendix for a brief example on
-   troubleshooting actions.
-     _________________________________________________________________
-   
-3.4.3. Aliases
-
-   Custom "actions", known to Privoxy as "aliases", can be defined by
-   combining other "actions". These can in turn be invoked just like the
-   built-in "actions". Currently, an alias can contain any character
-   except space, tab, "=", "{" or "}". But please use only "a"- "z",
-   "0"-"9", "+", and "-". Alias names are not case sensitive, and must be
-   defined before anything else in the default.actionfile ! And there can
-   only be one set of "aliases" defined.
-   
-   Now let's define a few aliases:
-   
-    # Useful customer aliases we can use later. These must come first!
-    {{alias}}
-    +no-cookies = +no-cookies-set +no-cookies-read
-    -no-cookies = -no-cookies-set -no-cookies-read
-    fragile     = -block -no-cookies -filter -fast-redirects -hide-refere
-   r -no-popups
-    shop        = -no-cookies -filter -fast-redirects
-    +imageblock = +block +image
-    #For people who don't like to type too much:  ;-)
-    c0 = +no-cookies
-    c1 = -no-cookies
-    c2 = -no-cookies-set +no-cookies-read
-    c3 = +no-cookies-set -no-cookies-read
-    #... etc.  Customize to your heart's content.
-   
-   Some examples using our "shop" and "fragile" aliases from above:
-   
-    # These sites are very complex and require
-    # minimal interference.
-    {fragile}
-    .office.microsoft.com
-    .windowsupdate.microsoft.com
-    .nytimes.com
-    # Shopping sites - still want to block ads.
-    {shop}
-    .quietpc.com
-    .worldpay.com   # for quietpc.com
-    .jungle.com
-    .scan.co.uk
-    # These shops require pop-ups
-    {shop -no-popups}
-    .dabs.com
-    .overclockers.co.uk
-     _________________________________________________________________
-   
-3.5. The Filter File
-
-   Any web page can be dynamically modified with the filter file. This
-   modification can be removal, or re-writing, of any web page content,
-   including tags and non-visible content. The default filter file is
-   default.filter, located in the config directory.
-   
-   The included example file is divided into sections. Each section
-   begins with the FILTER keyword, followed by the identifier for that
-   section, e.g. "FILTER: webbugs". Each section performs a similar type
-   of filtering, such as "html-annoyances".
-   
-   This file uses regular expressions to alter or remove any string in
-   the target page. The expressions can only operate on one line at a
-   time. Some examples from the included default default.filter:
-   
-   Stop web pages from displaying annoying messages in the status bar by
-   deleting such references:
-   
-    FILTER: html-annoyances
-    # New browser windows should be resizeable and have a location and st
-   atus
-    # bar. Make it so.
-    #
-    s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
-    s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
-    s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
-    s/menubar="?(no|0)"?/menubar=1/ig
-    # The <BLINK> tag was a crime!
-    #
-    s*<blink>|</blink>**ig
-    # Is this evil?
-    #
-    #s/framespacing="?(no|0)"?//ig
-    #s/margin(height|width)=[0-9]*//gi
-   
-   Just for kicks, replace any occurrence of "Microsoft" with
-   "MicroSuck", and have a little fun with topical buzzwords:
-   
-    FILTER: fun
-    s/microsoft(?!.com)/MicroSuck/ig
-    # Buzzword Bingo:
-    #
-    s/industry-leading|cutting-edge|award-winning/<font color=red><b>BING
-   O!</b></font>/ig
-   
-   Kill those pesky little web-bugs:
-   
-    # webbugs: Squish WebBugs (1x1 invisible GIFs used for user tracking)
-    FILTER: webbugs
-    s/<img\s+[^>]*?(width|height)\s*=\s*['"]?1\D[^>]*?(width|height)\s*=\
-   s*['"]?1(\D[^>]*?)?>/<!-- Squished WebBug -->/sig
-     _________________________________________________________________
-   
-3.6. Templates
-
-   When Privoxy displays one of its internal pages, such as a 404 Not
-   Found error page, it uses the appropriate template. On Linux, BSD, and
-   Unix, these are located in /etc/privoxy/templates by default. These
-   may be customized, if desired.
-     _________________________________________________________________
-   
-4. Quickstart to Using Privoxy
-
-   Install package, then run and enjoy! Privoxy is typically started by
-   specifying the main configuration file to be used on the command line.
-   Example Unix startup command:
-   
-
- # /usr/sbin/privoxy /etc/privoxy/config
-
-
-   An init script is provided for SuSE and Redhat.
-   
-   For for SuSE: /etc/rc.d/privoxy start
-   
-   For RedHat: /etc/rc.d/init.d/privoxy start
-   
-   If no configuration file is specified on the command line, Privoxy
-   will look for a file named config in the current directory. Except on
-   Win32 where it will try config.txt. If no file is specified on the
-   command line and no default configuration file can be found, Privoxy
-   will fail to start.
-   
-   Be sure your browser is set to use the proxy which is by default at
-   localhost, port 8118. With Netscape (and Mozilla), this can be set
-   under Edit -> Preferences -> Advanced -> Proxies -> HTTP Proxy. For
-   Internet Explorer: Tools > Internet Properties -> Connections -> LAN
-   Setting. Then, check "Use Proxy" and fill in the appropriate info
-   (Address: localhost, Port: 8118). Include if HTTPS proxy support too.
-   
-   The included default configuration files should give a reasonable
-   starting point, though may be somewhat aggressive in blocking junk.
-   You will probably want to keep an eye out for sites that require
-   persistent cookies, and add these to default.action as needed. By
-   default, most of these will be accepted only during the current
-   browser session, until you add them to the configuration. If you want
-   the browser to handle this instead, you will need to edit
-   default.action and disable this feature. If you use more than one
-   browser, it would make more sense to let Privoxy handle this. In which
-   case, the browser(s) should be set to accept all cookies.
-   
-   If a particular site shows problems loading properly, try adding it to
-   the {fragile} section of default.action. This will turn off most
-   actions for this site.
-   
-   Privoxy is HTTP/1.1 compliant, but not all 1.1 features are as yet
-   implemented. If browsers that support HTTP/1.1 (like Mozilla or recent
-   versions of I.E.) experience problems, you might try to force HTTP/1.0
-   compatibility. For Mozilla, look under Edit -> Preferences -> Debug ->
-   Networking. Or set the "+downgrade" config option in default.action.
-   
-   After running Privoxy for a while, you can start to fine tune the
-   configuration to suit your personal, or site, preferences and
-   requirements. There are many, many aspects that can be customized.
-   "Actions" (as specified in default.action) can be adjusted by pointing
-   your browser to [53]http://p.p/, and then follow the link to "edit the
-   actions list". (This is an internal page and does not require Internet
-   access.)
-   
-   In fact, various aspects of Privoxy configuration can be viewed from
-   this page, including current configuration parameters, source code
-   version numbers, the browser's request headers, and "actions" that
-   apply to a given URL. In addition to the default.action file editor
-   mentioned above, Privoxy can also be turned "on" and "off" from this
-   page.
-   
-   If you encounter problems, please verify it is a Privoxy bug, by
-   disabling Privoxy, and then trying the same page. Also, try another
-   browser if possible to eliminate browser or site problems. Before
-   reporting it as a bug, see if there is not a configuration option that
-   is enabled that is causing the page not to load. You can then add an
-   exception for that page or site. If a bug, please report it to the
-   developers (see below).
-     _________________________________________________________________
-   
-4.1. Command Line Options
-
-   Privoxy may be invoked with the following command-line options:
-   
-     * --version
-       Print version info and exit, Unix only.
-     * --help
-       Print a short usage info and exit, Unix only.
-     * --no-daemon
-       Don't become a daemon, i.e. don't fork and become process group
-       leader, don't detach from controlling tty. Unix only.
-     * --pidfile FILE
-       On startup, write the process ID to FILE. Delete the FILE on exit.
-       Failiure to create or delete the FILE is non-fatal. If no FILE
-       option is given, no PID file will be used. Unix only.
-     * --user USER[.GROUP]
-       After (optionally) writing the PID file, assume the user ID of
-       USER, and if included the GID of GROUP. Exit if the privileges are
-       not sufficient to do so. Unix only.
-     * configfile
-       If no configfile is included on the command line, Privoxy will
-       look for a file named "config" in the current directory (except on
-       Win32 where it will look for "config.txt" instead). Specify full
-       path to avoid confusion.
-     _________________________________________________________________
-   
-5. Contacting the Developers, Bug Reporting and Feature Requests
-
-   We value your feedback. However, to provide you with the best support,
-   please note:
-   
-     * Use the [54]Sourceforge support forum to get help.
-     * Submit bugs only thru our [55]Sourceforge bug forum. Make sure
-       that the bug has not already been submitted. Please try to verify
-       that it is a Privoxy bug, and not a browser or site bug first. If
-       you are using your own custom configuration, please try the stock
-       configs to see if the problem is a configuration related bug. And
-       if not using the latest development snapshot, please try the
-       latest one. Or even better, CVS sources.
-     * Submit feature requests only thru our [56]Sourceforge feature
-       request forum.
-       
-   For any other issues, feel free to use the [57]mailing lists.
-   
-   Anyone interested in actively participating in development and related
-   discussions can join the appropriate mailing list [58]here. Archives
-   are available here too.
-     _________________________________________________________________
-   
-6. Copyright and History
-
-6.1. License
-
-   Privoxy is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2 of the License, or (at your
-   option) any later version.
-   
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details, which is available from
-   [59]the Free Software Foundation, Inc, 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.
-     _________________________________________________________________
-   
-6.2. History
-
-   Privoxy is derived from the Internet Junkbuster, with many improvments
-   and enhancements over the original.
-   
-   Junkbuster was originally written by Anonymous Coders and
-   [60]Junkbuster's Corporation, and was released as free open-source
-   software under the GNU GPL. [61]Stefan Waldherr made many
-   improvements, and started the [62]SourceForge project Privoxy to
-   rekindle development. There are now several active developers
-   contributing. The last stable release of Junkbuster was v2.0.2, which
-   has now grown whiskers ;-).
-     _________________________________________________________________
-   
-7. See also
-
-     [63]http://sourceforge.net/projects/ijbswa
-   
-     [64]http://www.privoxy.org/
-   
-     [65]http://p.p/
-   
-     [66]http://www.junkbusters.com/ht/en/cookies.html
-   
-     [67]http://www.waldherr.org/junkbuster/
-   
-     [68]http://privacy.net/analyze/
-   
-    [69]http://www.squid-cache.org/
-     _________________________________________________________________
-   
-8. Appendix
-
-8.1. Regular Expressions
-
-   Privoxy can use "regular expressions" in various config files.
-   Assuming support for "pcre" (Perl Compatible Regular Expressions) is
-   compiled in, which is the default. Such configuration directives do
-   not require regular expressions, but they can be used to increase
-   flexibility by matching a pattern with wild-cards against URLs.
-   
-   If you are reading this, you probably don't understand what "regular
-   expressions" are, or what they can do. So this will be a very brief
-   introduction only. A full explanation would require a book ;-)
-   
-   "Regular expressions" is a way of matching one character expression
-   against another to see if it matches or not. One of the "expressions"
-   is a literal string of readable characters (letter, numbers, etc), and
-   the other is a complex string of literal characters combined with
-   wild-cards, and other special characters, called meta-characters. The
-   "meta-characters" have special meanings and are used to build the
-   complex pattern to be matched against. Perl Compatible Regular
-   Expressions is an enhanced form of the regular expression language
-   with backward compatibility.
-   
-   To make a simple analogy, we do something similar when we use
-   wild-card characters when listing files with the dir command in DOS.
-   *.* matches all filenames. The "special" character here is the
-   asterisk which matches any and all characters. We can be more specific
-   and use ? to match just individual characters. So "dir file?.text"
-   would match "file1.txt", "file2.txt", etc. We are pattern matching,
-   using a similar technique to "regular expressions"!
-   
-   Regular expressions do essentially the same thing, but are much, much
-   more powerful. There are many more "special characters" and ways of
-   building complex patterns however. Let's look at a few of the common
-   ones, and then some examples:
-   
-   . - Matches any single character, e.g. "a", "A", "4", ":", or "@".
-   
-   ? - The preceding character or expression is matched ZERO or ONE
-   times. Either/or.
-   
-   + - The preceding character or expression is matched ONE or MORE
-   times.
-   
-   * - The preceding character or expression is matched ZERO or MORE
-   times.
-   
-   \ - The "escape" character denotes that the following character should
-   be taken literally. This is used where one of the special characters
-   (e.g. ".") needs to be taken literally and not as a special
-   meta-character.
-   
-   [] - Characters enclosed in brackets will be matched if any of the
-   enclosed characters are encountered.
-   
-   () - parentheses are used to group a sub-expression, or multiple
-   sub-expressions.
-   
-   | - The "bar" character works like an "or" conditional statement. A
-   match is successful if the sub-expression on either side of "|"
-   matches.
-   
-   s/string1/string2/g - This is used to rewrite strings of text.
-   "string1" is replaced by "string2" in this example.
-   
-   These are just some of the ones you are likely to use when matching
-   URLs with Privoxy, and is a long way from a definitive list. This is
-   enough to get us started with a few simple examples which may be more
-   illuminating:
-   
-   /.*/banners/.* - A simple example that uses the common combination of
-   "." and "*" to denote any character, zero or more times. In other
-   words, any string at all. So we start with a literal forward slash,
-   then our regular expression pattern (".*") another literal forward
-   slash, the string "banners", another forward slash, and lastly another
-   ".*". We are building a directory path here. This will match any file
-   with the path that has a directory named "banners" in it. The ".*"
-   matches any characters, and this could conceivably be more forward
-   slashes, so it might expand into a much longer looking path. For
-   example, this could match:
-   "/eye/hate/spammers/banners/annoy_me_please.gif", or just
-   "/banners/annoying.html", or almost an infinite number of other
-   possible combinations, just so it has "banners" in the path somewhere.
-   
-   A now something a little more complex:
-   
-   /.*/adv((er)?ts?|ertis(ing|ements?))?/ - We have several literal
-   forward slashes again ("/"), so we are building another expression
-   that is a file path statement. We have another ".*", so we are
-   matching against any conceivable sub-path, just so it matches our
-   expression. The only true literal that must match our pattern is adv,
-   together with the forward slashes. What comes after the "adv" string
-   is the interesting part.
-   
-   Remember the "?" means the preceding expression (either a literal
-   character or anything grouped with "(...)" in this case) can exist or
-   not, since this means either zero or one match. So
-   "((er)?ts?|ertis(ing|ements?))" is optional, as are the individual
-   sub-expressions: "(er)", "(ing|ements?)", and the "s". The "|" means
-   "or". We have two of those. For instance, "(ing|ements?)", can expand
-   to match either "ing" OR "ements?". What is being done here, is an
-   attempt at matching as many variations of "advertisement", and
-   similar, as possible. So this would expand to match just "adv", or
-   "advert", or "adverts", or "advertising", or "advertisement", or
-   "advertisements". You get the idea. But it would not match
-   "advertizements" (with a "z"). We could fix that by changing our
-   regular expression to: "/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/",
-   which would then match either spelling.
-   
-   /.*/advert[0-9]+\.(gif|jpe?g) - Again another path statement with
-   forward slashes. Anything in the square brackets "[]" can be matched.
-   This is using "0-9" as a shorthand expression to mean any digit one
-   through nine. It is the same as saying "0123456789". So any digit
-   matches. The "+" means one or more of the preceding expression must be
-   included. The preceding expression here is what is in the square
-   brackets -- in this case, any digit one through nine. Then, at the
-   end, we have a grouping: "(gif|jpe?g)". This includes a "|", so this
-   needs to match the expression on either side of that bar character
-   also. A simple "gif" on one side, and the other side will in turn
-   match either "jpeg" or "jpg", since the "?" means the letter "e" is
-   optional and can be matched once or not at all. So we are building an
-   expression here to match image GIF or JPEG type image file. It must
-   include the literal string "advert", then one or more digits, and a
-   "." (which is now a literal, and not a special character, since it is
-   escaped with "\"), and lastly either "gif", or "jpeg", or "jpg". Some
-   possible matches would include: "//advert1.jpg",
-   "/nasty/ads/advert1234.gif", "/banners/from/hell/advert99.jpg". It
-   would not match "advert1.gif" (no leading slash), or "/adverts232.jpg"
-   (the expression does not include an "s"), or "/advert1.jsp" ("jsp" is
-   not in the expression anywhere).
-   
-   s/microsoft(?!.com)/MicroSuck/i - This is a substitution. "MicroSuck"
-   will replace any occurrence of "microsoft". The "i" at the end of the
-   expression means ignore case. The "(?!.com)" means the match should
-   fail if "microsoft" is followed by ".com". In other words, this acts
-   like a "NOT" modifier. In case this is a hyperlink, we don't want to
-   break it ;-).
-   
-   We are barely scratching the surface of regular expressions here so
-   that you can understand the default Privoxy configuration files, and
-   maybe use this knowledge to customize your own installation. There is
-   much, much more that can be done with regular expressions. Now that
-   you know enough to get started, you can learn more on your own :/
-   
-   More reading on Perl Compatible Regular expressions:
-   [70]http://www.perldoc.com/perl5.6/pod/perlre.html
-     _________________________________________________________________
-   
-8.2. Privoxy's Internal Pages
-
-   Since Privoxy proxies each requested web page, it is easy for Privoxy
-   to trap certain URLs. In this way, we can talk directly to Privoxy,
-   and see how it is configured, see how our rules are being applied,
-   change these rules and other configuration options, and even turn
-   Privoxy's filtering off, all with a web browser.
-   
-   The URLs listed below are the special ones that allow direct access to
-   Privoxy. Of course, Privoxy must be running to access these. If not,
-   you will get a friendly error message. Internet access is not
-   necessary either.
-   
-     * Privoxy main page:
-       
-     [71]http://www.privoxy.org/config/
-       Alternately, this may be reached at [72]http://p.p/, but this
-       variation may not work as reliably as the above in some
-       configurations.
-     * Show information about the current configuration:
-       
-     [73]http://www.privoxy.org/config/show-status
-     * Show the source code version numbers:
-       
-     [74]http://www.privoxy.org/config/show-version
-     * Show the client's request headers:
-       
-     [75]http://www.privoxy.org/config/show-request
-     * Show which actions apply to a URL and why:
-       
-     [76]http://www.privoxy.org/config/show-url-info
-     * Toggle Privoxy on or off:
-       
-     [77]http://www.privoxy.org/config/toggle
-       Short cuts. Turn off, then on:
-       
-     [78]http://www.privoxy.org/config/toggle?set=disable
-       
-     [79]http://www.privoxy.org/config/toggle?set=enable
-     * Edit the actions list file:
-       
-     [80]http://www.privoxy.org/config/edit-actions
-       
-   These may be bookmarked for quick reference.
-     _________________________________________________________________
-   
-8.3. Anatomy of an Action
-
-   The way Privoxy applies "actions" to any given URL can be complex, and
-   not always so easy to understand what is happening. And sometimes we
-   need to be able to see just what Privoxy is doing. Especially, if
-   something Privoxy is doing is causing us a problem inadvertantly. It
-   can be a little daunting to look at the actions files themselves,
-   since they tend to be filled with "regular expressions" whose
-   consequences are not always so obvious. Privoxy provides the
-   [81]http://www.privoxy.org/config/show-url-info page that can show us
-   very specifically how actions are being applied to any given URL. This
-   is a big help for troubleshooting.
-   
-   First, enter one URL (or partial URL) at the prompt, and then Privoxy
-   will tell us how the current configuration will handle it. This will
-   not help with filtering effects from the default.filter file! It also
-   will not tell you about any other URLs that may be embedded within the
-   URL you are testing. For instance, images such as ads are expressed as
-   URLs within the raw page source of HTML pages. So you will only get
-   info for the actual URL that is pasted into the prompt area -- not any
-   sub-URLs. If you want to know about embedded URLs like ads, you will
-   have to dig those out of the HTML source. Use your browser's "View
-   Page Source" option for this.
-   
-   Let's look at an example, [82]google.com, one section at a time:
-   
- System default actions:
-
- { -add-header -block -deanimate-gifs -downgrade -fast-redirects -filter
-   -hide-forwarded -hide-from -hide-referer -hide-user-agent -image
-   -image-blocker -limit-connect -no-compression -no-cookies-keep
-   -no-cookies-read -no-cookies-set -no-popups -vanilla-wafer -wafer }
-
-
-   This is the top section, and only tells us of the compiled in
-   defaults. This is basically what Privoxy would do if there were not
-   any "actions" defined, i.e. it does nothing. Every action is disabled.
-   This is not particularly informative for our purposes here. OK, next
-   section:
-   
- Matches for http://google.com:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
-   -hide-user-agent -image +image-blocker{blank} +no-compression
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups
-   -vanilla-wafer -wafer }
-   /
-
- { -no-cookies-keep -no-cookies-read -no-cookies-set }
-  .google.com
-
- { -fast-redirects }
-  .google.com
-
-
-   This is much more informative, and tells us how we have defined our
-   "actions", and which ones match for our example, "google.com". The
-   first grouping shows our default settings, which would apply to all
-   URLs. If you look at your "actions" file, this would be the section
-   just below the "aliases" section near the top. This applies to all
-   URLs as signified by the single forward slash -- "/".
-   
-   These are the default actions we have enabled. But we can define
-   additional actions that would be exceptions to these general rules,
-   and then list specific URLs that these exceptions would apply to. Last
-   match wins. Just below this then are two explict matches for
-   ".google.com". The first is negating our various cookie blocking
-   actions (i.e. we will allow cookies here). The second is allowing
-   "fast-redirects". Note that there is a leading dot here --
-   ".google.com". This will match any hosts and sub-domains, in the
-   google.com domain also, such as "www.google.com". So, apparently, we
-   have these actions defined somewhere in the lower part of our actions
-   file, and "google.com" is referenced in these sections.
-   
-   And now we pull it altogether in the bottom section and summarize how
-   Privoxy is appying all its "actions" to "google.com":
-   
- Final results:
-
- -add-header -block -deanimate-gifs -downgrade -fast-redirects
- +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
- +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
- +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
- -hide-user-agent -image +image-blocker{blank} -limit-connect +no-compression
- -no-cookies-keep -no-cookies-read -no-cookies-set +no-popups -vanilla-wafer
- -wafer
-
-
-   Now another example, "ad.doubleclick.net":
-   
- { +block +image }
-  .ad.doubleclick.net
-
- { +block +image }
-  ad*.
-
- { +block +image }
-  .doubleclick.net
-
-
-   We'll just show the interesting part here, the explicit matches. It is
-   matched three different times. Each as an "+block +image", which is
-   the expanded form of one of our aliases that had been defined as:
-   "+imageblock". ("Aliases" are defined in the first section of the
-   actions file and typically used to combine more than one action.)
-   
-   Any one of these would have done the trick and blocked this as an
-   unwanted image. This is unnecessarily redundant since the last case
-   effectively would also cover the first. No point in taking chances
-   with these guys though ;-) Note that if you want an ad or obnoxious
-   URL to be invisible, it should be defined as "ad.doubleclick.net" is
-   done here -- as both a "+block" and an "+image". The custom alias
-   "+imageblock" does this for us.
-   
-   One last example. Let's try "http://www.rhapsodyk.net/adsl/HOWTO/".
-   This one is giving us problems. We are getting a blank page. Hmmm...
-   
- Matches for http://www.rhapsodyk.net/adsl/HOWTO/:
-
- { -add-header -block +deanimate-gifs -downgrade +fast-redirects
-   +filter{html-annoyances} +filter{js-annoyances} +filter{no-popups}
-   +filter{webbugs} +filter{nimda} +filter{banners-by-size} +filter{hal}
-   +filter{fun} +hide-forwarded +hide-from{block} +hide-referer{forge}
-   -hide-user-agent -image +image-blocker{blank} +no-compression
-   +no-cookies-keep -no-cookies-read -no-cookies-set +no-popups
-   -vanilla-wafer -wafer }
-   /
-
- { +block +image }
-  /ads
-
-
-   Ooops, the "/adsl/" is matching "/ads"! But we did not want this at
-   all! Now we see why we get the blank page. We could now add a new
-   action below this that explictly does not block (-block) pages with
-   "adsl". There are various ways to handle such exceptions. Example:
-   
- { -block }
-  /adsl
-
-
-   Now the page displays ;-)
-   
-   But now what about a situation where we get no explicit matches like
-   we did with:
-   
- { -block }
-  /adsl
-
-
-   That actually was very telling and pointed us quickly to where the
-   problem was. If you don't get this kind of match, then it means one of
-   the default rules in the first section is causing the problem. This
-   would require some guesswork, and maybe a little trial and error to
-   isolate the offending rule. One likely cause would be one of the
-   "{+filter}" actions. Try adding the URL for the site to one of aliases
-   that turn off "+filter":
-   
- {shop}
- .quietpc.com
- .worldpay.com   # for quietpc.com
- .jungle.com
- .scan.co.uk
- .forbes.com
-
-
-   "{shop}" is an "alias" that expands to "{ -filter -no-cookies
-   -no-cookies-keep }". Or you could do your own exception to negate
-   filtering:
-   
- {-filter}
- .forbes.com
-
-References
-
-   Visible links
-   1. http://www.privoxy.org/user-manual/
-   2. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INTRODUCTION
-   3. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN35
-   4. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION
-   5. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SOURCE
-   6. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-RH
-   7. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-SUSE
-   8. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OS2
-   9. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-WIN
-  10. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#INSTALLATION-OTHER
-  11. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONFIGURATION
-  12. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN154
-  13. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN172
-  14. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN203
-  15. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN236
-  16. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN329
-  17. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN466
-  18. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FORWARDING
-  19. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN663
-  20. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE
-  21. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN762
-  22. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN836
-  23. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1153
-  24. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#FILTERFILE
-  25. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1212
-  26. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#QUICKSTART
-  27. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1268
-  28. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#CONTACT
-  29. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#COPYRIGHT
-  30. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1327
-  31. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1333
-  32. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#SEEALSO
-  33. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#APPENDIX
-  34. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX
-  35. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1521
-  36. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT
-  37. http://p.p/
-  38. http://sourceforge.net/projects/ijbswa/
-  39. http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/
-  40. http://www.gnu.org/
-  41. http://p.p/
-  42. http://www.privoxy.org/config/
-  43. http://p.p/
-  44. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSFILE
-  45. http://p.p/
-  46. http://p.p/
-  47. http://p.p/
-  48. http://p.p/
-  49. http://p.p/show-url-info
-  50. http://www.perldoc.com/perl5.6/pod/perlre.html
-  51. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#REGEX
-  52. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#ACTIONSANAT
-  53. http://p.p/
-  54. http://sourceforge.net/tracker/?group_id=11118&atid=211118
-  55. http://sourceforge.net/tracker/?group_id=11118&atid=111118
-  56. http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse
-  57. http://sourceforge.net/mail/?group_id=11118
-  58. http://sourceforge.net/mail/?group_id=11118
-  59. http://www.gnu.org/copyleft/gpl.html
-  60. http://www.junkbusters.com/
-  61. http://www.waldherr.org/junkbuster/
-  62. http://sourceforge.net/projects/ijbswa/
-  63. http://sourceforge.net/projects/ijbswa
-  64. http://www.privoxy.org/
-  65. http://p.p/
-  66. http://www.junkbusters.com/ht/en/cookies.html
-  67. http://www.waldherr.org/junkbuster/
-  68. http://privacy.net/analyze/
-  69. http://www.squid-cache.org/
-  70. http://www.perldoc.com/perl5.6/pod/perlre.html
-  71. http://www.privoxy.org/config/
-  72. http://p.p/
-  73. http://www.privoxy.org/config/show-status
-  74. http://www.privoxy.org/config/show-version
-  75. http://www.privoxy.org/config/show-request
-  76. http://www.privoxy.org/config/show-url-info
-  77. http://www.privoxy.org/config/toggle
-  78. http://www.privoxy.org/config/toggle?set=disable
-  79. http://www.privoxy.org/config/toggle?set=enable
-  80. http://www.privoxy.org/config/edit-actions
-  81. http://www.privoxy.org/config/show-url-info
-  82. http://google.com/
-
-   Hidden links:
-  83. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1393
-  84. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1401
-  85. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1404
-  86. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1407
-  87. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1410
-  88. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1415
-  89. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1418
-  90. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1421
-  91. file://localhost/home/swa/sf/current-org/doc/source/tmp.html#AEN1427
similarity index 100%
rename from doc/obsolete/top.gif
rename to doc/top.gif
diff --git a/doc/webserver/.gitignore b/doc/webserver/.gitignore
deleted file mode 100644 (file)
index 7184d63..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-developer-manual
-faq
-user-manual
-man-page
\ No newline at end of file
diff --git a/doc/webserver/.htaccess b/doc/webserver/.htaccess
deleted file mode 100644 (file)
index 0ecf688..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# http://privoxy.org/.htaccess
-#
-# By Jon Foster
-#
-# Intercepts requests for these servers:
-#    http://ijbswa.sourceforge.net/
-#    http://privoxy.com/
-#    http://www.privoxy.com/
-#    http://www.privoxy.org/
-#
-# And redirects all requests to the canonical web server:
-#    http://privoxy.org/
-#
-#
-# Uses Apache's mod_rewrite
-# See http://httpd.apache.org/docs/mod/mod_rewrite.html
-#
-
-# Enable mod_rewrite
-RewriteEngine on
-
-
-RewriteCond %{HTTP_HOST}   !^privoxy\.org\.?$ [NC]
-RewriteCond %{HTTP_HOST}   !^$
-RewriteRule ^(.*)$         http://privoxy.org/$1 [R,L]
-
index 4221e3a..60680f9 100644 (file)
@@ -3,7 +3,6 @@ on the project's homepage
 
    ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
 
-which is indeed http://ijbswa.sourceforge.net 
-and http://www.privoxy.org/.
+which is indeed http://ijbswa.sourceforge.net.
 
--Stefan, April 2002
\ No newline at end of file
+-Stefan, June 2001
\ No newline at end of file
diff --git a/doc/webserver/config/.htaccess b/doc/webserver/config/.htaccess
deleted file mode 100644 (file)
index 0a2bfbf..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# http://ijbswa.sourceforge.net/config/.htaccess
-#
-# By Jon Foster
-#
-# Redirects any request for any file in this directory tree
-# to an error page.  The error page is reached through the
-# URL http://privoxy.org/config/ and is actually in
-# the file index.php
-#
-# Uses Apache's mod_rewrite
-# See http://httpd.apache.org/docs/mod/mod_rewrite.html
-#
-
-# Enable mod_rewrite
-RewriteEngine on
-
-# we are reached via /config/ prefix
-RewriteBase   /config/
-
-# The only file which really exists is index.php - allow this
-RewriteCond %{HTTP_HOST}   ^privoxy\.org\.?$ [NC,OR]
-RewriteCond %{HTTP_HOST}   ^$
-RewriteRule  index.php - [L]
-
-# Silently redirect the config dir to index.php
-RewriteCond %{HTTP_HOST}   ^privoxy\.org\.?$ [NC,OR]
-RewriteCond %{HTTP_HOST}   ^$
-RewriteRule  ^$      index.php [L]
-
-# anything else gets redirected to the config dir, and we update
-# the browser's location bar.
-RewriteRule  ^(.*)$  http://privoxy.org/config/  [R,L]
-
-
diff --git a/doc/webserver/config/index.php b/doc/webserver/config/index.php
deleted file mode 100644 (file)
index 38f5976..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
-<html><head>
-<title>Privoxy not running</title>
-</head>
-
-<body>
-
-<h1>Privoxy isn't working</h1>
-
-<p>If you were redirected to this page, it means that you aren't using
-<a href="http://privoxy.org/">Privoxy</a>. &nbsp; Please check your browser settings.</p>
-
-<p>Junkbuster 2.9.x was renamed Privoxy.  If you recently upgraded, then
-the web-based interface has moved - it is now at <a href="http://config.privoxy.org/">http://config.privoxy.org/</a>
-(Short form: <a href="http://ijbswa.sourceforge.net/config/">p.p</a> [Privoxy Proxy]).</p>
-
-<p><a href="http://privoxy.org/">Privoxy home page</a></p>
-
-</body>
-</html>
-
diff --git a/doc/webserver/default_page.php b/doc/webserver/default_page.php
deleted file mode 100644 (file)
index 75a4fdc..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-// Default Web Page for groups that haven't setup their page yet
-// Please replace this file with your own website
-//
-// $Id: default_page.php,v 1.2 2000/01/07 18:11:56 precision Exp $
-//
-$headers = getallheaders();
-?>
-<HTML>
-<HEAD>
-<TITLE>SourceForge: Welcome</TITLE>
-<LINK rel="stylesheet" href="http://sourceforge.net/sourceforge.css" type="text/css">
-</HEAD>
-
-<BODY bgcolor=#FFFFFF topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" marginheight="0" marginwidth="0">
-
-<!-- top strip -->
-<TABLE width="100%" border=0 cellspacing=0 cellpadding=2 bgcolor="737b9c">
-  <TR>
-    <TD><SPAN class=maintitlebar>&nbsp;&nbsp;
-      <A class=maintitlebar href="http://sourceforge.net/"><B>Home</B></A> | 
-      <A class=maintitlebar href="http://sourceforge.net/about.php"><B>About</B></A> | 
-      <A class=maintitlebar href="http://sourceforge.net/partners.php"><B>Partners</B></a> |
-      <A class=maintitlebar href="http://sourceforge.net/contact.php"><B>Contact Us</B></A></SPAN></TD>
-    </TD>
-  </TR>
-</TABLE>
-<!-- end top strip -->
-
-<!-- top title table -->
-<TABLE width="100%" border=0 cellspacing=0 cellpadding=0 bgcolor="" valign="center">
-  <TR valign="top" bgcolor="#eeeef8">
-    <TD>
-      <A href="http://sourceforge.net/"><IMG src="http://sourceforge.net/images/sflogo2-steel.png" vspace="0" border=0 width="143" height="70"></A>
-    </TD>
-    <TD width="99%"><!-- right of logo -->
-      <a href="http://www.valinux.com"><IMG src="http://sourceforge.net/images/valogo3.png" align="right" alt="VA Linux Systems" hspace="5" vspace="0" border=0 width="117" height="70"></A>
-    </TD><!-- right of logo -->
-  </TR>
-  <TR><TD bgcolor="#543a48" colspan=2><IMG src="http://sourceforge.net/images/blank.gif" height=2 vspace=0></TD></TR>
-</TABLE>
-<!-- end top title table -->
-
-<!-- center table -->
-<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="#FFFFFF" align="center">
-  <TR>
-    <TD>
-      <CENTER><BR>
-      <H1>Welcome to http://<?php print $headers[Host]; ?>/</H1>
-      <P>We're Sorry but this Project hasn't yet uploaded their personal webpage yet.<BR>
-      Please check back soon for updates or visit <A href="http://sourceforge.net/">SourceForge</A></P><BR>
-      </CENTER>
-    </TD>
-  </TR>
-</TABLE>
-<!-- end center table -->
-
-<!-- footer table -->
-<TABLE width="100%" border="0" cellspacing="0" cellpadding="2" bgcolor="737b9c">
-  <TR>
-    <TD align="center"><FONT color="#ffffff"><SPAN class="titlebar">
-      All trademarks and copyrights on this page are properties of their respective owners. Forum comments are owned by the poster. The rest is copyright Â©1999-2000 VA Linux Systems, Inc.</SPAN></FONT>
-    </TD>
-  </TR>
-</TABLE>
-
-<!-- end footer table -->
-</BODY>
-</HTML>
diff --git a/doc/webserver/developer-manual.html b/doc/webserver/developer-manual.html
new file mode 100644 (file)
index 0000000..2a74cd1
--- /dev/null
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/developer-manual.html,v $
+
+ Purpose     :  Developer Manual
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: developer-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Developer Manual</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>How to quickly dive into Junkbuster Development:</h1>
+<p>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:49 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: developer-manual.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/documentation-guidelines.html b/doc/webserver/documentation-guidelines.html
new file mode 100644 (file)
index 0000000..f6a23fe
--- /dev/null
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/documentation-guidelines.html,v $
+
+ Purpose     :  Gives direction on writing documentation.
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: documentation-guidelines.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Documentation Guidelines</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Documentation guideline:</h1>
+<p>
+All docs should be ...
+<ul>
+  <li>in a format that is widely used. I propose HTML.
+  <li>we either
+      <ul>
+       <li>generate man pages from the documentation (let's _NOT_ write them manually), or 
+       <li>we have a man page that points to the documentation (I propose
+           this option)
+      </ul>
+  <li>have a consistent layout
+  <li>have a link to the latest version of the document (i.e. point to a URL at sf)
+  <li>be consistent with the redirect script (i.e. the junkbuster program
+      points via the redirect URL at sf to valid end-points in the document)
+  <li>started from scratch but recycle parts from the original junkbuster documents
+</ul>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:48 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: documentation-guidelines.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/faq.html b/doc/webserver/faq.html
new file mode 100644 (file)
index 0000000..a97c036
--- /dev/null
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/faq.html,v $
+
+ Purpose     :  FAQ
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: faq.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|FAQ</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Questions</h1>
+
+<p>
+
+Please read the <a href="http://www.junkbusters.com/ht/en/ijbfaq.html">Junkbuster FAQ</a> at <a href="http://www.junkbusters.com">Junkbuster Corp.</a> and some other docs first.
+
+<h2>Installation</h2>
+<h2>Mail accounts</h2>
+<p>
+<a href="#yahoo">How can I make my Yahoo account work?</a>
+<p>
+<a href="#hotmail">How can I make my Hotmail account work?</a>
+<p>
+<a href="#gmx">How can I make my GMX account work?</a>
+<h2>Misc</h2>
+<p>
+<a href="#ip">How can I hide my IP address?</a>
+<p>
+<a href="#image">What is the imagefile (simage.ini, etc.) for?</a>
+<h2>Removal</h2>
+
+<h1>Answers</h1>
+
+<h3><a name="yahoo"></a>How can I make my Yahoo account work?</h3>
+<p>
+to be filled
+</p>
+
+<h3><a name="hotmail"></a>How can I make my Hotmail account work?</h3>
+<p>
+to be filled
+</p>
+
+<h3><a name="gmx"></a>How can I make my GMX account work?</h3>
+<p>
+to be filled
+
+<h3><a name="ip"></a>How can I hide my IP address?</h3>
+<p>
+You cannot hide your IP address with Junkbuster.
+
+<h3><a name="image"></a>What is the imagefile (simage.ini, etc.) for?</h3>
+<p>
+Anytime the Junkbuster determines (with the help of the blocklist) that a URL
+contains an advertisement, it has to decide whether this advertisement is an
+image or not. The Junkbuster uses the imagefile for that purpose..
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:47 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+$Log: faq.html,v $
+Revision 1.1  2001/06/13 14:20:37  swa
+first import of project's documentation for the webserver.
+
+-->
+</html>
index e3bf729..00bf0b7 100644 (file)
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
 <!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/user-manual.html,v $
 
-  File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/index.html,v $
+ Purpose     :  Index file of the project's homepage
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: user-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
 
-  Purpose     :  Index file of the project's homepage
-                 This file belongs in
-                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
-
-  $Id: index.html,v 1.13 2002/03/26 22:29:56 swa Exp $
-
-  Written by and Copyright (C) 2001 the SourceForge
-  Privoxy team. http://www.privoxy.org/
-
-  Based on the Internet Junkbuster originally written
-  by and Copyright (C) 1997 Anonymous Coders and
-  Junkbusters Corporation.  http://www.junkbusters.com
-
-  This program is free software; you can redistribute it
-  and/or modify it under the terms of the GNU General
-  Public License as published by the Free Software
-  Foundation; either version 2 of the License, or (at
-  your option) any later version.
-
-  This program is distributed in the hope that it will
-  be useful, but WITHOUT ANY WARRANTY; without even the
-  implied warranty of MERCHANTABILITY or FITNESS FOR A
-  PARTICULAR PURPOSE.  See the GNU General Public
-  License for more details.
-
-  The GNU General Public License should be included with
-  this file.  If not, you can view it at
-  http://www.gnu.org/copyleft/gpl.html
-  or write to the Free Software Foundation, Inc., 59
-  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
 
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
 -->
 
-<html>
-  <head>
-    <title>Privoxy|Project Homepage</title>
-    <link rel="stylesheet" type="text/css" href="p_web.css">
-    <meta name="description" content="Privoxy helps consumers reduce unwanted junk email and protect their privacy from direct marketing companies.">
-    <meta name="keywords" content="stop, junk, privoxy, ad, advertisement, werbung, busters, junkbusters, junkbuster, mail, email, e-mail, direct, spam, spamoff, declare, telemarketing, telemarketers, privacy, sharing, names, renting, direct, marketing, database, databases, junk mail, lists, environment, conservation, recycling, catalogs, consumer, sending, opt out ">
-    <meta name="MSSmartTagsPreventParsing" content="TRUE">
-  </head>
-
-  <body>
+<head>
+<title>Junkbuster|Project Homepage</title>
+<link rel=stylesheet type="text/css" href="swa.css">
 
-<h1>Privoxy</h1>
+<meta http-equiv="refresh" content="5; URL=http://www.waldherr.org/junkbuster/">
 
-<p>Privoxy is a web proxy with advanced filtering capabilities
-for protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other obnoxious
-Internet junk. Privoxy has a very flexible configuration and can be
-customized to suit individual needs and tastes. Privoxy has
-application for both stand-alone systems and multi-user networks.</p>
+</head>
 
-<p>Privoxy is based on the code of the Internet Junkbuster. Junkbuster was
-originally written by <a href=
-    "http://www.junkbusters.com/ht/en/ijbfaq.html">JunkBusters
-    Corporation</a>, and was released as free open-source software
-    under the <a href="http://www.gnu.org/">GNU</a> <a href=
-    "http://www.gnu.org/licenses/gpl.html">GPL</a>. <a href=
-    "http://www.waldherr.org/junkbuster/">Stefan Waldherr</a> made
-    many improvements, and started the <a href=
-    "http://sourceforge.net/projects/ijbswa/">SourceForge
-    project</a> to continue development.</p>
+<body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
 
-<h2>More infos ...</h2>
+<body>
 <p>
-<ul>
-  <li>The <a href="http://sourceforge.net/projects/ijbswa/">
-      project page</a> on <a href="http://sourceforge.net/">
-      Sourceforge</a></li>
-  <li><a href="http://www.waldherr.org/junkbuster/">Stefan Waldherr's
-      site</a></li>
-  <li><a href="http://www.junkbusters.com/ht/en/ijbfaq.html">JunkBusters
-      Corporation</a></li>
-</ul>
-
-<h2>Download</h2>
-<p>
-<ul>
-  <li><a href=
-      "http://sourceforge.net/project/showfiles.php?group_id=11118">Download</a> recent releases</li>
-  <li>Browse the <a href=
-      "http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/ijbswa/current/">
-      CVS repository</a></li>
-</ul>
-
-<h2>Documentation</h2>
-<p>
-<ul>
-  <li><a href="user-manual/">User manual</a></li>
-  <li><a href="developer-manual/">Developer manual</a></li>
-  <li><a href="faq/">Frequently Asked Questions</a></li>
-  <li><a href="man-page/privoxy-man-page.html">Classic man page</a></li>
-</ul>
-
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-
-<br>
+<br><br>
 <br>
 <br>
 
 <center>
-<a href="http://sourceforge.net/projects/ijbswa/"><img src=
-"http://sourceforge.net/sflogo.php?group_id=11118&amp;type=1"
-width="88" height="31" border="0" alt="SourceForge Logo"></a>
+You will be <a href="http://www.waldherr.org/junkbuster/">redirected</a> in a couple of moments. This page will soon have more content.
 </center>
 
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:46 CEST 2001
+<!-- hhmts end -->
 </body>
-</html>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: user-manual.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
 
+-->
+</html>
diff --git a/doc/webserver/p_doc.css b/doc/webserver/p_doc.css
deleted file mode 100644 (file)
index 8eb2159..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-hr { width: 95% }
-body { background: #EEEEEE; }
-h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif }
-code { color: green }
-pre { margin-left: 2% }
-# p { margin-left:20px }
-body { margin-left:20px }
-h1 { color: #404; font-size: 175%; margin-left:0px }
-h2 { color: #606; margin-left:0px }
-h3, h4 { color: #806; margin-left:0px }
-ul { list-style-type: square }
diff --git a/doc/webserver/p_web.css b/doc/webserver/p_web.css
deleted file mode 100644 (file)
index 8eb2159..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-hr { width: 95% }
-body { background: #EEEEEE; }
-h1, h2, h3, h4 { font-family: arial, helvetica, sans-serif }
-code { color: green }
-pre { margin-left: 2% }
-# p { margin-left:20px }
-body { margin-left:20px }
-h1 { color: #404; font-size: 175%; margin-left:0px }
-h2 { color: #606; margin-left:0px }
-h3, h4 { color: #806; margin-left:0px }
-ul { list-style-type: square }
index a85b2c6..70d7e0b 100755 (executable)
@@ -1,11 +1,21 @@
-<?php
+M<?php
 
 error_reporting(E_ALL);
 
-// redirect.php
+// File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
 //
-// Copyright (C) 2001 The SourceForge ijbswa team.
-// May be used under the GNU GPL, version 2 or later.
+// Purpose     :  redirects requests to a specific paragraph in the online docs
+//                This file belongs into
+//                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+//                
+// $Id: Makefile.in,v 1.12 2001/06/12 17:15:56 swa Exp $
+//
+// Written by and Copyright (C) 2001 the SourceForge
+// IJBSWA team.  http://ijbswa.sourceforge.net
+//
+// Based on the Internet Junkbuster originally written
+// by and Copyright (C) 1997 Anonymous Coders and 
+// Junkbusters Corporation.  http://www.junkbusters.com
 
 
 // Parse the v= and to= paramaters
@@ -71,7 +81,7 @@ parse_parameters();
 
 
 // Please do NOT delete any of these redirects.  Even if you take them
-// out of Privoxy, they may be in use by older releases.
+// out of JunkBuster, they may be in use by older releases.
 
 // Note 2: Should *not* include #target part in these URLs.
 // (It works with MS IE, but is not valid HTTP.)
@@ -107,3 +117,25 @@ switch($to)
 
 exit;
 ?>
+
+// This program is free software; you can redistribute it 
+// and/or modify it under the terms of the GNU General
+// Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at
+// your option) any later version.
+//
+// This program is distributed in the hope that it will
+// be useful, but WITHOUT ANY WARRANTY; without even the
+// implied warranty of MERCHANTABILITY or FITNESS FOR A
+// PARTICULAR PURPOSE.  See the GNU General Public
+// License for more details.
+//
+// The GNU General Public License should be included with
+// this file.  If not, you can view it at
+// http://www.gnu.org/copyleft/gpl.html
+// or write to the Free Software Foundation, Inc., 59
+// Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+//
+// $Log: Makefile.in,v $
+//
diff --git a/doc/webserver/robots.txt b/doc/webserver/robots.txt
deleted file mode 100644 (file)
index 790f3ff..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-# This is the Internet Junkbuster web site.
-#
-# If the robot is connecting through a JunkBuster, then the
-# control interface is at /config.   It isn't very useful
-# to index it, and you're likely to break stuff.  So go away!
-#
-# Even if you're not connected through a JunkBuster, the 
-# one "JunkBuster's not working" page there is not very
-# interesting.
-
-User-agent: *
-Disallow: /config/
-
-
-
diff --git a/doc/webserver/swa.css b/doc/webserver/swa.css
new file mode 100644 (file)
index 0000000..22489e5
--- /dev/null
@@ -0,0 +1,9 @@
+body { margin-left:0px; margin-right:0px; margin-top:0px; margin-bottom:0px;}
+h1 { margin-left:20px; font-family:Helvetica,Arial; font-size:18pt;}
+h2 { margin-left:25px; font-family:Helvetica,Arial; font-size:14pt; }
+h3 { margin-left:25px; font-family:Helvetica,Arial; font-size:12pt; }
+p  { margin-left:27px; margin-right:20px; font-size:10pt; }
+# next definition removes bullets for netscape
+# li { margin-left:27px; margin-right:20px; font-size:10pt; }
+form,pre,ul,ol { margin-left:27px; margin-right:20px; font-size:10pt; }
+div,td,th,address,nobr,b,i { font-size:10pt; }
diff --git a/doc/webserver/testplan.html b/doc/webserver/testplan.html
new file mode 100644 (file)
index 0000000..050a66d
--- /dev/null
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/testplan.html,v $
+
+ Purpose     :  Provide guideance to test before release
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: testplan.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|Testplan</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>Testplan for releases:</h1>
+<p>
+<ol>
+  <li>Remove any existing rpm with rpm -e
+  <li>Remove any file that was left over. This includes (but is not limited
+      to)
+      <ul>
+       <li>/var/log/junkbuster
+       <li>/etc/junkbuster
+       <li>/usr/sbin/junkbuster
+       <li>/etc/init.d/junkbuster
+       <li>/usr/doc/junkbuster*
+      </ul>
+  <li>Install the rpm. Any error messages?
+  <li>start,stop,status junkbuster with the specific script
+      (e.g. /etc/rc.d/init/junkbuster stop). Reboot your machine. Does
+      autostart work?
+  <li>Start browsing. Does the junkbuster work? Logfile written?
+  <li>Remove the rpm. Any error messages? All files removed?
+</ol>
+
+<h1>Test reports:</h1>
+<p>
+Please submit test reports only with the <a href="http://sourceforge.net/tracker/?func=add&group_id=11118&atid=395005">test form</a>
+at sourceforge. Three simple steps:
+<ul>
+  <li>Select category: the distribution you test on.
+  <li>Select group: the version of Junkbuster that we are about to release.
+  <li>Fill the Summary and Detailed Description with something intelligent
+      (keep it short and precise).
+</ul>
+<p>
+Do not mail to the mailinglist (we cannot keep track on issues there).
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:44 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: testplan.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
+
+-->
+</html>
diff --git a/doc/webserver/user-manual.html b/doc/webserver/user-manual.html
new file mode 100644 (file)
index 0000000..e90fad3
--- /dev/null
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<!--
+ File        :  $Source: /cvsroot/ijbswa/current/doc/webserver/user-manual.html,v $
+
+ Purpose     :  User Manual
+                This file belongs into
+                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
+                
+ $Id: user-manual.html,v 1.1 2001/06/13 14:20:37 swa Exp $
+
+ Written by and Copyright (C) 2001 the SourceForge
+ IJBSWA team.  http://ijbswa.sourceforge.net
+
+ Based on the Internet Junkbuster originally written
+ by and Copyright (C) 1997 Anonymous Coders and 
+ Junkbusters Corporation.  http://www.junkbusters.com
+-->
+
+<head>
+<title>Junkbuster|User Manual</title>
+<link rel=stylesheet type="text/css" href="swa.css">
+
+</head>
+ <body bgcolor="#ffffff"
+ topmargin="0" leftmargin="0" marginwidth = "0" marginheight = "0" 
+ text="#000000" 
+ link="#0000ff" 
+ vlink="#ff0000" 
+ alink="#ff0000"
+ >
+
+<body>
+<p>
+<br><br>
+<h1>To be filled:</h1>
+<p>
+
+<br>
+
+<hr>
+<p><address><a href=mailto:ijbswa-developers@lists.sourceforge.net>the developers</a></address><p>
+<!-- hhmts start -->
+Last modified: Wed Jun 13 16:26:43 CEST 2001
+<!-- hhmts end -->
+</body>
+ <!--
+ This program is free software; you can redistribute it 
+ and/or modify it under the terms of the GNU General
+ Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will
+ be useful, but WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A
+ PARTICULAR PURPOSE.  See the GNU General Public
+ License for more details.
+
+ The GNU General Public License should be included with
+ this file.  If not, you can view it at
+ http://www.gnu.org/copyleft/gpl.html
+ or write to the Free Software Foundation, Inc., 59
+ Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ $Log: user-manual.html,v $
+ Revision 1.1  2001/06/13 14:20:37  swa
+ first import of project's documentation for the webserver.
+
+-->
+</html>
index 09c7b5f..7e82acd 100644 (file)
--- a/encode.c
+++ b/encode.c
@@ -1,4 +1,4 @@
-const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
+const char encode_rcs[] = "$Id: encode.c,v 1.1.1.1 2001/05/15 13:58:51 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/encode.c,v $
@@ -7,7 +7,7 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
  *                encode cookies and HTML text.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -33,27 +33,6 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: encode.c,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.5  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.4  2002/01/22 23:28:07  jongfoster
- *    Adding convenience function html_encode_and_free_original()
- *    Making all functions accept NULL paramaters - in this case, they
- *    simply return NULL.  This allows error-checking to be deferred.
- *
- *    Revision 1.3  2001/11/13 00:16:40  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.2  2001/05/17 22:52:35  oes
- *     - Cleaned CRLF's from the sources and related files
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -64,8 +43,8 @@ const char encode_rcs[] = "$Id: encode.c,v 1.7 2002/03/24 13:25:43 swa Exp $";
 #include "config.h"
 
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
+#include <malloc.h>
 
 #include "encode.h"
 
@@ -176,20 +155,12 @@ static const char * const cookie_code_map[256] = {
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * html_encode(const char *s)
 {
-   char * buf;
-   
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 6 chars */
-   buf = (char *) malloc((strlen(s) * 6) + 1);
+   char * buf = (char *) malloc((strlen(s) * 6) + 1);
 
    if (buf)
    {
@@ -215,41 +186,6 @@ char * html_encode(const char *s)
    return(buf);
 }
 
-
-/*********************************************************************
- *
- * Function    :  html_encode_and_free_original
- *
- * Description :  Encodes a string so it's not interpreted as
- *                containing HTML tags or entities.
- *                Replaces <, >, &, and " with the appropriate HTML
- *                entities.  Free()s original string.
- *                If original string is NULL, simply returns NULL.
- *
- * Parameters  :
- *          1  :  s = String to encode.  Null-terminated.
- *
- * Returns     :  Encoded string, newly allocated on the heap. 
- *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
- *
- *********************************************************************/
-char * html_encode_and_free_original(char *s)
-{
-   char * result;
-   
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
-   result = html_encode(s);
-   free(s);
-
-   return result;
-}
-
-
 /*********************************************************************
  *
  * Function    :  cookie_encode
@@ -263,20 +199,12 @@ char * html_encode_and_free_original(char *s)
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * cookie_encode(const char *s)
 {
-   char * buf;
-
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 3 chars */
-   buf = (char *) malloc((strlen(s) * 3) + 1);
+   char * buf = (char *) malloc((strlen(s) * 3) + 1);
 
    if (buf)
    {
@@ -315,20 +243,12 @@ char * cookie_encode(const char *s)
  *
  * Returns     :  Encoded string, newly allocated on the heap. 
  *                Caller is responsible for freeing it with free().
- *                If s is NULL, or on out-of memory, returns NULL.
  *
  *********************************************************************/
 char * url_encode(const char *s)
 {
-   char * buf;
-
-   if (s == NULL)
-   {
-      return NULL;
-   }
-
    /* each input char can expand to at most 3 chars */
-   buf = (char *) malloc((strlen(s) * 3) + 1);
+   char * buf = (char *) malloc((strlen(s) * 3) + 1);
 
    if (buf)
    {
@@ -368,7 +288,7 @@ char * url_encode(const char *s)
  * Returns     :  The integer value, or -1 for non-hex characters.
  *
  *********************************************************************/
-static int xdtoi(const int d)
+static int xdtoi(char d)
 {
    if ((d >= '0') && (d <= '9'))
    {
@@ -406,10 +326,10 @@ static int xtoi(const char *s)
 {
    int d1, d2;
 
-   d1 = xdtoi(*s);
+   d1 = xdtoi(*s++);
    if(d1 >= 0)
    {
-      d2 = xdtoi(*(s+1));
+      d2 = xdtoi(*s);
       if(d2 >= 0)
       {
          return (d1 << 4) + d2;
@@ -451,7 +371,7 @@ char *url_decode(const char * s)
                break;
 
             case '%':
-               if ((*q = xtoi(s + 1)) != '\0')
+               if ((*q = xtoi(s + 1)))
                {
                   s += 3;
                   q++;
index 875b966..ba0b6cf 100644 (file)
--- a/encode.h
+++ b/encode.h
@@ -1,15 +1,15 @@
-#ifndef ENCODE_H_INCLUDED
-#define ENCODE_H_INCLUDED
-#define ENCODE_H_VERSION "$Id: encode.h,v 1.4 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ENCODE_H
+#define _ENCODE_H
+#define ENCODE_H_VERSION "$Id: encode.h,v 1.1 2001/05/13 21:57:06 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/encode.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/encode.h,v $
  *
  * Purpose     :  Functions to encode and decode URLs, and also to
  *                encode cookies and HTML text.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: encode.h,v $
- *    Revision 1.4  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.3  2002/01/22 23:28:07  jongfoster
- *    Adding convenience function html_encode_and_free_original()
- *    Making all functions accept NULL paramaters - in this case, they
- *    simply return NULL.  This allows error-checking to be deferred.
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:58:51  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -63,8 +48,6 @@ extern char * cookie_encode(const char *s);
 extern char * url_encode(const char *s);
 extern char * url_decode(const char *str);
 
-extern char * html_encode_and_free_original(char *s);
-
 /* Revision control strings from this header and associated .c file */
 extern const char encode_rcs[];
 extern const char encode_h_rcs[];
@@ -73,7 +56,7 @@ extern const char encode_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ENCODE_H_INCLUDED */
+#endif /* ndef _ENCODE_H */
 
 /*
   Local Variables:
index ec623b8..3832dbd 100644 (file)
--- a/errlog.c
+++ b/errlog.c
@@ -1,4 +1,4 @@
-const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
+const char errlog_rcs[] = "$Id: errlog.c,v 1.11 2001/06/01 18:14:49 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/errlog.c,v $
@@ -7,7 +7,7 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
  *                printf-like fashion.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -33,96 +33,6 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
  *
  * Revisions   :
  *    $Log: errlog.c,v $
- *    Revision 1.36  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.35  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.34  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.33  2002/03/13 00:27:04  jongfoster
- *    Killing warnings
- *
- *    Revision 1.32  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.31  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.30  2002/03/05 22:43:45  david__schmidt
- *    - Better error reporting on OS/2
- *    - Fix double-slash comment (oops)
- *
- *    Revision 1.29  2002/03/04 23:45:13  jongfoster
- *    Printing thread ID if using Win32 native threads
- *
- *    Revision 1.28  2002/03/04 17:59:59  oes
- *    Deleted deletePidFile(), cosmetics
- *
- *    Revision 1.27  2002/03/04 02:08:01  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.26  2002/01/09 19:05:45  steudten
- *    Fix big memory leak.
- *
- *    Revision 1.25  2002/01/09 14:32:08  oes
- *    Added support for gmtime_r and localtime_r.
- *
- *    Revision 1.24  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.23  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.22  2001/11/05 23:43:05  steudten
- *    Add time+date to log files.
- *
- *    Revision 1.21  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.20  2001/09/16 23:04:34  jongfoster
- *    Fixing a warning
- *
- *    Revision 1.19  2001/09/13 20:08:06  jongfoster
- *    Adding support for LOG_LEVEL_CGI
- *
- *    Revision 1.18  2001/09/10 11:27:24  oes
- *    Declaration of w32_socket_strerr now conditional
- *
- *    Revision 1.17  2001/09/10 10:17:13  oes
- *    Removed unused variable; Fixed sprintf format
- *
- *    Revision 1.16  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.15  2001/07/29 17:41:10  jongfoster
- *    Now prints thread ID for each message (pthreads only)
- *
- *    Revision 1.14  2001/07/19 19:03:48  haroon
- *    - Added case for LOG_LEVEL_POPUPS
- *
- *    Revision 1.13  2001/07/13 13:58:58  oes
- *     - Added case for LOG_LEVEL_DEANIMATE
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.12  2001/06/09 10:55:28  jongfoster
- *    Changing BUFSIZ ==> BUFFER_SIZE
- *
  *    Revision 1.11  2001/06/01 18:14:49  jongfoster
  *    Changing the calls to strerr() to check HAVE_STRERR (which is defined
  *    in config.h if appropriate) rather than the NO_STRERR macro.
@@ -206,22 +116,18 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
 \f
 
 #include "config.h"
-#include "miscutil.h"
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
-#endif /* !defined(_WIN32) && !defined(__OS2__) */
+#endif /* ndef _WIN32 */
 
 #include <errno.h>
-#include <assert.h>
-#ifdef FEATURE_PTHREAD
-#include <pthread.h>
-#endif /* def FEATURE_PTHREAD */
+/* #include <pthread.h> */
 
 #ifdef _WIN32
 #include <windows.h>
@@ -230,15 +136,8 @@ const char errlog_rcs[] = "$Id: errlog.c,v 1.36 2002/03/26 22:29:54 swa Exp $";
 #endif /* ndef _WIN_CONSOLE */
 #endif /* def _WIN32 */
 
-#ifdef __OS2__
-#include <sys/socket.h> /* For sock_errno */
-#define INCL_DOS
-#include <os2.h>
-#endif
-
 #include "errlog.h"
 #include "project.h"
-#include "jcc.h"
 
 const char errlog_h_rcs[] = ERRLOG_H_VERSION;
 
@@ -253,14 +152,16 @@ const char errlog_h_rcs[] = ERRLOG_H_VERSION;
 /* where to log (default: stderr) */
 static FILE *logfp = NULL;
 
+/* where to log (NULL == stderr) */
+static char * logfilename = NULL;
+
 /* logging detail level.  */
 static int debug = (LOG_LEVEL_FATAL | LOG_LEVEL_ERROR | LOG_LEVEL_INFO);  
 
 /* static functions */
 static void fatal_error(const char * error_message);
-#ifdef _WIN32
-static char *w32_socket_strerr(int errcode, char *tmp_buf);
-#endif
+static char * w32_socket_strerr(int errcode, char * tmp_buf);
+
 
 /*********************************************************************
  *
@@ -279,7 +180,7 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf);
 static void fatal_error(const char * error_message)
 {
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
-   MessageBox(g_hwndLogFrame, error_message, "Privoxy Error", 
+   MessageBox(g_hwndLogFrame, error_message, "Internet JunkBuster Error", 
       MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);  
 
    /* Cleanup - remove taskbar icon etc. */
@@ -289,17 +190,13 @@ static void fatal_error(const char * error_message)
    fputs(error_message, stderr);
 #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
 
-#if defined(unix)
-   unlink(pidfile);
-#endif /* unix */
-
    exit(1);
 }
 
 
 /*********************************************************************
  *
- * Function    :  init_error_log
+ * Function    :  init_errlog
  *
  * Description :  Initializes the logging module.  Must call before
  *                calling log_error.
@@ -323,7 +220,6 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
 
    if ((logfp != NULL) && (logfp != stderr))
    {
-      log_error(LOG_LEVEL_INFO, "(Re-)Open logfile %s", logfname ? logfname : "none");
       fclose(logfp);
    }
    logfp = stderr;
@@ -331,9 +227,9 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
    /* set the designated log file */
    if( logfname )
    {
-      if( NULL == (fp = fopen(logfname, "a")) )
+      if( !(fp = fopen(logfname, "a")) )
       {
-         log_error(LOG_LEVEL_FATAL, "init_error_log(): can't open logfile: %s", logfname);
+         log_error(LOG_LEVEL_FATAL, "init_errlog(): can't open logfile: %s", logfname);
       }
 
       /* set logging to be completely unbuffered */
@@ -342,7 +238,7 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
       logfp = fp;
    }
 
-   log_error(LOG_LEVEL_INFO, "Privoxy version " VERSION);
+   log_error(LOG_LEVEL_INFO, "Internet JunkBuster version " VERSION);
    if (prog_name != NULL)
    {
       log_error(LOG_LEVEL_INFO, "Program name: %s", prog_name);
@@ -370,15 +266,10 @@ void init_error_log(const char *prog_name, const char *logfname, int debuglevel)
 void log_error(int loglevel, char *fmt, ...)
 {
    va_list ap;
-   char *outbuf= NULL;
-   static char *outbuf_save = NULL;
+   char outbuf[BUFFER_SIZE];
    char * src = fmt;
    int outc = 0;
    long this_thread = 1;  /* was: pthread_t this_thread;*/
-#ifdef __OS2__
-   PTIB     ptib;
-   APIRET   ulrc;
-#endif /* __OS2__ */
 
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
    /*
@@ -399,95 +290,52 @@ void log_error(int loglevel, char *fmt, ...)
    }
 
    /* FIXME get current thread id */
-#ifdef FEATURE_PTHREAD
-   this_thread = (long)pthread_self();
-#elif defined(_WIN32)
-   this_thread = GetCurrentThreadId();
-#elif defined(__OS2__)
-   ulrc = DosGetInfoBlocks(&ptib, NULL);
-   if (ulrc == 0)
-     this_thread = ptib -> tib_ptib2 -> tib2_ultid;
-#endif /* def FEATURE_PTHREAD */
-
-   if ( !outbuf_save ) 
-   {
-      outbuf_save = outbuf = (char*)malloc(BUFFER_SIZE);
-      assert(outbuf);
-   }
-   outbuf = outbuf_save;
-
-    {
-       /*
-        * Write timestamp into tempbuf.
-        *
-        * Complex because not all OSs have tm_gmtoff or
-        * the %z field in strftime()
-        */
-       time_t now; 
-       struct tm tm_now; 
-       time (&now);
-#ifdef HAVE_LOCALTIME_R
-       tm_now = *localtime_r(&now, &tm_now);
-#else
-       tm_now = *localtime (&now); 
-#endif
-       strftime(outbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); 
-       outbuf += strlen( outbuf );
-    }
+   /* this_thread = (long)pthread_self(); */
+
    switch (loglevel)
    {
       case LOG_LEVEL_ERROR:
-         outc = sprintf(outbuf, "Privoxy(%ld) Error: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Error: ", this_thread);
          break;
       case LOG_LEVEL_FATAL:
-         outc = sprintf(outbuf, "Privoxy(%ld) Fatal error: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Fatal error: ", this_thread);
          break;
       case LOG_LEVEL_GPC:
-         outc = sprintf(outbuf, "Privoxy(%ld) Request: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Request: ", this_thread);
          break;
       case LOG_LEVEL_CONNECT:
-         outc = sprintf(outbuf, "Privoxy(%ld) Connect: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Connect: ", this_thread);
          break;
       case LOG_LEVEL_LOG:
-         outc = sprintf(outbuf, "Privoxy(%ld) Writing: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Writing: ", this_thread);
          break;
       case LOG_LEVEL_HEADER:
-         outc = sprintf(outbuf, "Privoxy(%ld) Header: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Header: ", this_thread);
          break;
       case LOG_LEVEL_INFO:
-         outc = sprintf(outbuf, "Privoxy(%ld) Info: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Info: ", this_thread);
          break;
+#ifdef PCRS
       case LOG_LEVEL_RE_FILTER:
-         outc = sprintf(outbuf, "Privoxy(%ld) Re-Filter: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Re-Filter: ", this_thread);
          break;
-#ifdef FEATURE_FORCE_LOAD
+#endif /* def PCRS */
+#ifdef FORCE_LOAD
       case LOG_LEVEL_FORCE:
-         outc = sprintf(outbuf, "Privoxy(%ld) Force: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Force: ", this_thread);
          break;
-#endif /* def FEATURE_FORCE_LOAD */
-#ifdef FEATURE_FAST_REDIRECTS
+#endif /* def FORCE_LOAD */
+#ifdef FAST_REDIRECTS
       case LOG_LEVEL_REDIRECTS:
-         outc = sprintf(outbuf, "Privoxy(%ld) Redirect: ", this_thread);
-         break;
-#endif /* def FEATURE_FAST_REDIRECTS */
-      case LOG_LEVEL_DEANIMATE:
-         outc = sprintf(outbuf, "Privoxy(%ld) Gif-Deanimate: ", this_thread);
+         outc = sprintf(outbuf, "IJB(%d) Redirect: ", this_thread);
          break;
+#endif /* def FAST_REDIRECTS */
       case LOG_LEVEL_CLF:
-         outbuf = outbuf_save;
          outc = 0;
          outbuf[0] = '\0';
          break;
-#ifdef FEATURE_KILL_POPUPS
-      case LOG_LEVEL_POPUPS:
-         outc = sprintf(outbuf, "Privoxy(%ld) Kill-Popups: ", this_thread);
-         break;
-#endif /* def FEATURE_KILL_POPUPS */
-      case LOG_LEVEL_CGI:
-         outc = sprintf(outbuf, "Privoxy(%ld) CGI: ", this_thread);
-         break;
       default:
-         outc = sprintf(outbuf, "Privoxy(%ld) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel);
+         outc = sprintf(outbuf, "IJB(%d) UNKNOWN LOG TYPE(%d): ", this_thread, loglevel);
          break;
    }
    
@@ -498,7 +346,7 @@ void log_error(int loglevel, char *fmt, ...)
    while ((*src) && (outc < BUFFER_SIZE-2))
    {
       char tempbuf[BUFFER_SIZE];
-      char *sval = NULL;
+      char *sval;
       int ival;
       unsigned uval;
       long lval;
@@ -562,7 +410,7 @@ void log_error(int loglevel, char *fmt, ...)
             else
             {
                /* Error */
-               sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n"
+               sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n"
                                "Format = \"%s\"\n"
                                "Exiting.", this_thread, fmt);
                /* FIXME RACE HAZARD: should start critical section error_log_use here */
@@ -619,7 +467,7 @@ void log_error(int loglevel, char *fmt, ...)
             outc += ival;
             if (outc < BUFFER_SIZE-1)
             {
-               memcpy(outbuf + oldoutc, sval, (size_t) ival);
+               memcpy(outbuf + oldoutc, sval, ival);
             }
             else
             {
@@ -631,11 +479,6 @@ void log_error(int loglevel, char *fmt, ...)
 #ifdef _WIN32
             ival = WSAGetLastError();
             sval = w32_socket_strerr(ival, tempbuf);
-#elif __OS2__
-            ival = sock_errno();
-            if (ival == 0)
-              ival = errno;
-            sval = strerror(ival);
 #else /* ifndef _WIN32 */
             ival = errno; 
 #ifdef HAVE_STRERROR
@@ -671,22 +514,11 @@ void log_error(int loglevel, char *fmt, ...)
                 */
                time_t now; 
                struct tm *tm_now; 
-               struct tm gmt;
-#ifdef HAVE_LOCALTIME_R
-               struct tm dummy;
-#endif
+               struct tm gmt; 
                int days, hrs, mins; 
                time (&now); 
-#ifdef HAVE_GMTIME_R
-               gmt = *gmtime_r(&now, &gmt);
-#else
-               gmt = *gmtime(&now);
-#endif
-#ifdef HAVE_LOCALTIME_R
-               tm_now = localtime_r(&now, &dummy);
-#else
+               gmt = *gmtime (&now); 
                tm_now = localtime (&now); 
-#endif
                days = tm_now->tm_yday - gmt.tm_yday; 
                hrs = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) + tm_now->tm_hour - gmt.tm_hour); 
                mins = hrs * 60 + tm_now->tm_min - gmt.tm_min; 
@@ -705,7 +537,7 @@ void log_error(int loglevel, char *fmt, ...)
             }
             break;
          default:
-            sprintf(outbuf, "Privoxy(%ld) Error: log_error(): Bad format string:\n"
+            sprintf(outbuf, "IJB(%d) Error: log_error(): Bad format string:\n"
                             "Format = \"%s\"\n"
                             "Exiting.", this_thread, fmt);
             /* FIXME RACE HAZARD: should start critical section error_log_use here */
@@ -713,9 +545,9 @@ void log_error(int loglevel, char *fmt, ...)
             {
                logfp = stderr;
             }
-            fputs(outbuf_save, logfp);
+            fputs(outbuf, logfp);
             /* FIXME RACE HAZARD: should end critical section error_log_use here */
-            fatal_error(outbuf_save);
+            fatal_error(outbuf);
             /* Never get here */
             break;
 
@@ -759,11 +591,11 @@ void log_error(int loglevel, char *fmt, ...)
       logfp = stderr;
    }
 
-   fputs(outbuf_save, logfp);
+   fputs(outbuf, logfp);
 
    if (loglevel == LOG_LEVEL_FATAL)
    {
-      fatal_error(outbuf_save);
+      fatal_error(outbuf);
       /* Never get here */
    }
 
@@ -771,7 +603,7 @@ void log_error(int loglevel, char *fmt, ...)
 
 #if defined(_WIN32) && !defined(_WIN_CONSOLE)
    /* Write to display */
-   LogPutString(outbuf_save);
+   LogPutString(outbuf);
 #endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
 
 }
@@ -795,7 +627,7 @@ void log_error(int loglevel, char *fmt, ...)
  *                tmp_buf.
  *
  *********************************************************************/
-static char *w32_socket_strerr(int errcode, char *tmp_buf)
+static char * w32_socket_strerr(int errcode, char * tmp_buf)
 {
 #define TEXT_FOR_ERROR(code,text) \
    if (errcode == code)           \
@@ -872,3 +704,4 @@ static char *w32_socket_strerr(int errcode, char *tmp_buf)
   tab-width: 3
   end:
 */
+
index c3424dd..b757d38 100644 (file)
--- a/errlog.h
+++ b/errlog.h
@@ -1,6 +1,6 @@
-#ifndef ERRLOG_H_INCLUDED
-#define ERRLOG_H_INCLUDED
-#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.12 2002/03/24 13:25:43 swa Exp $"
+#ifndef _ERRLOG_H
+#define _ERRLOG_H
+#define ERRLOG_H_VERSION "$Id: errlog.h,v 1.4 2001/05/25 21:56:06 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/errlog.h,v $
@@ -9,7 +9,7 @@
  *                printf-like fashion.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: errlog.h,v $
- *    Revision 1.12  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.11  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.10  2001/09/13 20:08:06  jongfoster
- *    Adding support for LOG_LEVEL_CGI
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.7  2001/07/19 19:02:53  haroon
- *    Added define for LOG_LEVEL_POPUPS
- *
- *    Revision 1.6  2001/07/13 13:59:22  oes
- *     - Added LOG_LEVEL_DEANIMATE
- *     - Changed LOG_LEVEL_CLF
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.5  2001/05/26 17:25:14  jongfoster
- *    Added support for CLF (Common Log Format) and fixed LOG_LEVEL_LOG
- *
  *    Revision 1.4  2001/05/25 21:56:06  jongfoster
  *    Added FIXME comment to (broken) LOG_LEVEL_LOG
  *
@@ -135,21 +105,17 @@ extern "C" {
 #define LOG_LEVEL_IO         0x0004
 #define LOG_LEVEL_HEADER     0x0008
 #define LOG_LEVEL_LOG        0x0010
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
 #define LOG_LEVEL_FORCE      0x0020
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
+#ifdef PCRS
 #define LOG_LEVEL_RE_FILTER  0x0040
-#ifdef FEATURE_FAST_REDIRECTS
+#endif /* def PCRS */
+#ifdef FAST_REDIRECTS
 #define LOG_LEVEL_REDIRECTS  0x0080
-#endif /* def FEATURE_FAST_REDIRECTS */
-#define LOG_LEVEL_DEANIMATE  0x0100
-
-#define LOG_LEVEL_CLF        0x0200 /* Common Log File format */
-#ifdef FEATURE_KILL_POPUPS
-#define LOG_LEVEL_POPUPS     0x0400 /* Kill Popups */
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def FAST_REDIRECTS */
 
-#define LOG_LEVEL_CGI   0x0800 /* CGI / templates */
+#define LOG_LEVEL_CLF        0x0100 /* Common Log File format */
 
 /* Following are always on: */
 #define LOG_LEVEL_INFO    0x1000
@@ -167,7 +133,7 @@ extern const char errlog_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef ERRLOG_H_INCLUDED */
+#endif /* ndef _ERRLOG_H */
 
 /*
   Local Variables:
index 6f16d84..129efbf 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -1,4 +1,4 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.18 2001/06/29 13:27:38 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.c,v $
@@ -6,19 +6,19 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
- *                   `block_url', `url_actions', `domain_split',
+ *                   `block_url', `url_actions', `domaincmp', `dsplit',
  *                   `filter_popups', `forward_url', 'redirect_url',
- *                   `ij_untrusted_url', `intercept_url', `pcrs_filter_respose',
- *                   'ijb_send_banner', and `trust_url'
+ *                   `ij_untrusted_url', `intercept_url', `re_process_buffer',
+ *                   `show_proxy_args', 'ijb_send_banner', and `trust_url'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -38,172 +38,6 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
  *
  * Revisions   :
  *    $Log: filters.c,v $
- *    Revision 1.52  2002/03/24 16:35:57  jongfoster
- *    Removing logo
- *
- *    Revision 1.51  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.50  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.49  2002/03/16 20:29:14  oes
- *    Cosmetics
- *
- *    Revision 1.48  2002/03/13 20:25:34  oes
- *    Better logging for content filters
- *
- *    Revision 1.47  2002/03/13 00:30:52  jongfoster
- *    Killing warnings
- *    Added option of always sending redirect for imageblock,
- *    currently disabled with #if 0.
- *
- *    Revision 1.46  2002/03/12 01:42:49  oes
- *    Introduced modular filters
- *
- *    Revision 1.45  2002/03/08 16:47:50  oes
- *    Added choice beween GIF and PNG built-in images
- *
- *    Revision 1.44  2002/03/07 03:49:31  oes
- *     - Fixed compiler warnings etc
- *     - Changed built-in images from GIF to PNG
- *       (with regard to Unisys patent issue)
- *     - Added a 4x4 pattern PNG which is less intrusive
- *       than the logo but also clearly marks the deleted banners
- *
- *    Revision 1.43  2002/01/22 23:51:59  jongfoster
- *    Replacing strsav() with the safer string_append().
- *
- *    Adding missing html_encode() to error message generators.  Where encoded
- *    and unencoded versions of a string were provided, removing the unencoded
- *    one.
- *
- *    Revision 1.42  2002/01/17 21:00:32  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Using a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Using parse_http_url() to parse URLs without faking a HTTP
- *    request line for parse_http_request().
- *
- *    Revision 1.41  2001/11/13 00:14:07  jongfoster
- *    Fixing stupid bug now I've figured out what || means.
- *    (It always returns 0 or 1, not one of it's paramaters.)
- *
- *    Revision 1.40  2001/10/26 17:37:55  oes
- *    - Re-enabled Netscape 200/404 bug workaround in block_url():
- *      - Removed OS/2 special case
- *      - Made block_url() independant from sed() having been run
- *    - Made trust_url independant from sed() having been run
- *    - Made is_imageurl independant from sed() having been run.
- *      It now checks User-Agent: and Accept: by itself.
- *
- *
- *    Revision 1.39  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.38  2001/10/23 21:32:33  jongfoster
- *    Adding error-checking to selected functions
- *
- *    Revision 1.37  2001/10/22 15:33:56  david__schmidt
- *    Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in
- *    filters.c.  Added a FIXME in front of the offending code.  I'll gladly
- *    put in a better/more robust fix for all parties if one is presented...
- *    It seems that just returning 200 instead of 404 would pretty much fix
- *    it for everyone, but I don't know all the history of the problem.
- *
- *    Revision 1.36  2001/10/10 16:44:16  oes
- *    Added match_portlist function
- *
- *    Revision 1.35  2001/10/07 15:41:23  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    New function remove_chunked_transfer_coding that strips chunked
- *      transfer coding to plain and is called by pcrs_filter_response
- *      and gif_deanimate_response if neccessary
- *
- *    Improved handling of zero-change re_filter runs
- *
- *    pcrs_filter_response and gif_deanimate_response now remove
- *      chunked transfer codeing before processing the body.
- *
- *    Revision 1.34  2001/09/20 15:49:36  steudten
- *
- *    Fix BUG: Change int size to size_t size in pcrs_filter_response().
- *    See cgi.c fill_template().
- *
- *    Revision 1.33  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.32  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.31  2001/09/16 11:38:02  jongfoster
- *    Splitting fill_template() into 2 functions:
- *    template_load() loads the file
- *    template_fill() performs the PCRS regexps.
- *    This is because the CGI edit interface has a "table row"
- *    template which is used many times in the page - this
- *    change means it's only loaded from disk once.
- *
- *    Revision 1.30  2001/09/16 11:00:10  jongfoster
- *    New function alloc_http_response, for symmetry with free_http_response
- *
- *    Revision 1.29  2001/09/13 23:32:40  jongfoster
- *    Moving image data to cgi.c rather than cgi.h
- *    Fixing a GPF under Win32 (and any other OS that protects global
- *    constants from being written to).
- *
- *    Revision 1.28  2001/09/10 10:18:51  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.27  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.26  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.25  2001/07/26 10:09:46  oes
- *    Made browser detection a little less naive
- *
- *    Revision 1.24  2001/07/25 17:22:51  oes
- *    Added workaround for Netscape bug that prevents display of page when loading a component fails.
- *
- *    Revision 1.23  2001/07/23 13:40:12  oes
- *    Fixed bug that caused document body to be dropped when pcrs joblist was empty.
- *
- *    Revision 1.22  2001/07/18 12:29:34  oes
- *    - Made gif_deanimate_response respect
- *      csp->action->string[ACTION_STRING_DEANIMATE]
- *    - Logging cosmetics
- *
- *    Revision 1.21  2001/07/13 13:59:53  oes
- *     - Introduced gif_deanimate_response which shares the
- *       generic content modification interface of pcrs_filter_response
- *       and acts as a wrapper to deanimate.c:gif_deanimate()
- *     - Renamed re_process_buffer to pcrs_filter_response
- *     - pcrs_filter_response now returns NULL on failiure
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.20  2001/07/01 17:01:04  oes
- *    Added comments and missing return statement in is_untrusted_url()
- *
- *    Revision 1.19  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.18  2001/06/29 13:27:38  oes
  *    - Cleaned up, renamed and reorderd functions
  *      and improved comments
@@ -386,34 +220,29 @@ const char filters_rcs[] = "$Id: filters.c,v 1.52 2002/03/24 16:35:57 jongfoster
 #include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
-#include <assert.h>
 
 #ifndef _WIN32
-#ifndef __OS2__
 #include <unistd.h>
-#endif /* ndef __OS2__ */
 #include <netinet/in.h>
 #else
 #include <winsock2.h>
-#endif /* ndef _WIN32 */
-
-#ifdef __OS2__
-#include <utils.h>
-#endif /* def __OS2__ */
+#endif
 
 #include "project.h"
 #include "filters.h"
 #include "encode.h"
+#include "jcc.h"
+#include "showargs.h"
 #include "parsers.h"
 #include "ssplit.h"
+#include "gateway.h"
+#include "jbsockets.h"
 #include "errlog.h"
 #include "jbsockets.h"
 #include "miscutil.h"
 #include "actions.h"
 #include "cgi.h"
 #include "list.h"
-#include "deanimate.h"
-#include "urlmatch.h"
 
 #ifdef _WIN32
 #include "win32.h"
@@ -431,7 +260,7 @@ const char filters_h_rcs[] = FILTERS_H_VERSION;
 #define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X))
 
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
 /*********************************************************************
  *
  * Function    :  block_acl
@@ -496,7 +325,7 @@ int block_acl(struct access_control_addr *dst, struct client_state *csp)
  *
  * Function    :  acl_addr
  *
- * Description :  Called from `load_config' to parse an ACL address.
+ * Description :  Called from `load_aclfile' to parse an ACL address.
  *
  * Parameters  :
  *          1  :  aspec = String specifying ACL address.
@@ -513,7 +342,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
    masklength = 32;
    port       =  0;
 
-   if ((p = strchr(aspec, '/')) != NULL)
+   if ((p = strchr(aspec, '/')))
    {
       *p++ = '\0';
 
@@ -529,7 +358,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
       return(-1);
    }
 
-   if ((p = strchr(aspec, ':')) != NULL)
+   if ((p = strchr(aspec, ':')))
    {
       *p++ = '\0';
 
@@ -544,8 +373,9 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
 
    aca->addr = ntohl(resolve_hostname_to_ip(aspec));
 
-   if (aca->addr == INADDR_NONE)
+   if (aca->addr == -1)
    {
+      log_error(LOG_LEVEL_ERROR, "can't resolve address for %s", aspec);
       return(-1);
    }
 
@@ -564,87 +394,7 @@ int acl_addr(char *aspec, struct access_control_addr *aca)
    return(0);
 
 }
-#endif /* def FEATURE_ACL */
-
-
-/*********************************************************************
- *
- * Function    :  match_portlist
- *
- * Description :  Check if a given number is covered by a comma
- *                separated list of numbers and ranges (a,b-c,d,..)
- *
- * Parameters  :
- *          1  :  portlist = String with list
- *          2  :  port = port to check
- *
- * Returns     :  0 => no match
- *                1 => match
- *
- *********************************************************************/
-int match_portlist(const char *portlist, int port)
-{
-   char *min, *max, *next, *portlist_copy;
-
-   min = next = portlist_copy = strdup(portlist);
-
-   /*
-    * Zero-terminate first item and remember offset for next
-    */
-   if (NULL != (next = strchr(portlist_copy, (int) ',')))
-   {
-      *next++ = '\0';
-   }
-
-   /*
-    * Loop through all items, checking for match
-    */
-   while(min)
-   {
-      if (NULL == (max = strchr(min, (int) '-')))
-      {
-         /*
-          * No dash, check for equality
-          */
-         if (port == atoi(min))
-         {
-            free(portlist_copy);
-            return(1);
-         }
-      }
-      else
-      {
-         /*
-          * This is a range, so check if between min and max,
-          * or, if max was omitted, between min and 65K
-          */
-         *max++ = '\0';
-         if(port >= atoi(min) && port <= (atoi(max) ? atoi(max) : 65535))
-         {
-            free(portlist_copy);
-            return(1);
-         }
-
-      }
-
-      /*
-       * Jump to next item
-       */
-      min = next;
-
-      /*
-       * Zero-terminate next item and remember offset for n+1
-       */
-      if ((NULL != next) && (NULL != (next = strchr(next, (int) ','))))
-      {
-         *next++ = '\0';
-      }
-   }
-
-   free(portlist_copy);
-   return 0;
-
-}
+#endif /* def ACL_FILES */
 
 
 /*********************************************************************
@@ -661,188 +411,90 @@ int match_portlist(const char *portlist, int port)
  *********************************************************************/
 struct http_response *block_url(struct client_state *csp)
 {
-#ifdef FEATURE_IMAGE_BLOCKING
    char *p;
-#endif /* def FEATURE_IMAGE_BLOCKING */
    struct http_response *rsp;
+   struct map *exports = NULL;
 
-   /*
+   /* 
     * If it's not blocked, don't block it ;-)
     */
    if ((csp->action->flags & ACTION_BLOCK) == 0)
    {
-      return NULL;
+      return(NULL);
    }
 
-   /*
+   /* 
     * Else, prepare a response
     */
-   if (NULL == (rsp = alloc_http_response()))
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-      return cgi_error_memory();
+      return NULL;
    }
 
    /*
     * If it's an image-url, send back an image or redirect
     * as specified by the relevant +image action
     */
-#ifdef FEATURE_IMAGE_BLOCKING
+#ifdef IMAGE_BLOCKING
    if (((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0)
         && is_imageurl(csp))
    {
       /* determine HOW images should be blocked */
       p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
 
-#if 1 /* Two alternative strategies, use this one for now: */
-
       /* and handle accordingly: */
-      if ((p == NULL) || (0 == strcmpic(p, "pattern")))
+      if ((p == NULL) || (0 == strcmpic(p, "logo")))
       {
-         rsp->body = bindup(image_pattern_data, image_pattern_length);
-         if (rsp->body == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-         rsp->content_length = image_pattern_length;
-
-         if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
+         rsp->body = bindup(JBGIF, sizeof(JBGIF));
+         rsp->content_length = sizeof(JBGIF);
+         enlist_unique_header(rsp->headers, "Content-Type", "image/gif");
       }
 
       else if (0 == strcmpic(p, "blank"))
       {
-         rsp->body = bindup(image_blank_data, image_blank_length);
-         if (rsp->body == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-         rsp->content_length = image_blank_length;
-
-         if (enlist_unique_header(rsp->headers, "Content-Type", BUILTIN_IMAGE_MIMETYPE))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
+         rsp->body = bindup(BLANKGIF, sizeof(BLANKGIF));
+         rsp->content_length = sizeof(BLANKGIF);
+         enlist_unique_header(rsp->headers, "Content-Type", "image/gif");
       }
 
       else
       {
-         rsp->status = strdup("302 Local Redirect from Privoxy");
-         if (rsp->status == NULL)
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-
-         if (enlist_unique_header(rsp->headers, "Location", p))
-         {
-            free_http_response(rsp);
-            return cgi_error_memory();
-         }
-      }
-
-#else /* Following code is disabled for now */
-
-      /* and handle accordingly: */
-      if ((p == NULL) || (0 == strcmpic(p, "pattern")))
-      {
-         p = CGI_PREFIX "send-banner?type=pattern";
-      }
-      else if (0 == strcmpic(p, "blank"))
-      {
-         p = CGI_PREFIX "send-banner?type=blank";
-      }
-      rsp->status = strdup("302 Local Redirect from Privoxy");
-      if (rsp->status == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
+         rsp->status = strdup("302 Local Redirect from Junkbuster");
+         enlist_unique_header(rsp->headers, "Location", p);
       }
-
-      if (enlist_unique_header(rsp->headers, "Location", p))
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-#endif /* Preceeding code is disabled for now */
-   }
+   }  
    else
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
-   /*
+   /* 
     * Else, generate an HTML "blocked" message:
     */
    {
-      jb_err err;
-      struct map * exports;
 
-      /*
-       * Workaround for stupid Netscape bug which prevents
-       * pages from being displayed if loading a referenced
-       * JavaScript or style sheet fails. So make it appear
-       * as if it succeeded.
-       */
-      if ( NULL != (p = get_header_value(csp->headers, "User-Agent:"))
-           && !strncmpic(p, "mozilla", 7) /* Catch Netscape but */
-           && !strstr(p, "Gecko")         /* save Mozilla, */
-           && !strstr(p, "compatible")    /* MSIE */
-           && !strstr(p, "Opera"))        /* and Opera. */
-      {
-         rsp->status = strdup("200 Request for blocked URL");
-      }
-      else
-      {
-         rsp->status = strdup("404 Request for blocked URL");
-      }
-
-      if (rsp->status == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-
-      exports = default_exports(csp, NULL);
-      if (exports == NULL)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-
-#ifdef FEATURE_FORCE_LOAD
-      err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-      err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
+      exports = default_exports(csp, NULL);       
+#ifdef FORCE_LOAD
+      exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+      exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
 
-      if (!err) err = map(exports, "hostport", 1, html_encode(csp->http->hostport), 0);
-      if (!err) err = map(exports, "path", 1, html_encode(csp->http->path), 0);
+      exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+      exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+      exports = map(exports, "path", 1, csp->http->path, 1);
+      exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
 
-      if (err)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-
-      err = template_fill_for_cgi(csp, "blocked", exports, rsp);
-      if (err)
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      rsp->body = fill_template(csp, "blocked", exports);
+      free_map(exports);
+  
+      rsp->status = strdup("403 Request for blocked URL"); 
    }
 
-   return finish_http_response(rsp);
+   return(finish_http_response(rsp));
 
 }
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  trust_url FIXME: I should be called distrust_url
@@ -859,12 +511,9 @@ struct http_response *block_url(struct client_state *csp)
 struct http_response *trust_url(struct client_state *csp)
 {
    struct http_response *rsp;
-   struct map * exports;
-   char buf[BUFFER_SIZE];
-   char *p;
-   struct url_spec **tl;
-   struct url_spec *t;
-   jb_err err;
+   struct map *exports = NULL;
+   char buf[BUFFER_SIZE], *p = NULL;
+   struct url_spec **tl, *t;
 
    /*
     * Don't bother to work on trusted URLs
@@ -874,120 +523,86 @@ struct http_response *trust_url(struct client_state *csp)
       return NULL;
    }
 
-   /*
+   /* 
     * Else, prepare a response:
     */
-   if (NULL == (rsp = alloc_http_response()))
+   if (NULL == ( rsp = (struct http_response *)zalloc(sizeof(*rsp))))
    {
-      return cgi_error_memory();
+      return NULL;
    }
-
    exports = default_exports(csp, NULL);
-   if (exports == NULL)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
 
-   /*
+   /* 
     * Export the host, port, and referrer information
     */
-   err = map(exports, "hostport", 1, csp->http->hostport, 1);
-   if (!err) err = map(exports, "path", 1, csp->http->path, 1);
+   exports = map(exports, "hostport", 1, csp->http->hostport, 1);
+   exports = map(exports, "path", 1, csp->http->path, 1);
+   exports = map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0);
+   exports = map(exports, "path-html", 1, html_encode(csp->http->path), 0);
 
-   if (NULL != (p = get_header_value(csp->headers, "Referer:")))
+   if (csp->referrer && strlen(csp->referrer) > 9)
    {
-      if (!err) err = map(exports, "referrer", 1, html_encode(p), 0);
+      exports = map(exports, "referrer", 1, csp->referrer + 9, 1);
+      exports = map(exports, "referrer-html", 1, html_encode(csp->referrer + 9), 0);
    }
    else
    {
-      if (!err) err = map(exports, "referrer", 1, "unknown", 1);
-   }
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      exports = map(exports, "referrer", 1, "unknown", 1);
+      exports = map(exports, "referrer-html", 1, "unknown", 1);
    }
 
    /*
     * Export the trust list
     */
-   p = strdup("");
-   for (tl = csp->config->trust_list; (t = *tl) != NULL ; tl++)
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
    {
       sprintf(buf, "<li>%s</li>\n", t->spec);
-      string_append(&p, buf);
-   }
-   err = map(exports, "trusted-referrers", 1, p, 0);
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      p = strsav(p, buf);
    }
+   exports = map(exports, "trusted-referrers", 1, p, 0);
+   p = NULL;
 
    /*
     * Export the trust info, if available
     */
-   if (csp->config->trust_info->first)
+   if (csp->config->trust_info->next)
    {
-      struct list_entry *l;
+      struct list *l;
 
-      p = strdup("");
-      for (l = csp->config->trust_info->first; l ; l = l->next)
+      for (l = csp->config->trust_info->next; l ; l = l->next)
       {
          sprintf(buf, "<li> <a href=%s>%s</a><br>\n",l->str, l->str);
-         string_append(&p, buf);
+         p = strsav(p, buf);
       }
-      err = map(exports, "trust-info", 1, p, 0);
+      exports = map(exports, "trust-info", 1, p, 0);
    }
    else
    {
-      err = map_block_killer(exports, "have-trust-info");
-   }
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
+      exports = map_block_killer(exports, "have-trust-info");
    }
-
+   
    /*
     * Export the force prefix or the force conditional block killer
     */
-#ifdef FEATURE_FORCE_LOAD
-   err = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
-#else /* ifndef FEATURE_FORCE_LOAD */
-   err = map_block_killer(exports, "force-support");
-#endif /* ndef FEATURE_FORCE_LOAD */
-
-   if (err)
-   {
-      free_map(exports);
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+#ifdef FORCE_LOAD
+   exports = map(exports, "force-prefix", 1, FORCE_PREFIX, 1);
+#else
+   exports = map_block_killer(exports, "force-support");
+#endif /* ndef FORCE_LOAD */
 
    /*
     * Build the response
     */
-   err = template_fill_for_cgi(csp, "untrusted", exports, rsp);
-   if (err)
-   {
-      free_http_response(rsp);
-      return cgi_error_memory();
-   }
+   rsp->body = fill_template(csp, "untrusted", exports);
+   free_map(exports);
+
+   return(finish_http_response(rsp));
 
-   return finish_http_response(rsp);
 }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
-#ifdef FEATURE_FAST_REDIRECTS
+#ifdef FAST_REDIRECTS
 /*********************************************************************
  *
  * Function    :  redirect_url
@@ -1009,54 +624,50 @@ struct http_response *redirect_url(struct client_state *csp)
    p = q = csp->http->path;
    log_error(LOG_LEVEL_REDIRECTS, "checking path for redirects: %s", p);
 
-   /*
+   /* 
     * find the last URL encoded in the request
     */
-   while ((p = strstr(p, "http://")) != NULL)
+   while (p = strstr(p, "http://"))
    {
       q = p++;
    }
 
-   /*
+   /* 
     * if there was any, generate and return a HTTP redirect
     */
    if (q != csp->http->path)
    {
       log_error(LOG_LEVEL_REDIRECTS, "redirecting to: %s", q);
 
-      if (NULL == (rsp = alloc_http_response()))
+      if (NULL == ( rsp = zalloc(sizeof(*rsp))))
       {
-         return cgi_error_memory();
+         return NULL;
       }
 
-      if ( enlist_unique_header(rsp->headers, "Location", q)
-        || (NULL == (rsp->status = strdup("302 Local Redirect from Privoxy"))) )
-      {
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
+      rsp->status = strdup("302 Local Redirect from Junkbuster");
+      enlist_unique_header(rsp->headers, "Location", q);
 
-      return finish_http_response(rsp);
+      return(finish_http_response(rsp));
    }
    else
    {
-      return NULL;
+      return(NULL);
    }
 
 }
-#endif /* def FEATURE_FAST_REDIRECTS */
+#endif /* def FAST_REDIRECTS */
 
 
-#ifdef FEATURE_IMAGE_BLOCKING
+#ifdef IMAGE_BLOCKING
 /*********************************************************************
  *
  * Function    :  is_imageurl
  *
  * Description :  Given a URL, decide whether it is an image or not,
  *                using either the info from a previous +image action
- *                or, #ifdef FEATURE_IMAGE_DETECT_MSIE, the info from
- *                the browser's accept header.
- *
+ *                or, #ifdef DETECT_MSIE_IMAGES, the info from the
+ *                browser's accept header.
+ *                
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
@@ -1066,34 +677,28 @@ struct http_response *redirect_url(struct client_state *csp)
  *********************************************************************/
 int is_imageurl(struct client_state *csp)
 {
-#ifdef FEATURE_IMAGE_DETECT_MSIE
-   char *tmp;
-
-   tmp = get_header_value(csp->headers, "User-Agent:");
-   if (tmp && strstr(tmp, "MSIE"))
+#ifdef DETECT_MSIE_IMAGES
+   if ((csp->accept_types 
+       & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML))
+       == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE))
    {
-      tmp = get_header_value(csp->headers, "Accept:");
-      if (tmp && strstr(tmp, "image/gif"))
-      {
-         /* Client will accept HTML.  If this seems counterintuitive,
-          * blame Microsoft.
-          */
-         return(0);
-      }
-      else
-      {
-         return(1);
-      }
+      return 1;
    }
-#endif /* def FEATURE_IMAGE_DETECT_MSIE */
+   else if ((csp->accept_types 
+       & (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_IMAGE|ACCEPT_TYPE_MSIE_HTML))
+       == (ACCEPT_TYPE_IS_MSIE|ACCEPT_TYPE_MSIE_HTML))
+   {
+      return 0;
+   }
+#endif
 
    return ((csp->action->flags & ACTION_IMAGE) != 0);
 
 }
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  is_untrusted_url
@@ -1115,458 +720,530 @@ int is_untrusted_url(struct client_state *csp)
 {
    struct file_list *fl;
    struct block_spec *b;
-   struct url_spec **trusted_url;
+   struct url_spec url[1], **tl, *t;
    struct http_request rhttp[1];
-   const char * referer;
-   jb_err err;
+   char *p, *h;
 
-   /*
-    * If we don't have a trustlist, we trust everybody
-    */
    if (((fl = csp->tlist) == NULL) || ((b  = fl->f) == NULL))
    {
-      return 0;
+      return(0);
    }
 
+   *url = dsplit(csp->http->host);
+
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL) return(0);
+
    memset(rhttp, '\0', sizeof(*rhttp));
 
-   /*
-    * Do we trust the request URL itself?
-    */
    for (b = b->next; b ; b = b->next)
    {
-      if (url_match(b->url, csp->http))
+      if ((b->url->port == 0) || (b->url->port == csp->http->port))
       {
-         return b->reject;
+         if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+         {
+            if ((b->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(b->url->preg, csp->http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(b->url->path, csp->http->path, b->url->pathlen) == 0)
+#endif
+            )
+            {
+               freez(url->dbuf);
+               freez(url->dvec);
+
+               if (b->reject == 0) return(0);
+
+               return(1);
+            }
+         }
       }
    }
 
-   if (NULL == (referer = get_header_value(csp->headers, "Referer:")))
+   freez(url->dbuf);
+   freez(url->dvec);
+
+   if ((csp->referrer == NULL)|| (strlen(csp->referrer) <= 9))
    {
       /* no referrer was supplied */
-      return 1;
+      return(1);
    }
 
-   /*
-    * If not, do we maybe trust its referrer?
+   /* forge a URL from the referrer so we can use
+    * convert_url() to parse it into its components.
     */
 
+   p = NULL;
+   p = strsav(p, "GET ");
+   p = strsav(p, csp->referrer + 9);   /* skip over "Referer: " */
+   p = strsav(p, " HTTP/1.0");
 
-   /*
-    * Parse the URL from the referrer
-    */
+   parse_http_request(p, rhttp, csp);
+   freez(p);
 
-   err = parse_http_url(referer, rhttp, csp);
-   if (err)
+   if (rhttp->cmd == NULL)
    {
-      return 1;
+      return(1);
    }
 
-   for (trusted_url = csp->config->trust_list; *trusted_url != NULL; trusted_url++)
-   {
-      if (url_match(*trusted_url, rhttp))
-      {
-         /* if the URL's referrer is from a trusted referrer, then
-          * add the target spec to the trustfile as an unblocked
-          * domain and return NULL (which means it's OK).
-          */
+   *url = dsplit(rhttp->host);
 
-         FILE *fp;
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL) return(1);
 
-         if (NULL != (fp = fopen(csp->config->trustfile, "a")))
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
+   {
+      if ((t->port == 0) || (t->port == rhttp->port))
+      {
+         if ((t->domain[0] == '\0') || domaincmp(t, url) == 0)
          {
-            char * path;
-            char * path_end;
-            char * new_entry = strdup("~");
-
-            string_append(&new_entry, csp->http->hostport);
-
-            path = csp->http->path;
-            if ( (path[0] == '/')
-              && (path[1] == '~')
-              && ((path_end = strchr(path + 2, '/')) != NULL))
+            if ((t->path == NULL) ||
+#ifdef REGEX
+               (regexec(t->preg, rhttp->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(t->path, rhttp->path, t->pathlen) == 0)
+#endif
+            )
             {
-               /* since this path points into a user's home space
-                * be sure to include this spec in the trustfile.
+               /* if the URL's referrer is from a trusted referrer, then
+                * add the target spec to the trustfile as an unblocked
+                * domain and return NULL (which means it's OK).
                 */
-               int path_len = path_end - path; /* save offset */
-               path = strdup(path); /* Copy string */
-               if (path != NULL)
+
+               FILE *fp;
+
+               freez(url->dbuf);
+               freez(url->dvec);
+
+               if ((fp = fopen(csp->config->trustfile, "a")))
                {
-                  path_end = path + path_len; /* regenerate ptr to new buffer */
-                  *(path_end + 1) = '\0'; /* Truncate path after '/' */
+                  h = NULL;
+
+                  h = strsav(h, "~");
+                  h = strsav(h, csp->http->hostport);
+
+                  p = csp->http->path;
+                  if ((*p++ == '/')
+                  && (*p++ == '~'))
+                  {
+                  /* since this path points into a user's home space
+                   * be sure to include this spec in the trustfile.
+                   */
+                     if ((p = strchr(p, '/')))
+                     {
+                        *p = '\0';
+                        h = strsav(h, csp->http->path); /* FIXME: p?! */
+                        h = strsav(h, "/");
+                     }
+                  }
+
+                  fprintf(fp, "%s\n", h);
+                  freez(h);
+                  fclose(fp);
                }
-               string_join(&new_entry, path);
-            }
-
-            if (new_entry != NULL)
-            {
-               fprintf(fp, "%s\n", new_entry);
-               free(new_entry);
-            }
-            else
-            {
-               /* FIXME: No way to handle out-of memory, so mostly ignoring it */
-               log_error(LOG_LEVEL_ERROR, "Out of memory adding pattern to trust file");
+               return(0);
             }
-
-            fclose(fp);
          }
-         return 0;
       }
    }
-   return 1;
+
 }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def TRUST_FILES */
 
 
+#ifdef PCRS
 /*********************************************************************
  *
- * Function    :  pcrs_filter_response
+ * Function    :  re_process_buffer
  *
- * Description :  Ecexute all text substitutions from all applying
- *                +filter actions on the text buffer that's been accumulated
- *                in csp->iob->buf. If this changes the contents, set
- *                csp->content_length to the modified size and raise the
- *                CSP_FLAG_MODIFIED flag.
+ * Description :  Apply all the pcrs jobs from the joblist (re_filterfile)
+ *                to the text buffer that's been accumulated in 
+ *                csp->iob->buf and set csp->content_length to the modified
+ *                size.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
  * Returns     :  a pointer to the (newly allocated) modified buffer.
- *                or NULL if there were no hits or something went wrong
- *
+ *                or an empty string in case something went wrong
+ *                
  *********************************************************************/
-char *pcrs_filter_response(struct client_state *csp)
+char *re_process_buffer(struct client_state *csp)
 {
    int hits=0;
-   size_t size;
+   int size = csp->iob->eod - csp->iob->cur;
 
    char *old = csp->iob->cur, *new = NULL;
    pcrs_job *job;
 
    struct file_list *fl;
    struct re_filterfile_spec *b;
-   struct list_entry *filtername;
 
-   /* 
-    * Sanity first
-    */
-   if (csp->iob->cur >= csp->iob->eod)
+   /* Sanity first ;-) */
+   if (size <= 0)
    {
-      return(NULL);
+      return(strdup(""));
    }
-   size = csp->iob->eod - csp->iob->cur;
 
-   if ( ( NULL == (fl = csp->rlist) ) || ( NULL == fl->f) )
+   if ( ( NULL == (fl = csp->rlist) ) || ( NULL == (b = fl->f) ) )
    {
       log_error(LOG_LEVEL_ERROR, "Unable to get current state of regexp filtering.");
-      return(NULL);
+      return(strdup(""));
    }
 
-   /*
-    * If the body has a "chunked" transfer-encoding,
-    * get rid of it first, adjusting size and iob->eod
-    */
-   if (csp->flags & CSP_FLAG_CHUNKED)
-   {
-      log_error(LOG_LEVEL_RE_FILTER, "Need to de-chunk first");
-      if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size)))
-      {
-         return(NULL);
-      }
-      csp->iob->eod = csp->iob->cur + size;
-      csp->flags |= CSP_FLAG_MODIFIED;
-   }
+   log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...",
+              csp->http->hostport, csp->http->path, size);
 
-   /*
-    * For all applying +filter actions, look if a filter by that
-    * name exists and if yes, execute it's pcrs_joblist on the
-    * buffer.
-    */
-   for (b = fl->f; b; b = b->next)
+   /* Apply all jobs from the joblist */
+   for (job = b->joblist; NULL != job; job = job->next)
    {
-      for (filtername = csp->action->multi[ACTION_MULTI_FILTER]->first;
-           filtername ; filtername = filtername->next)
-      {
-         if (strcmp(b->name, filtername->str) == 0)
-         {
-            int current_hits = 0;
-
-            if ( NULL == b->joblist )
-            {
-               log_error(LOG_LEVEL_RE_FILTER, "Filter %s has empty joblist. Nothing to do.", b->name);
-               return(NULL);
-            }
-
-            log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) with filter %s...",
-                      csp->http->hostport, csp->http->path, size, b->name);
-
-            /* Apply all jobs from the joblist */
-            for (job = b->joblist; NULL != job; job = job->next)
-            {
-               current_hits += pcrs_execute(job, old, size, &new, &size);
-               if (old != csp->iob->cur) free(old);
-               old=new;
-            }
-
-            log_error(LOG_LEVEL_RE_FILTER, " ...produced %d hits (new size %d).", current_hits, size);
-            hits += current_hits;
-         }
-      }
+      hits += pcrs_execute(job, old, size, &new, &size);
+      if (old != csp->iob->cur) free(old);
+      old=new;
    }
 
-   /*
-    * If there were no hits, destroy our copy and let
-    * chat() use the original in csp->iob
-    */
-   if (!hits)
-   {
-      free(new);
-      return(NULL);
-   }
+   log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
 
-   csp->flags |= CSP_FLAG_MODIFIED;
    csp->content_length = size;
-   IOB_RESET(csp);
 
+   /* fwiw, reset the iob */
+   IOB_RESET(csp);
    return(new);
 
 }
+#endif /* def PCRS */
 
 
 /*********************************************************************
  *
- * Function    :  gif_deanimate_response
+ * Function    :  url_actions
  *
- * Description :  Deanimate the GIF image that has been accumulated in
- *                csp->iob->buf, set csp->content_length to the modified
- *                size and raise the CSP_FLAG_MODIFIED flag.
+ * Description :  Gets the actions for this URL.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          1  :  http = http_request request for blocked URLs
+ *          2  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  a pointer to the (newly allocated) modified buffer.
- *                or NULL in case something went wrong.
+ * Returns     :  N/A
  *
  *********************************************************************/
-char *gif_deanimate_response(struct client_state *csp)
+void url_actions(struct http_request *http, 
+                 struct client_state *csp)
 {
-   struct binbuffer *in, *out;
-   char *p;
-   size_t size = csp->iob->eod - csp->iob->cur;
+   struct file_list *fl;
+   struct url_actions *b;
 
-   /*
-    * If the body has a "chunked" transfer-encoding,
-    * get rid of it first, adjusting size and iob->eod
-    */
-   if (csp->flags & CSP_FLAG_CHUNKED)
+   init_current_action(csp->action);
+
+   if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
    {
-      log_error(LOG_LEVEL_DEANIMATE, "Need to de-chunk first");
-      if (0 == (size = remove_chunked_transfer_coding(csp->iob->cur, size)))
-      {
-         return(NULL);
-      }
-      csp->iob->eod = csp->iob->cur + size;
-      csp->flags |= CSP_FLAG_MODIFIED;
+      return;
    }
 
-   if (  (NULL == (in =  (struct binbuffer *)zalloc(sizeof *in )))
-      || (NULL == (out = (struct binbuffer *)zalloc(sizeof *out))) )
+   apply_url_actions(csp->action, http, b);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  apply_url_actions
+ *
+ * Description :  Applies a list of URL actions.
+ *
+ * Parameters  :
+ *          1  :  action = Destination.
+ *          2  :  http = Current URL
+ *          3  :  b = list of URL actions to apply
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void apply_url_actions(struct current_action_spec *action, 
+                       struct http_request *http, 
+                       struct url_actions *b)
+{
+   struct url_spec url[1];
+
+   if (b == NULL)
    {
-      log_error(LOG_LEVEL_DEANIMATE, "failed! (no mem)");
-      return NULL;
+      /* Should never happen */
+      return;
    }
 
-   in->buffer = csp->iob->cur;
-   in->size = size;
+   *url = dsplit(http->host);
 
-   if (gif_deanimate(in, out, strncmp("last", csp->action->string[ACTION_STRING_DEANIMATE], 4)))
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL)
    {
-      log_error(LOG_LEVEL_DEANIMATE, "failed! (gif parsing)");
-      free(in);
-      buf_free(out);
-      return(NULL);
+      return;
    }
-   else
+
+   for (b = b->next; NULL != b; b = b->next)
    {
-      if ((int)size == out->offset)
+      if ((b->url->port == 0) || (b->url->port == http->port))
       {
-         log_error(LOG_LEVEL_DEANIMATE, "GIF not changed.");
-      }
-      else
-      {
-         log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset);
+         if ((b->url->domain[0] == '\0') || (domaincmp(b->url, url) == 0))
+         {
+            if ((b->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(b->url->preg, http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(b->url->path, http->path, b->url->pathlen) == 0)
+#endif
+            )
+            {
+               merge_current_action(action, b->action);
+            }
+         }
       }
-      csp->content_length = out->offset;
-      csp->flags |= CSP_FLAG_MODIFIED;
-      p = out->buffer;
-      free(in);
-      free(out);
-      return(p);
    }
 
+   freez(url->dbuf);
+   freez(url->dvec);
 }
 
 
 /*********************************************************************
  *
- * Function    :  remove_chunked_transfer_coding
+ * Function    :  forward_url
  *
- * Description :  In-situ remove the "chunked" transfer coding as defined
- *                in rfc2616 from a buffer.
+ * Description :  Should we forward this to another proxy?
  *
  * Parameters  :
- *          1  :  buffer = Pointer to the text buffer
- *          2  :  size = Number of bytes to be processed
+ *          1  :  http = http_request request for current URL
+ *          2  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  The new size, i.e. the number of bytes from buffer which
- *                are occupied by the stripped body, or 0 in case something
- *                went wrong
+ * Returns     :  Pointer to forwarding information.
  *
  *********************************************************************/
-int remove_chunked_transfer_coding(char *buffer, const size_t size)
+const struct forward_spec * forward_url(struct http_request *http,
+                                        struct client_state *csp)
 {
-   size_t newsize = 0;
-   unsigned int chunksize = 0;
-   char *from_p, *to_p;
-
-   assert(buffer);
-   from_p = to_p = buffer;
+   static const struct forward_spec fwd_default[1] = { 0 }; /* All zeroes */
+   struct forward_spec *fwd = csp->config->forward;
+   struct url_spec url[1];
 
-   if (sscanf(buffer, "%x", &chunksize) != 1)
+   if (fwd == NULL)
    {
-      log_error(LOG_LEVEL_ERROR, "Invalid first chunksize while stripping \"chunked\" transfer coding");
-      return(0);
+      return(fwd_default);
    }
 
-   while (chunksize > 0)
-   {
-      if (NULL == (from_p = strstr(from_p, "\r\n")))
-      {
-         log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding");
-         return(0);
-      }
-      newsize += chunksize;
-      from_p += 2;
+   *url = dsplit(http->host);
 
-      memmove(to_p, from_p, (size_t) chunksize);
-      to_p = buffer + newsize;
-      from_p += chunksize + 2;
+   /* if splitting the domain fails, punt */
+   if (url->dbuf == NULL)
+   {
+      return(fwd_default);
+   }
 
-      if (sscanf(from_p, "%x", &chunksize) != 1)
+   while (fwd != NULL)
+   {
+      if ((fwd->url->port == 0) || (fwd->url->port == http->port))
       {
-         log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding");
-         return(0);
+         if ((fwd->url->domain[0] == '\0') || (domaincmp(fwd->url, url) == 0))
+         {
+            if ((fwd->url->path == NULL) ||
+#ifdef REGEX
+               (regexec(fwd->url->preg, http->path, 0, NULL, 0) == 0)
+#else
+               (strncmp(fwd->url->path, http->path, fwd->url->pathlen) == 0)
+#endif
+            )
+            {
+               freez(url->dbuf);
+               freez(url->dvec);
+               return(fwd);
+            }
+         }
       }
+      fwd = fwd->next;
    }
 
-   /* FIXME: Should this get its own loglevel? */
-   log_error(LOG_LEVEL_RE_FILTER, "De-chunking successful. Shrunk from %d to %d\n", size, newsize);
-   return(newsize);
+   freez(url->dbuf);
+   freez(url->dvec);
+   return(fwd_default);
 
 }
 
 
 /*********************************************************************
  *
- * Function    :  url_actions
+ * Function    :  dsplit
  *
- * Description :  Gets the actions for this URL.
+ * Description :  Takes a domain and returns a pointer to a url_spec
+ *                structure populated with dbuf, dcnt and dvec.  The
+ *                other fields in the structure that is returned are zero.
  *
  * Parameters  :
- *          1  :  http = http_request request for blocked URLs
- *          2  :  csp = Current client state (buffers, headers, etc...)
+ *          1  :  domain = a URL address
  *
- * Returns     :  N/A
+ * Returns     :  url_spec structure populated with dbuf, dcnt and dvec.
  *
  *********************************************************************/
-void url_actions(struct http_request *http,
-                 struct client_state *csp)
+struct url_spec dsplit(char *domain)
 {
-   struct file_list *fl;
-   struct url_actions *b;
+   struct url_spec ret[1];
+   char *v[BUFFER_SIZE];
+   int size;
+   char *p;
 
-   init_current_action(csp->action);
+   memset(ret, '\0', sizeof(*ret));
 
-   if (((fl = csp->actions_list) == NULL) || ((b = fl->f) == NULL))
+   if (domain[strlen(domain) - 1] == '.')
    {
-      return;
+      ret->unanchored |= ANCHOR_RIGHT;
    }
 
-   apply_url_actions(csp->action, http, b);
+   if (domain[0] == '.')
+   {
+      ret->unanchored |= ANCHOR_LEFT;
+   }
+
+   ret->dbuf = strdup(domain);
+
+   /* map to lower case */
+   for (p = ret->dbuf; *p ; p++) *p = tolower(*p);
+
+   /* split the domain name into components */
+   ret->dcnt = ssplit(ret->dbuf, ".", v, SZ(v), 1, 1);
+
+   if (ret->dcnt <= 0)
+   {
+      memset(ret, '\0', sizeof(ret));
+      return(*ret);
+   }
+
+   /* save a copy of the pointers in dvec */
+   size = ret->dcnt * sizeof(*ret->dvec);
+
+   if ((ret->dvec = (char **)malloc(size)))
+   {
+      memcpy(ret->dvec, v, size);
+   }
+
+   return(*ret);
 
 }
 
 
 /*********************************************************************
  *
- * Function    :  apply_url_actions
+ * Function    :  simple_domaincmp
  *
- * Description :  Applies a list of URL actions.
+ * Description :  Domain-wise Compare fqdn's.  The comparison is 
+ *                both left- and right-anchored.  The individual
+ *                domain names are compared with simplematch().
+ *                This is only used by domaincmp.
  *
  * Parameters  :
- *          1  :  action = Destination.
- *          2  :  http = Current URL
- *          3  :  b = list of URL actions to apply
+ *          1  :  pv = array of patterns to compare
+ *          2  :  fv = array of domain components to compare
+ *          3  :  len = length of the arrays (both arrays are the
+ *                      same length - if they weren't, it couldn't
+ *                      possibly be a match).
  *
- * Returns     :  N/A
+ * Returns     :  0 => domains are equivalent, else no match.
  *
  *********************************************************************/
-void apply_url_actions(struct current_action_spec *action,
-                       struct http_request *http,
-                       struct url_actions *b)
+static int simple_domaincmp(char **pv, char **fv, int len)
 {
-   if (b == NULL)
-   {
-      /* Should never happen */
-      return;
-   }
+   int n;
 
-   for (b = b->next; NULL != b; b = b->next)
+   for (n = 0; n < len; n++)
    {
-      if (url_match(b->url, http))
+      if (simplematch(pv[n], fv[n]))
       {
-         merge_current_action(action, b->action);
+         return 1;
       }
    }
+
+   return 0;
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  forward_url
+ * Function    :  domaincmp
  *
- * Description :  Should we forward this to another proxy?
+ * Description :  Domain-wise Compare fqdn's. Governed by the bimap in
+ *                pattern->unachored, the comparison is un-, left-,
+ *                right-anchored, or both.
+ *                The individual domain names are compared with
+ *                simplematch().
  *
  * Parameters  :
- *          1  :  http = http_request request for current URL
- *          2  :  csp = Current client state (buffers, headers, etc...)
+ *          1  :  pattern = a domain that may contain a '*' as a wildcard.
+ *          2  :  fqdn = domain name against which the patterns are compared.
  *
- * Returns     :  Pointer to forwarding information.
+ * Returns     :  0 => domains are equivalent, else no match.
  *
  *********************************************************************/
-const struct forward_spec * forward_url(struct http_request *http,
-                                        struct client_state *csp)
+int domaincmp(struct url_spec *pattern, struct url_spec *fqdn)
 {
-   static const struct forward_spec fwd_default[1] = { FORWARD_SPEC_INITIALIZER };
-   struct forward_spec *fwd = csp->config->forward;
+   char **pv, **fv;  /* vectors  */
+   int    plen, flen;
+   int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT);
 
-   if (fwd == NULL)
+   plen = pattern->dcnt;
+   flen = fqdn->dcnt;
+
+   if (flen < plen)
    {
-      return fwd_default;
+      /* fqdn is too short to match this pattern */
+      return 1;
    }
 
-   while (fwd != NULL)
+   pv   = pattern->dvec;
+   fv   = fqdn->dvec;
+
+   if (unanchored == ANCHOR_LEFT)
+   {
+      /*
+       * Right anchored.
+       *
+       * Convert this into a fully anchored pattern with
+       * the fqdn and pattern the same length
+       */
+      fv += (flen - plen); /* flen - plen >= 0 due to check above */
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else if (unanchored == 0)
    {
-      if (url_match(fwd->url, http))
+      /* Fully anchored, check length */
+      if (flen != plen)
       {
-         return fwd;
+         return 1;
       }
-      fwd = fwd->next;
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else if (unanchored == ANCHOR_RIGHT)
+   {
+      /* Left anchored, ignore all extra in fqdn */
+      return simple_domaincmp(pv, fv, plen);
+   }
+   else
+   {
+      /* Unanchored */
+      int n;
+      int maxn = flen - plen;
+      for (n = 0; n <= maxn; n++)
+      {
+         if (!simple_domaincmp(pv, fv, plen))
+         {
+            return 0;
+         }
+         /*
+          * Doesn't match from start of fqdn
+          * Try skipping first part of fqdn
+          */
+         fv++;
+      }
+      return 1;
    }
 
-   return fwd_default;
 }
 
 
index 82b59ce..67d6edf 100644 (file)
--- a/filters.h
+++ b/filters.h
@@ -1,6 +1,6 @@
-#ifndef FILTERS_H_INCLUDED
-#define FILTERS_H_INCLUDED
-#define FILTERS_H_VERSION "$Id: filters.h,v 1.18 2002/03/25 22:12:45 oes Exp $"
+#ifndef _FILTERS_H
+#define _FILTERS_H
+#define FILTERS_H_VERSION "$Id: filters.h,v 1.9 2001/06/07 23:10:53 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.h,v $
@@ -8,12 +8,13 @@
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
- *                   `block_url', `url_actions', `filter_popups', `forward_url'
+ *                   `block_url', `url_actions', `domaincmp', `dsplit',
+ *                   `filter_popups', `forward_url'
  *                   `ij_untrusted_url', `intercept_url', `re_process_buffer',
  *                   `show_proxy_args', and `trust_url'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: filters.h,v $
- *    Revision 1.18  2002/03/25 22:12:45  oes
- *    Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete
- *
- *    Revision 1.17  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.16  2002/01/17 21:01:02  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.15  2001/10/10 16:44:16  oes
- *    Added match_portlist function
- *
- *    Revision 1.14  2001/10/07 15:41:40  oes
- *    Added prototype for remove_chunked_transfer_coding
- *
- *    Revision 1.13  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.12  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.11  2001/07/13 14:00:18  oes
- *     - Introduced gif_deanimate_response
- *     - Renamed re_process_buffer to pcrs_filter_response
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.10  2001/06/29 13:29:01  oes
- *    Cleaned up and updated to reflect the changesin
- *    filters.c
- *
  *    Revision 1.9  2001/06/07 23:10:53  jongfoster
  *    Replacing struct gateway with struct forward_spec
  *
 extern "C" {
 #endif
 
-
-struct access_control_addr;
-struct client_state;
-struct http_request;
-struct http_response;
-struct current_action_spec;
-struct url_actions;
-struct url_spec;
-
-
 /*
  * ACL checking
  */
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
 extern int block_acl(struct access_control_addr *dst, struct client_state *csp);
 extern int acl_addr(char *aspec, struct access_control_addr *aca);
-#endif /* def FEATURE_ACL */
-extern int match_portlist(const char *portlist, int port);
+#endif /* def ACL_FILES */
 
 /*
  * Interceptors
  */
 extern struct http_response *block_url(struct client_state *csp);
 extern struct http_response *redirect_url(struct client_state *csp);
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 extern struct http_response *trust_url(struct client_state *csp);
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def TRUST_FILES */
 
 /*
  * Request inspectors
  */
-#ifdef FEATURE_COOKIE_JAR
+#ifdef TRUST_FILES
 extern int is_untrusted_url(struct client_state *csp);
-#endif /* def FEATURE_COOKIE_JAR */
-#ifdef FEATURE_IMAGE_BLOCKING
+#endif /* def TRUST_FILES */
+#ifdef IMAGE_BLOCKING
 extern int is_imageurl(struct client_state *csp);
-#endif /* def FEATURE_IMAGE_BLOCKING */
+#endif /* def IMAGE_BLOCKING */
 
 /*
  * Determining applicable actions
@@ -246,23 +202,17 @@ extern void apply_url_actions(struct current_action_spec *action,
  */
 extern const struct forward_spec *forward_url(struct http_request *http, struct client_state *csp);
 
-/*
- * Content modification
- */
-extern char *pcrs_filter_response(struct client_state *csp);
-extern char *gif_deanimate_response(struct client_state *csp);
-extern int remove_chunked_transfer_coding(char *buffer, const size_t size);
+extern struct url_spec dsplit(char *domain);
+extern int domaincmp(struct url_spec *pattern, struct url_spec *fqdn);
 
 /*
- * Solaris fix:
+ * Content modification
  */
-#ifndef INADDR_NONE
-#define INADDR_NONE -1
-#endif     
+#ifdef PCRS
+extern char *re_process_buffer(struct client_state *csp);
+#endif /* def PCRS */
 
-/* 
- * Revision control strings from this header and associated .c file
- */
+/* Revision control strings from this header and associated .c file */
 extern const char filters_rcs[];
 extern const char filters_h_rcs[];
 
@@ -270,7 +220,7 @@ extern const char filters_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef FILTERS_H_INCLUDED */
+#endif /* ndef _FILTERS_H */
 
 /*
   Local Variables:
index cff7172..13273f6 100644 (file)
--- a/gateway.c
+++ b/gateway.c
@@ -1,4 +1,4 @@
-const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.2 2001/06/07 23:11:38 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.c,v $
@@ -8,13 +8,13 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
  *                proxy).
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -34,68 +34,6 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: gateway.c,v $
- *    Revision 1.14  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.13  2002/03/13 00:29:59  jongfoster
- *    Killing warnings
- *
- *    Revision 1.12  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.11  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.10  2002/03/07 03:50:19  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings
- *
- *    Revision 1.9  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.8  2001/09/13 20:10:12  jongfoster
- *    Fixing missing #include under Windows
- *
- *    Revision 1.7  2001/09/12 17:58:26  steudten
- *
- *    add #include <string.h>
- *
- *    Revision 1.6  2001/09/10 10:41:16  oes
- *    Added #include in.h
- *
- *    Revision 1.5  2001/07/29 18:47:57  jongfoster
- *    Adding missing #include project.h
- *
- *    Revision 1.4  2001/07/24 12:47:06  oes
- *    Applied BeOS support update by Eugenia
- *
- *    Revision 1.3  2001/06/09 10:55:28  jongfoster
- *    Changing BUFSIZ ==> BUFFER_SIZE
- *
  *    Revision 1.2  2001/06/07 23:11:38  jongfoster
  *    Removing gateways[] list - no longer used.
  *    Replacing function pointer in struct gateway with a directly
@@ -118,27 +56,12 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
 
 #include <stdio.h>
 #include <sys/types.h>
-
-#ifndef _WIN32
-#include <netinet/in.h>
-#endif
-
 #include <errno.h>
-#include <string.h>
 
 #ifdef _WIN32
 #include <winsock2.h>
 #endif /* def _WIN32 */
 
-#ifdef __BEOS__
-#include <netdb.h>
-#endif /* def __BEOS__ */
-
-#ifdef __OS2__
-#include <utils.h>
-#endif /* def __OS2__ */
-
-#include "project.h"
 #include "jcc.h"
 #include "errlog.h"
 #include "jbsockets.h"
@@ -146,10 +69,10 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.14 2002/03/24 13:25:43 swa Exp $"
 
 const char gateway_h_rcs[] = GATEWAY_H_VERSION;
 
-static jb_socket socks4_connect(const struct forward_spec * fwd,
-                                const char * target_host,
-                                int target_port,
-                                struct client_state *csp);
+static int socks4_connect(const struct forward_spec * fwd, 
+                          const char * target_host,
+                          int target_port,
+                          struct client_state *csp);
 
 
 #define SOCKS_REQUEST_GRANTED          90
@@ -193,9 +116,9 @@ static const char socks_userid[] = "anonymous";
  * Returns     :  -1 => failure, else it is the socket file descriptor.
  *
  *********************************************************************/
-jb_socket forwarded_connect(const struct forward_spec * fwd,
-                            struct http_request *http,
-                            struct client_state *csp)
+int forwarded_connect(const struct forward_spec * fwd, 
+                      struct http_request *http, 
+                      struct client_state *csp)
 {
    const char * dest_host;
    int dest_port;
@@ -228,7 +151,7 @@ jb_socket forwarded_connect(const struct forward_spec * fwd,
          /* Should never get here */
          log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type.");
          errno = EINVAL;
-         return(JB_INVALID_SOCKET);
+         return(-1);
    }
 }
 
@@ -251,19 +174,19 @@ jb_socket forwarded_connect(const struct forward_spec * fwd,
  * Returns     :  -1 => failure, else a socket file descriptor.
  *
  *********************************************************************/
-static jb_socket socks4_connect(const struct forward_spec * fwd,
-                                const char * target_host,
-                                int target_port,
-                                struct client_state *csp)
+static int socks4_connect(const struct forward_spec * fwd, 
+                          const char * target_host,
+                          int target_port,
+                          struct client_state *csp)
 {
    int web_server_addr;
-   char cbuf[BUFFER_SIZE];
-   char sbuf[BUFFER_SIZE];
+   unsigned char cbuf[BUFFER_SIZE];
+   unsigned char sbuf[BUFFER_SIZE];
    struct socks_op    *c = (struct socks_op    *)cbuf;
    struct socks_reply *s = (struct socks_reply *)sbuf;
-   size_t n;
-   size_t csiz;
-   jb_socket sfd;
+   int n;
+   int csiz;
+   int sfd;
    int err = 0;
    char *errstr;
 
@@ -282,7 +205,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    if (err)
    {
       errno = EINVAL;
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
    /* build a socks request for connection to the web server */
@@ -295,11 +218,6 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    {
       case SOCKS_4:
          web_server_addr = htonl(resolve_hostname_to_ip(target_host));
-         if (web_server_addr == INADDR_NONE)
-         {
-            log_error(LOG_LEVEL_CONNECT, "socks4_connect: could not resolve target host %s", target_host);
-            return(JB_INVALID_SOCKET);
-         }
          break;
       case SOCKS_4A:
          web_server_addr = 0x00000001;
@@ -307,16 +225,16 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
          if (n > sizeof(cbuf))
          {
             errno = EINVAL;
-            return(JB_INVALID_SOCKET);
+            return(-1);
          }
-         strcpy(cbuf + csiz, target_host);
+         strcpy(((char *)cbuf) + csiz, target_host);
          csiz = n;
          break;
       default:
          /* Should never get here */
          log_error(LOG_LEVEL_FATAL, "SOCKS4 impossible internal error - bad SOCKS type.");
          errno = EINVAL;
-         return(JB_INVALID_SOCKET);
+         return(-1);
    }
 
    c->vn          = 4;
@@ -331,23 +249,23 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    /* pass the request to the socks server */
    sfd = connect_to(fwd->gateway_host, fwd->gateway_port, csp);
 
-   if (sfd == JB_INVALID_SOCKET)
+   if (sfd < 0)
    {
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-   if (write_socket(sfd, (char *)c, csiz))
+   if ((n = write_socket(sfd, (char *)c, csiz)) != csiz)
    {
       log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation write failed...");
       close_socket(sfd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-   if (read_socket(sfd, sbuf, sizeof(sbuf)) != sizeof(*s))
+   if ((n = read_socket(sfd, sbuf, sizeof(sbuf))) != sizeof(*s))
    {
       log_error(LOG_LEVEL_CONNECT, "SOCKS4 negotiation read failed...");
       close_socket(sfd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
    switch (s->cd)
@@ -371,7 +289,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
          errno = EACCES;
          break;
       default:
-         errstr = cbuf;
+         errstr = (char *) cbuf;
          errno = ENOENT;
          sprintf(errstr,
                  "SOCKS request rejected for reason code %d\n", s->cd);
@@ -380,7 +298,7 @@ static jb_socket socks4_connect(const struct forward_spec * fwd,
    log_error(LOG_LEVEL_CONNECT, "socks4_connect: %s ...", errstr);
 
    close_socket(sfd);
-   return(JB_INVALID_SOCKET);
+   return(-1);
 
 }
 
index d96bc58..5f1eb82 100644 (file)
--- a/gateway.h
+++ b/gateway.h
@@ -1,6 +1,6 @@
-#ifndef GATEWAY_H_INCLUDED
-#define GATEWAY_H_INCLUDED
-#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.6 2002/03/25 22:12:45 oes Exp $"
+#ifndef _GATEWAY_H
+#define _GATEWAY_H
+#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.h,v $
@@ -10,7 +10,7 @@
  *                proxy).  Also contains the list of gateway types.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: gateway.h,v $
- *    Revision 1.6  2002/03/25 22:12:45  oes
- *    Added fix for undefined INADDR_NONE on Solaris by Bart Schelstraete
- *
- *    Revision 1.5  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.4  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.3  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.2  2001/06/07 23:12:14  jongfoster
- *    Removing gateways[] list - no longer used.
- *    Replacing function pointer in struct gateway with a directly
- *    called function forwarded_connect(), which can do the common
- *    task of deciding whether to connect to the web server or HTTP
- *    proxy.
- *    Replacing struct gateway with struct forward_spec
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:54  oes
  *    Initial import of version 2.9.3 source tree
  *
  *********************************************************************/
 \f
 
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct forward_spec;
-struct http_request;
-struct client_state;
+extern int forwarded_connect(const struct forward_spec * fwd, 
+                             struct http_request *http, 
+                             struct client_state *csp);
 
-extern jb_socket forwarded_connect(const struct forward_spec * fwd, 
-                                   struct http_request *http, 
-                                   struct client_state *csp);
-
-/*
- * Solaris fix
- */
-#ifndef INADDR_NONE
-#define INADDR_NONE -1
-#endif
-
-/*
- * Revision control strings from this header and associated .c file
- */
+/* Revision control strings from this header and associated .c file */
 extern const char gateway_rcs[];
 extern const char gateway_h_rcs[];
 
@@ -114,7 +61,7 @@ extern const char gateway_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef GATEWAY_H_INCLUDED */
+#endif /* ndef _GATEWAY_H */
 
 /*
   Local Variables:
diff --git a/icons/denyrule.ico b/icons/denyrule.ico
new file mode 100644 (file)
index 0000000..e5aa250
Binary files /dev/null and b/icons/denyrule.ico differ
diff --git a/icons/icon1.ico b/icons/icon1.ico
new file mode 100644 (file)
index 0000000..b96fe7c
Binary files /dev/null and b/icons/icon1.ico differ
index 5ef20fc..99470b5 100644 (file)
Binary files a/icons/idle.ico and b/icons/idle.ico differ
similarity index 59%
rename from icons/privoxy.ico
rename to icons/junkbust.ico
index 4c96d0b..41aafd0 100644 (file)
Binary files a/icons/privoxy.ico and b/icons/junkbust.ico differ
diff --git a/icons/os2.ico b/icons/os2.ico
deleted file mode 100644 (file)
index b5fd21f..0000000
Binary files a/icons/os2.ico and /dev/null differ
diff --git a/icons/os20.ico b/icons/os20.ico
deleted file mode 100644 (file)
index ef5995b..0000000
Binary files a/icons/os20.ico and /dev/null differ
diff --git a/icons/os21.ico b/icons/os21.ico
deleted file mode 100644 (file)
index cc61b61..0000000
Binary files a/icons/os21.ico and /dev/null differ
diff --git a/icons/os22.ico b/icons/os22.ico
deleted file mode 100644 (file)
index d357dfb..0000000
Binary files a/icons/os22.ico and /dev/null differ
diff --git a/icons/os23.ico b/icons/os23.ico
deleted file mode 100644 (file)
index 8ac037f..0000000
Binary files a/icons/os23.ico and /dev/null differ
diff --git a/icons/os24.ico b/icons/os24.ico
deleted file mode 100644 (file)
index f2b87f7..0000000
Binary files a/icons/os24.ico and /dev/null differ
diff --git a/icons/os25.ico b/icons/os25.ico
deleted file mode 100644 (file)
index 5bc68b5..0000000
Binary files a/icons/os25.ico and /dev/null differ
diff --git a/icons/os26.ico b/icons/os26.ico
deleted file mode 100644 (file)
index 408d89e..0000000
Binary files a/icons/os26.ico and /dev/null differ
diff --git a/icons/os27.ico b/icons/os27.ico
deleted file mode 100644 (file)
index 00a8814..0000000
Binary files a/icons/os27.ico and /dev/null differ
diff --git a/icons/os28.ico b/icons/os28.ico
deleted file mode 100644 (file)
index 9153636..0000000
Binary files a/icons/os28.ico and /dev/null differ
diff --git a/install-sh b/install-sh
deleted file mode 100755 (executable)
index e9de238..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-           shift
-           continue;;
-
-       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-           shift
-           continue;;
-
-       *)  if [ x"$src" = x ]
-           then
-               src=$1
-           else
-               # this colon is to work around a 386BSD /bin/sh bug
-               :
-               dst=$1
-           fi
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-       echo "install:  no input file specified"
-       exit 1
-else
-       true
-fi
-
-if [ x"$dir_arg" != x ]; then
-       dst=$src
-       src=""
-       
-       if [ -d $dst ]; then
-               instcmd=:
-               chmodcmd=""
-       else
-               instcmd=mkdir
-       fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f $src -o -d $src ]
-       then
-               true
-       else
-               echo "install:  $src does not exist"
-               exit 1
-       fi
-       
-       if [ x"$dst" = x ]
-       then
-               echo "install:  no destination specified"
-               exit 1
-       else
-               true
-       fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-       if [ -d $dst ]
-       then
-               dst="$dst"/`basename $src`
-       else
-               true
-       fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='   
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
-
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $mkdirprog "${pathcomp}"
-       else
-               true
-       fi
-
-       pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-       $doit $instcmd $dst &&
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-       if [ x"$transformarg" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               dstfile=`basename $dst $transformbasename | 
-                       sed $transformarg`$transformbasename
-       fi
-
-# don't allow the sed command to completely eliminate the filename
-
-       if [ x"$dstfile" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               true
-       fi
-
-# Make a temp file name in the proper directory.
-
-       dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-       $doit $instcmd $src $dsttmp &&
-
-       trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-       $doit $rmcmd -f $dstdir/$dstfile &&
-       $doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff --git a/intermediate.action b/intermediate.action
deleted file mode 100644 (file)
index ab6689e..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-######################################################################\r
-# \r
-#  File        :  $Source: /cvsroot/ijbswa/current/intermediate.action,v $\r
-# \r
-#  $Id: intermediate.action,v 1.3 2002/03/26 22:29:54 swa Exp $\r
-#\r
-#  Purpose     :  More agressive actions file, see\r
-#                 http://www.privoxy.org/faq/questions.html#CONFIGFILES\r
-# \r
-#  Copyright   :  Written by and Copyright\r
-#                 Privoxy team. http://www.privoxy.org/\r
-#\r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and\r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-#\r
-# We value your feedback. However, to provide you with the best support,\r
-# please note:\r
-#  \r
-#  * Use the support forum to get help:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=211118\r
-#  * Submit bugs only thru our bug forum:\r
-#    http://sourceforge.net/tracker/?group_id=11118&atid=111118 \r
-#    Make sure that the bug has not already been submitted. Please try\r
-#    to verify that it is a Junkbuster bug, and not a browser or site\r
-#    bug first. If you are using your own custom configuration, please\r
-#    try the stock configs to see if the problem is a configuration\r
-#    related bug. And if not using the latest development snapshot,\r
-#    please try the latest one. Or even better, CVS sources.\r
-#  * Submit feature requests only thru our feature request forum:\r
-#    http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse\r
-#      \r
-# For any other issues, feel free to use the mailing lists:\r
-# http://sourceforge.net/mail/?group_id=11118\r
-#    \r
-# Anyone interested in actively participating in development and related\r
-# discussions can join the appropriate mailing list here:\r
-# http://sourceforge.net/mail/?group_id=11118. Archives are available\r
-# here too.\r
-# \r
-######################################################################\r
-\r
-######################################################################\r
-# Aliases\r
-######################################################################\r
-\r
-######################################################################\r
-# Defaults\r
-######################################################################\r
-\r
-######################################################################\r
-# Specials\r
-######################################################################\r
-\r
-######################################################################\r
-# Imagelist:\r
-######################################################################\r
-\r
-######################################################################\r
-# Blocklist:\r
-######################################################################\r
-\r
-######################################################################\r
-# \r
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge\r
-#                 Privoxy team. http://www.privoxy.org/\r
-# \r
-#                 Based on the Internet Junkbuster originally written\r
-#                 by and Copyright (C) 1997 Anonymous Coders and \r
-#                 Junkbusters Corporation.  http://www.junkbusters.com\r
-# \r
-#                 This program is free software; you can redistribute it \r
-#                 and/or modify it under the terms of the GNU General\r
-#                 Public License as published by the Free Software\r
-#                 Foundation; either version 2 of the License, or (at\r
-#                 your option) any later version.\r
-# \r
-#                 This program is distributed in the hope that it will\r
-#                 be useful, but WITHOUT ANY WARRANTY; without even the\r
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A\r
-#                 PARTICULAR PURPOSE.  See the GNU General Public\r
-#                 License for more details.\r
-# \r
-#                 The GNU General Public License should be included with\r
-#                 this file.  If not, you can view it at\r
-#                 http://www.gnu.org/copyleft/gpl.html\r
-#                 or write to the Free Software Foundation, Inc., 59\r
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
-# \r
-######################################################################\r
index 8a407e2..8101fd2 100644 (file)
@@ -1,4 +1,4 @@
-const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Exp $";
+const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.10 2001/06/29 13:29:15 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.c,v $
@@ -9,7 +9,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
  *                on many platforms.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -35,95 +35,6 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
  *
  * Revisions   :
  *    $Log: jbsockets.c,v $
- *    Revision 1.29  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.28  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.27  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.26  2002/03/11 22:07:02  david__schmidt
- *    OS/2 port maintenance:
- *    - Fixed EMX build - it had decayed a little
- *    - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro.
- *      substituted a memset for now.
- *
- *    Revision 1.25  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.24  2002/03/07 03:51:36  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings etc
- *
- *    Revision 1.23  2002/03/05 00:36:01  jongfoster
- *    Fixing bug 514988 - unable to restart JunkBuster
- *
- *    Revision 1.22  2002/03/04 02:08:02  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.21  2002/01/09 14:32:33  oes
- *    Added support for gethostbyname_r and gethostbyaddr_r.
- *
- *    Revision 1.20  2001/11/16 00:48:48  jongfoster
- *    Enabling duplicate-socket detection for all platforms, not
- *    just Win32.
- *
- *    Revision 1.19  2001/10/25 03:40:47  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.18  2001/09/21 23:02:02  david__schmidt
- *    Cleaning up 2 compiler warnings on OS/2.
- *
- *    Revision 1.17  2001/09/13 20:11:46  jongfoster
- *    Fixing 2 compiler warnings under Win32
- *
- *    Revision 1.16  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.15  2001/07/29 17:40:43  jongfoster
- *    Fixed compiler warning by adding a cast
- *
- *    Revision 1.14  2001/07/18 13:47:59  oes
- *    Eliminated dirty hack for getsockbyname()
- *
- *    Revision 1.13  2001/07/15 13:56:57  jongfoster
- *    Removing unused local variable.
- *
- *    Revision 1.12  2001/07/01 17:04:11  oes
- *    Bugfix: accept_connection no longer uses the obsolete hstrerror() function
- *
- *    Revision 1.11  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.10  2001/06/29 13:29:15  oes
  *    - Added remote (server) host IP to csp->http->host_ip_addr_str
  *    - Added detection of local socket IP and fqdn
@@ -179,9 +90,7 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
 
 #else
 
-#ifndef __OS2__
 #include <unistd.h>
-#endif
 #include <sys/time.h>
 #include <netinet/in.h>
 #include <sys/ioctl.h>
@@ -190,20 +99,11 @@ const char jbsockets_rcs[] = "$Id: jbsockets.c,v 1.29 2002/03/26 22:29:54 swa Ex
 
 #ifndef __BEOS__
 #include <netinet/tcp.h>
-#ifndef __OS2__
 #include <arpa/inet.h>
-#endif
 #else
 #include <socket.h>
 #endif
 
-#if defined(__EMX__) || defined (__OS2__)
-#include <sys/select.h>  /* OS/2/EMX needs a little help with select */
-#ifdef __OS2__
-#include <nerrno.h>
-#endif
-#endif
-
 #endif
 
 #include "project.h"
@@ -227,72 +127,58 @@ const char jbsockets_h_rcs[] = JBSOCKETS_H_VERSION;
  *          3  :  csp = Current client state (buffers, headers, etc...)
  *                      Not modified, only used for source IP and ACL.
  *
- * Returns     :  JB_INVALID_SOCKET => failure, else it is the socket
- *                file descriptor.
+ * Returns     :  -1 => failure, else it is the socket file descriptor.
  *
  *********************************************************************/
-jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
+int connect_to(const char *host, int portnum, struct client_state *csp)
 {
    struct sockaddr_in inaddr;
-   jb_socket fd;
-   int addr;
+   int   fd, addr;
    fd_set wfds;
    struct timeval tv[1];
 #if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    int   flags;
 #endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_addr dst[1];
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    memset((char *)&inaddr, 0, sizeof inaddr);
 
-   if ((addr = resolve_hostname_to_ip(host)) == INADDR_NONE)
+   if ((addr = resolve_hostname_to_ip(host)) == -1)
    {
       csp->http->host_ip_addr_str = strdup("unknown");
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
-#ifdef FEATURE_ACL
-   dst->addr = ntohl((unsigned long) addr);
+#ifdef ACL_FILES
+   dst->addr = ntohl(addr);
    dst->port = portnum;
 
    if (block_acl(dst, csp))
    {
-#ifdef __OS2__
-      errno = SOCEPERM;
-#else
       errno = EPERM;
-#endif
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    inaddr.sin_addr.s_addr = addr;
    inaddr.sin_family      = AF_INET;
    csp->http->host_ip_addr_str = strdup(inet_ntoa(inaddr.sin_addr));
 
-#ifndef _WIN32
    if (sizeof(inaddr.sin_port) == sizeof(short))
-#endif /* ndef _WIN32 */
    {
-      inaddr.sin_port = htons((unsigned short) portnum);
+      inaddr.sin_port = htons((short)portnum);
    }
-#ifndef _WIN32
    else
    {
-      inaddr.sin_port = htonl((unsigned long)portnum);
+      inaddr.sin_port = htonl(portnum);
    }
-#endif /* ndef _WIN32 */
 
-#ifdef _WIN32
-   if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) == JB_INVALID_SOCKET)
-#else
    if ((fd = socket(inaddr.sin_family, SOCK_STREAM, 0)) < 0)
-#endif
    {
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
 
 #ifdef TCP_NODELAY
@@ -302,45 +188,39 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
    }
 #endif /* def TCP_NODELAY */
 
-#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    if ((flags = fcntl(fd, F_GETFL, 0)) != -1)
    {
       flags |= O_NDELAY;
       fcntl(fd, F_SETFL, flags);
    }
-#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
-   while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET)
+   while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == -1)
    {
 #ifdef _WIN32
       if (errno == WSAEINPROGRESS)
-#elif __OS2__ 
-      if (sock_errno() == EINPROGRESS)
 #else /* ifndef _WIN32 */
       if (errno == EINPROGRESS)
-#endif /* ndef _WIN32 || __OS2__ */
+#endif /* ndef _WIN32 */
       {
          break;
       }
 
-#ifdef __OS2__ 
-      if (sock_errno() != EINTR)
-#else
       if (errno != EINTR)
-#endif /* __OS2__ */
       {
          close_socket(fd);
-         return(JB_INVALID_SOCKET);
+         return(-1);
       }
    }
 
-#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
    if (flags != -1)
    {
       flags &= ~O_NDELAY;
       fcntl(fd, F_SETFL, flags);
    }
-#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__) */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
 
    /* wait for connection to complete */
    FD_ZERO(&wfds);
@@ -349,11 +229,10 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
    tv->tv_sec  = 30;
    tv->tv_usec = 0;
 
-   /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Wierd! */
-   if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)
+   if (select(fd + 1, NULL, &wfds, NULL, tv) <= 0)
    {
       close_socket(fd);
-      return(JB_INVALID_SOCKET);
+      return(-1);
    }
    return(fd);
 
@@ -371,51 +250,24 @@ jb_socket connect_to(const char *host, int portnum, struct client_state *csp)
  *          2  :  buf = pointer to data to be written.
  *          3  :  len = length of data to be written to the socket "fd".
  *
- * Returns     :  0 on success (entire buffer sent).
- *                nonzero on error.
+ * Returns     :  Win32 & Unix: If no error occurs, returns the total number of
+ *                bytes sent, which can be less than the number
+ *                indicated by len. Otherwise, returns (-1).
  *
  *********************************************************************/
-int write_socket(jb_socket fd, const char *buf, size_t len)
+int write_socket(int fd, const char *buf, int len)
 {
-   if (len == 0)
-   {
-      return 0;
-   }
-
-   if (len < 0)
+   if (len <= 0)
    {
-      return 1;
+      return(0);
    }
 
    log_error(LOG_LEVEL_LOG, "%N", len, buf);
 
-#if defined(_WIN32)
-   return (send(fd, buf, (int)len, 0) != (int)len);
-#elif defined(__BEOS__) || defined(AMIGA)
-   return (send(fd, buf, len, 0) != len);
-#elif defined(__OS2__)
-   /*
-    * Break the data up into SOCKET_SEND_MAX chunks for sending...
-    * OS/2 seemed to complain when the chunks were too large.
-    */
-#define SOCKET_SEND_MAX 65000
-   {
-      int write_len = 0, send_len, send_rc = 0, i = 0;
-      while ((i < len) && (send_rc != -1))
-      {
-         if ((i + SOCKET_SEND_MAX) > len)
-            send_len = len - i;
-         else
-            send_len = SOCKET_SEND_MAX;
-         send_rc = send(fd,(char*)buf + i, send_len, 0);
-         if (send_rc == -1)
-            return 1;
-         i = i + send_len;
-      }
-      return 0;
-   }
+#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA)
+   return( send(fd, buf, len, 0));
 #else
-   return (write(fd, buf, len) != len);
+   return( write(fd, buf, len));
 #endif
 
 }
@@ -439,26 +291,24 @@ int write_socket(jb_socket fd, const char *buf, size_t len)
  *                smaller than the number of bytes requested; this may hap-
  *                pen for example because fewer bytes are actually available
  *                right now (maybe because we were close to end-of-file, or
- *                because we are reading from a pipe, or from a terminal,
- *                or because read() was interrupted by a signal).  On error,
+ *                because we are reading from a pipe, or from a terminal),
+ *                or because read() was interrupted by a signal.  On error,
  *                -1 is returned, and errno is set appropriately.  In this
  *                case it is left unspecified whether the file position (if
  *                any) changes.
  *
  *********************************************************************/
-int read_socket(jb_socket fd, char *buf, int len)
+int read_socket(int fd, char *buf, int len)
 {
    if (len <= 0)
    {
       return(0);
    }
 
-#if defined(_WIN32)
-   return(recv(fd, buf, len, 0));
-#elif defined(__BEOS__) || defined(AMIGA) || defined(__OS2__)
-   return(recv(fd, buf, (size_t)len, 0));
+#if defined(_WIN32) || defined(__BEOS__) || defined(AMIGA)
+   return( recv(fd, buf, len, 0));
 #else
-   return(read(fd, buf, (size_t)len));
+   return( read(fd, buf, len));
 #endif
 }
 
@@ -475,14 +325,12 @@ int read_socket(jb_socket fd, char *buf, int len)
  * Returns     :  void
  *
  *********************************************************************/
-void close_socket(jb_socket fd)
+void close_socket(int fd)
 {
 #if defined(_WIN32) || defined(__BEOS__)
    closesocket(fd);
 #elif defined(AMIGA)
    CloseSocket(fd); 
-#elif defined(__OS2__)
-   soclose(fd);
 #else
    close(fd);
 #endif
@@ -500,69 +348,44 @@ void close_socket(jb_socket fd)
  * Parameters  :
  *          1  :  hostnam = TCP/IP address to bind/listen to
  *          2  :  portnum = port to listen on
- *          3  :  pfd = pointer used to return file descriptor.
  *
- * Returns     :  if success, returns 0 and sets *pfd.
- *                if failure, returns -3 if address is in use,
- *                                    -2 if address unresolvable,
- *                                    -1 otherwise
+ * Returns     :  if success, return file descriptor
+ *                if failure, returns -2 if address is in use, otherwise -1
+ *
  *********************************************************************/
-int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
+int bind_port(const char *hostnam, int portnum)
 {
    struct sockaddr_in inaddr;
-   jb_socket fd;
-#ifndef _WIN32
+   int fd;
    int one = 1;
-#endif /* ndef _WIN32 */
-
-   *pfd = JB_INVALID_SOCKET;
 
    memset((char *)&inaddr, '\0', sizeof inaddr);
 
    inaddr.sin_family      = AF_INET;
    inaddr.sin_addr.s_addr = resolve_hostname_to_ip(hostnam);
 
-   if (inaddr.sin_addr.s_addr == INADDR_NONE)
-   {
-      return(-2);
-   }
-
-#ifndef _WIN32
    if (sizeof(inaddr.sin_port) == sizeof(short))
-#endif /* ndef _WIN32 */
    {
-      inaddr.sin_port = htons((unsigned short) portnum);
+      inaddr.sin_port = htons((short)portnum);
    }
-#ifndef _WIN32
    else
    {
-      inaddr.sin_port = htonl((unsigned long) portnum);
+      inaddr.sin_port = htonl(portnum);
    }
-#endif /* ndef _WIN32 */
 
    fd = socket(AF_INET, SOCK_STREAM, 0);
 
-#ifdef _WIN32
-   if (fd == JB_INVALID_SOCKET)
-#else
    if (fd < 0)
-#endif
    {
       return(-1);
    }
 
 #ifndef _WIN32
    /*
-    * This is not needed for Win32 - in fact, it stops
+    * FIXME: This is not needed for Win32 - in fact, it stops
     * duplicate instances of JunkBuster from being caught.
-    *
-    * On UNIX, we assume the user is sensible enough not
-    * to start JunkBuster multiple times on the same IP.
-    * Without this, stopping and restarting JunkBuster
-    * from a script fails.
-    * Note: SO_REUSEADDR is meant to only take over
-    * sockets which are *not* in listen state in Linux,
-    * e.g. sockets in TIME_WAIT. YMMV.
+    * Is this really needed under UNIX, or should it be taked out?
+    * -- Jon
     */
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
 #endif /* ndef _WIN32 */
@@ -576,7 +399,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
       if (errno == EADDRINUSE)
 #endif
       {
-         return(-3);
+         return(-2);
       }
       else
       {
@@ -592,8 +415,7 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
       }
    }
 
-   *pfd = fd;
-   return 0;
+   return fd;
 
 }
 
@@ -614,80 +436,39 @@ int bind_port(const char *hostnam, int portnum, jb_socket *pfd)
  *                On an error it returns 0 (FALSE).
  *
  *********************************************************************/
-int accept_connection(struct client_state * csp, jb_socket fd)
+int accept_connection(struct client_state * csp, int fd)
 {
-   struct sockaddr_in client, server;
+   struct sockaddr raddr, laddr;
+   struct sockaddr_in *rap = (struct sockaddr_in *) &raddr;
+   struct sockaddr_in *lap = (struct sockaddr_in *) &laddr;
    struct hostent *host = NULL;
-   jb_socket afd;
-#if defined(_WIN32) || defined(__OS2__)
-   /* Wierdness - fix a warning. */
-   int c_length, s_length;
-#else
-   size_t c_length, s_length;
-#endif
-#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS) ||  defined(HAVE_GETHOSTBYADDR_R_7_ARGS) || defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-   struct hostent result;
-#if defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-   struct hostent_data hdata;
-#else
-   char hbuf[HOSTENT_BUFFER_SIZE];
-   int thd_err;
-#endif /* def HAVE_GETHOSTBYADDR_R_5_ARGS */
-#endif /* def HAVE_GETHOSTBYADDR_R_(8|7|5)_ARGS */
+   int   afd, raddrlen, laddrlen;
+   extern int h_errno;
+   char *p;
 
-   c_length = s_length = sizeof(client);
-
-#ifdef _WIN32
-   afd = accept (fd, (struct sockaddr *) &client, &c_length);
-   if (afd == JB_INVALID_SOCKET)
-   {
-      return 0;
-   }
-#else
+   raddrlen = sizeof raddr;
    do
    {
-      afd = accept (fd, (struct sockaddr *) &client, &c_length);
+      afd = accept (fd, &raddr, &raddrlen);
    } while (afd < 1 && errno == EINTR);
+
    if (afd < 0)
    {
       return 0;
    }
-#endif
 
    /* 
     * Determine the IP-Adress that the client used to reach us
     * and the hostname associated with that address
     */
-   if (!getsockname(afd, (struct sockaddr *) &server, &s_length))
+   if (!getsockname(afd, &laddr, &laddrlen))
    {
-      csp->my_ip_addr_str = strdup(inet_ntoa(server.sin_addr));
-#if defined(HAVE_GETHOSTBYADDR_R_8_ARGS)
-      gethostbyaddr_r((const char *)&server.sin_addr,
-                      sizeof(server.sin_addr), AF_INET,
-                      &result, hbuf, HOSTENT_BUFFER_SIZE,
-                      &host, &thd_err);
-#elif defined(HAVE_GETHOSTBYADDR_R_7_ARGS)
-      host = gethostbyaddr_r((const char *)&server.sin_addr,
-                      sizeof(server.sin_addr), AF_INET,
-                      &result, hbuf, HOSTENT_BUFFER_SIZE, &thd_err);
-#elif defined(HAVE_GETHOSTBYADDR_R_5_ARGS)
-      if (0 == gethostbyaddr_r((const char *)&server.sin_addr,
-                               sizeof(server.sin_addr), AF_INET,
-                               &result, &hdata))
-      {
-         host = &result;
-      }
-      else
-      {
-         host = NULL;
-      }
-#else
-      host = gethostbyaddr((const char *)&server.sin_addr, 
-                           sizeof(server.sin_addr), AF_INET);
-#endif
+      csp->my_ip_addr_str = strdup(inet_ntoa(lap->sin_addr));
+
+      host = gethostbyaddr(laddr.sa_data + 2, 4, AF_INET);
       if (host == NULL)
       {
-         log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %E\n");
+         log_error(LOG_LEVEL_ERROR, "Unable to get my own hostname: %s\n", hstrerror(h_errno)); 
       }
       else
       {
@@ -696,8 +477,8 @@ int accept_connection(struct client_state * csp, jb_socket fd)
    }
 
    csp->cfd    = afd;
-   csp->ip_addr_str  = strdup(inet_ntoa(client.sin_addr));
-   csp->ip_addr_long = ntohl(client.sin_addr.s_addr);
+   csp->ip_addr_str  = strdup(inet_ntoa(rap->sin_addr));
+   csp->ip_addr_long = ntohl(rap->sin_addr.s_addr);
 
    return 1;
 
@@ -714,22 +495,13 @@ int accept_connection(struct client_state * csp, jb_socket fd)
  * Parameters  :
  *          1  :  host = hostname to resolve
  *
- * Returns     :  INADDR_NONE => failure, INADDR_ANY or tcp/ip address if succesful.
+ * Returns     :  -1 => failure, INADDR_ANY or tcp/ip address if succesful.
  *
  *********************************************************************/
-unsigned long resolve_hostname_to_ip(const char *host)
+int resolve_hostname_to_ip(const char *host)
 {
    struct sockaddr_in inaddr;
    struct hostent *hostp;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS) || defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
-   struct hostent result;
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS) || defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
-   char hbuf[HOSTENT_BUFFER_SIZE];
-   int thd_err;
-#else /* defined(HAVE_GETHOSTBYNAME_R_3_ARGS) */
-   struct hostent_data hdata;
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5)_ARGS */
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
 
    if ((host == NULL) || (*host == '\0'))
    {
@@ -740,29 +512,10 @@ unsigned long resolve_hostname_to_ip(const char *host)
 
    if ((inaddr.sin_addr.s_addr = inet_addr(host)) == -1)
    {
-#if defined(HAVE_GETHOSTBYNAME_R_6_ARGS)
-      gethostbyname_r(host, &result, hbuf,
-                      HOSTENT_BUFFER_SIZE, &hostp, &thd_err);
-#elif defined(HAVE_GETHOSTBYNAME_R_5_ARGS)
-      hostp = gethostbyname_r(host, &result, hbuf,
-                      HOSTENT_BUFFER_SIZE, &thd_err);
-#elif defined(HAVE_GETHOSTBYNAME_R_3_ARGS)
-      if (0 == gethostbyname_r(host, &result, &hdata))
-      {
-         hostp = &result;
-      }
-      else
-      {
-         hostp = NULL;
-      }
-#else
-      hostp = gethostbyname(host);
-#endif /* def HAVE_GETHOSTBYNAME_R_(6|5|3)_ARGS */
-      if (hostp == NULL)
+      if ((hostp = gethostbyname(host)) == NULL)
       {
          errno = EINVAL;
-         log_error(LOG_LEVEL_ERROR, "could not resolve hostname %s", host);
-         return(INADDR_NONE);
+         return(-1);
       }
       if (hostp->h_addrtype != AF_INET)
       {
@@ -770,9 +523,8 @@ unsigned long resolve_hostname_to_ip(const char *host)
          errno = WSAEPROTOTYPE;
 #else
          errno = EPROTOTYPE;
-#endif 
-         log_error(LOG_LEVEL_ERROR, "hostname %s resolves to unknown address type.", host);
-         return(INADDR_NONE);
+#endif
+         return(-1);
       }
       memcpy(
          (char *) &inaddr.sin_addr,
index 3139330..7c1ee58 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef JBSOCKETS_H_INCLUDED
-#define JBSOCKETS_H_INCLUDED
-#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
+#ifndef _JBSOCKETS_H
+#define _JBSOCKETS_H
+#define JBSOCKETS_H_VERSION "$Id: jbsockets.h,v 1.1.1.1 2001/05/15 13:58:54 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jbsockets.h,v $
@@ -11,7 +11,7 @@
  *                on many platforms.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: jbsockets.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.5  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.4  2002/03/07 03:51:36  oes
- *     - Improved handling of failed DNS lookups
- *     - Fixed compiler warnings etc
- *
- *    Revision 1.3  2001/07/29 19:01:11  jongfoster
- *    Changed _FILENAME_H to FILENAME_H_INCLUDED.
- *    Added forward declarations for needed structures.
- *
- *    Revision 1.2  2001/06/07 23:06:09  jongfoster
- *    The host parameter to connect_to() is now const.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:54  oes
  *    Initial import of version 2.9.3 source tree
  *
  *********************************************************************/
 \f
 
-#include "project.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct client_state;
-
-extern jb_socket connect_to(const char *host, int portnum, struct client_state *csp);
-extern int write_socket(jb_socket fd, const char *buf, size_t n);
-extern int read_socket(jb_socket fd, char *buf, int n);
-extern void close_socket(jb_socket fd);
+extern int connect_to(const char *host, int portnum, struct client_state *csp);
+extern int write_socket(int fd, const char *buf, int n);
+extern int read_socket(int fd, char *buf, int n);
+extern void close_socket(int fd);
 
-extern int bind_port(const char *hostnam, int portnum, jb_socket *pfd);
-extern int accept_connection(struct client_state * csp, jb_socket fd);
+extern int bind_port(const char *hostnam, int portnum);
+extern int accept_connection(struct client_state * csp, int fd);
 
-extern unsigned long resolve_hostname_to_ip(const char *host);
+extern int resolve_hostname_to_ip(const char *host);
 
 /* Revision control strings from this header and associated .c file */
 extern const char jbsockets_rcs[];
@@ -111,7 +66,7 @@ extern const char jbsockets_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef JBSOCKETS_H_INCLUDED */
+#endif /* ndef _JBSOCKETS_H */
 
 /*
   Local Variables:
diff --git a/jcc.c b/jcc.c
index f3cd6e9..cbc88ce 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,19 +1,19 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.21 2001/06/29 13:29:36 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
  *
- * Purpose     :  Main file.  Contains main() method, main loop, and
+ * Purpose     :  Main file.  Contains main() method, main loop, and 
  *                the main connection-handling function.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -33,310 +33,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
  *
  * Revisions   :
  *    $Log: jcc.c,v $
- *    Revision 1.87  2002/03/26 22:29:54  swa
- *    we have a new homepage!
- *
- *    Revision 1.86  2002/03/25 17:04:55  david__schmidt
- *    Workaround for closing the jarfile before load_config() comes around again
- *
- *    Revision 1.85  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.84  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.83  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.82  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.81  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.80  2002/03/11 22:07:05  david__schmidt
- *    OS/2 port maintenance:
- *    - Fixed EMX build - it had decayed a little
- *    - Fixed inexplicable crash during FD_ZERO - must be due to a bad macro.
- *      substituted a memset for now.
- *
- *    Revision 1.79  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.78  2002/03/08 21:35:04  oes
- *    Added optional group supplement to --user option. Will now use default group of user if no group given
- *
- *    Revision 1.77  2002/03/07 03:52:06  oes
- *     - Fixed compiler warnings etc
- *     - Improved handling of failed DNS lookups
- *
- *    Revision 1.76  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.75  2002/03/06 10:02:19  oes
- *    Fixed stupid bug when --user was not given
- *
- *    Revision 1.74  2002/03/06 00:49:31  jongfoster
- *    Fixing warning on Windows
- *    Making #ifdefs that refer to the same variable consistently
- *    use #ifdef unix rather than mixing #ifdef unix & #ifndef OS2
- *
- *    Revision 1.73  2002/03/05 23:57:30  hal9
- *    Stray character 's' on line 1618 was breaking build.
- *
- *    Revision 1.72  2002/03/05 21:33:45  david__schmidt
- *    - Re-enable OS/2 building after new parms were added
- *    - Fix false out of memory report when resolving CGI templates when no IP
- *      address is available of failed attempt (a la no such domain)
- *
- *    Revision 1.71  2002/03/05 18:13:56  oes
- *    Added --user option
- *
- *    Revision 1.70  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.69  2002/03/04 23:50:00  jongfoster
- *    Splitting off bind_port() call into bind_port_helper(), with
- *    improved logging.
- *
- *    Revision 1.68  2002/03/04 20:17:32  oes
- *    Fixed usage info
- *
- *    Revision 1.67  2002/03/04 18:18:57  oes
- *    - Removed _DEBUG mode
- *    - Cleand up cmdline parsing
- *    - Introduced --no-daemon, --pidfile options
- *    - Cleaned up signal handling:
- *      - Terminate cleanly on INT, TERM and ABRT
- *      - Schedule logfile for re-opening on HUP
- *      - Ignore CHLD and PIPE
- *      - Leave the rest with their default handlers
- *      - Uniform handler registration
- *    - Added usage() function
- *    - Played styleguide police
- *
- *    Revision 1.66  2002/03/03 15:06:55  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.65  2002/03/03 14:49:11  oes
- *    Fixed CLF logging: Now uses client's original HTTP request
- *
- *    Revision 1.64  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.63  2002/03/02 04:14:50  david__schmidt
- *    Clean up a little CRLF unpleasantness that suddenly appeared
- *
- *    Revision 1.62  2002/02/20 23:17:23  jongfoster
- *    Detecting some out-of memory conditions and exiting with a log message.
- *
- *    Revision 1.61  2002/01/17 21:01:52  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.60  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.59  2001/12/13 14:07:18  oes
- *    Fixed Bug: 503 error page now sent OK
- *
- *    Revision 1.58  2001/11/30 23:37:24  jongfoster
- *    Renaming the Win32 config file to config.txt - this is almost the
- *    same as the corresponding UNIX name "config"
- *
- *    Revision 1.57  2001/11/16 00:47:43  jongfoster
- *    Changing the tty-disconnection code to use setsid().
- *
- *    Revision 1.56  2001/11/13 20:20:54  jongfoster
- *    Tabs->spaces, fixing a bug with missing {} around an if()
- *
- *    Revision 1.55  2001/11/13 20:14:53  jongfoster
- *    Patch for FreeBSD setpgrp() as suggested by Alexander Lazic
- *
- *    Revision 1.54  2001/11/07 00:03:14  steudten
- *    Give reliable return value if an error
- *    occurs not just 0 with new daemon mode.
- *
- *    Revision 1.53  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.52  2001/10/26 20:11:20  jongfoster
- *    Fixing type mismatch
- *
- *    Revision 1.51  2001/10/26 17:38:28  oes
- *    Cosmetics
- *
- *    Revision 1.50  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.49  2001/10/23 21:41:35  jongfoster
- *    Added call to initialize the (statically-allocated of course)
- *    "out of memory" CGI response.
- *
- *    Revision 1.48  2001/10/10 19:56:46  jongfoster
- *    Moving some code that wasn't cookie-related out of an #ifdef
- *    FEATURE_COOKIE_JAR
- *
- *    Revision 1.47  2001/10/10 16:44:36  oes
- *    Added CONNECT destination port limitation check
- *
- *    Revision 1.46  2001/10/08 15:17:41  oes
- *    Re-enabled SSL forwarding
- *
- *    Revision 1.45  2001/10/07 15:42:11  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Moved downgrading of the HTTP version from parse_http_request to
- *      chat(), since we can't decide if it is necessary before we have
- *      determined the actions for the URL. The HTTP command is now
- *      *always* re-built so the repairs need no longer be special-cased.
- *
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Bugfix
- *
- *    Added configurable size limit for the IOB. If the IOB grows so
- *      large that the next read would exceed the limit, the header
- *      is generated, and the header & unfiltered buffer are flushed
- *      to the client. Chat then continues in non-buffering,
- *      non-filtering body mode.
- *
- *    Revision 1.44  2001/10/02 18:13:57  oes
- *    Ooops
- *
- *    Revision 1.43  2001/10/02 15:32:13  oes
- *    Moved generation of hdr
- *
- *    Revision 1.42  2001/09/21 23:02:02  david__schmidt
- *    Cleaning up 2 compiler warnings on OS/2.
- *
- *    Revision 1.41  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.40  2001/09/16 15:41:45  jongfoster
- *    Fixing signed/unsigned comparison warning.
- *
- *    Revision 1.39  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.38  2001/09/16 13:01:46  jongfoster
- *    Removing redundant function call that zeroed zalloc()'d memory.
- *
- *    Revision 1.37  2001/09/10 11:12:24  oes
- *    Deleted unused variable
- *
- *    Revision 1.36  2001/09/10 10:56:15  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.35  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.34  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.33  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.32  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.31  2001/07/29 12:17:48  oes
- *    Applied pthread fix by Paul Lieverse
- *
- *    Revision 1.30  2001/07/25 22:57:13  jongfoster
- *    __BEOS__ no longer overrides FEATURE_PTHREAD.
- *    This is because FEATURE_PTHREAD will soon be widely used, so I
- *    want to keep it simple.
- *
- *    Revision 1.29  2001/07/24 12:47:06  oes
- *    Applied BeOS support update by Eugenia
- *
- *    Revision 1.28  2001/07/23 13:26:12  oes
- *    Fixed bug in popup-killing for the first read that caused binary garbage to be sent between headers and body
- *
- *    Revision 1.27  2001/07/19 19:09:47  haroon
- *    - Added code to take care of the situation where while processing the first
- *      server response (which includes the server header), after finding the end
- *      of the headers we were not looking past the end of the headers for
- *      content modification. I enabled it for filter_popups.
- *      Someone else should look to see if other similar operations should be
- *      done to the discarded portion of the buffer.
- *
- *      Note 2001/07/20: No, the other content modification mechanisms will process
- *                       the whole iob later anyway. --oes
- *
- *    Revision 1.26  2001/07/18 12:31:36  oes
- *    cosmetics
- *
- *    Revision 1.25  2001/07/15 19:43:49  jongfoster
- *    Supports POSIX threads.
- *    Also removed some unused #includes.
- *
- *    Revision 1.24  2001/07/13 14:00:40  oes
- *     - Generic content modification scheme:
- *       Each feature has its own applicability flag that is set
- *       from csp->action->flags.
- *       Replaced the "filtering" int flag , by a function pointer
- *       "content_filter" to the function that will do the content
- *       modification. If it is != NULL, the document will be buffered
- *       and processed through *content_filter, which must set
- *       csp->content_length and return a modified copy of the body
- *       or return NULL (on failiure).
- *     - Changed csp->is_text to the more generic bitmap csp->content_type
- *       which can currently take the valued CT_TEXT or CT_GIF
- *     - Reformatting etc
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.23  2001/07/02 02:28:25  iwanttokeepanon
- *    Added "#ifdef ACL_FILES" conditional compilation to line 1291 to exclude
- *    the `block_acl' call.  This prevents a compilation error when the user
- *    does not wish to use the "ACL" feature.
- *
- *    Revision 1.22  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.21  2001/06/29 13:29:36  oes
  *    - Cleaned up, improved comments
  *    - Unified all possible interceptors (CGI,
@@ -521,15 +217,15 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #include <fcntl.h>
 #include <errno.h>
 
-#ifdef FEATURE_PTHREAD
-#include <pthread.h>
-#endif /* def FEATURE_PTHREAD */
-
 #ifdef _WIN32
-# ifndef FEATURE_PTHREAD
-#  include <windows.h>
-#  include <process.h>
-# endif /* ndef FEATURE_PTHREAD */
+
+# include <sys/timeb.h>
+# include <windows.h>
+# include <io.h>
+# include <process.h>
+# ifdef TOGGLE
+#  include <time.h>
+# endif /* def TOGGLE */
 
 # include "win32.h"
 # ifndef _WIN_CONSOLE
@@ -538,23 +234,10 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 
 #else /* ifndef _WIN32 */
 
-# if !defined (__OS2__)
 # include <unistd.h>
-# include <sys/wait.h>
-# endif /* ndef __OS2__ */
 # include <sys/time.h>
+# include <sys/wait.h>
 # include <sys/stat.h>
-# include <sys/ioctl.h>
-
-#ifdef sun
-#include <sys/termios.h>
-#endif /* sun */
-
-#ifdef unix
-#include <pwd.h>
-#include <grp.h>
-#endif
-
 # include <signal.h>
 
 # ifdef __BEOS__
@@ -562,15 +245,6 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #  include <OS.h>      /* declarations for threads and stuff. */
 # endif
 
-# if defined(__EMX__) || defined(__OS2__)
-#  include <sys/select.h>  /* OS/2/EMX needs a little help with select */
-# endif
-# ifdef __OS2__
-#define INCL_DOS
-# include <os2.h>
-#define bzero(B,N) memset(B,0x00,n)
-# endif
-
 # ifndef FD_ZERO
 #  include <select.h>
 # endif
@@ -582,6 +256,7 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #include "jcc.h"
 #include "filters.h"
 #include "loaders.h"
+#include "showargs.h"
 #include "parsers.h"
 #include "killpopup.h"
 #include "miscutil.h"
@@ -590,24 +265,18 @@ const char jcc_rcs[] = "$Id: jcc.c,v 1.87 2002/03/26 22:29:54 swa Exp $";
 #include "gateway.h"
 #include "actions.h"
 #include "cgi.h"
-#include "loadcfg.h"
-#include "urlmatch.h"
 
 const char jcc_h_rcs[] = JCC_H_VERSION;
 const char project_h_rcs[] = PROJECT_H_VERSION;
 
-int no_daemon = 0;
 struct client_state  clients[1];
 struct file_list     files[1];
 
-#ifdef FEATURE_STATISTICS
+#ifdef STATISTICS
 int urls_read     = 0;     /* total nr of urls read inc rejected */
 int urls_rejected = 0;     /* total nr of urls rejected */
-#endif /* def FEATURE_STATISTICS */
+#endif /* def STATISTICS */
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-int g_terminate = 0;
-#endif
 
 static void listen_loop(void);
 static void chat(struct client_state *csp);
@@ -625,15 +294,6 @@ static int32 server_thread(void *data);
 #define sleep(N)  Sleep(((N) * 1000))
 #endif
 
-#ifdef __OS2__
-#define sleep(N)  DosSleep(((N) * 100))
-#endif
-
-#if defined(unix) || defined(__EMX__)
-const char *basedir;
-const char *pidfile = NULL;
-int received_hup_signal = 0;
-#endif /* defined unix */
 
 /* The vanilla wafer. */
 static const char VANILLA_WAFER[] =
@@ -646,60 +306,13 @@ static const char VANILLA_WAFER[] =
    "(copyright_or_otherwise)_applying_to_any_cookie._";
 
 
-#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
-/*********************************************************************
- *
- * Function    :  sig_handler 
- *
- * Description :  Signal handler for different signals.
- *                Exit gracefully on ABRT, TERM and  INT
- *                or set a flag that will cause the errlog
- *                to be reopened by the main thread on HUP.
- *
- * Parameters  :
- *          1  :  the_signal = the signal cause this function to call
- *
- * Returns     :  - 
- *
- *********************************************************************/
-static void sig_handler(int the_signal)
-{
-   switch(the_signal)
-   {
-      case SIGABRT:
-      case SIGTERM:
-      case SIGINT:
-         log_error(LOG_LEVEL_INFO, "exiting by signal %d .. bye", the_signal);
-#if defined(unix)
-         unlink(pidfile);
-#endif /* unix */
-         exit(the_signal);
-         break;
-
-      case SIGHUP:
-         received_hup_signal = 1;
-         break;         
-
-      default:
-         /* 
-          * We shouldn't be here, unless we catch signals
-          * in main() that we can't handle here!
-          */
-         log_error(LOG_LEVEL_FATAL, "sig_handler: exiting on unexpected signal %d", the_signal);
-   }
-   return;
-
-}
-#endif
-
-
 /*********************************************************************
  *
  * Function    :  chat
  *
  * Description :  Once a connection to the client has been accepted,
  *                this function is called (via serve()) to handle the
- *                main business of the communication.  When this
+ *                main business of the communication.  When this 
  *                function returns, the caller must close the client
  *                socket handle.
  *
@@ -717,49 +330,40 @@ static void sig_handler(int the_signal)
 static void chat(struct client_state *csp)
 {
 /*
- * This next lines are a little ugly, but they simplifies the if statements
- * below.  Basically if TOGGLE, then we want the if to test if the
- * CSP_FLAG_TOGGLED_ON flag ist set, else we don't.  And if FEATURE_FORCE_LOAD,
- * then we want the if to test for CSP_FLAG_FORCED , else we don't
+ * This next lines are a little ugly, but they simplifies the if statements below.
+ * Basically if TOGGLE, then we want the if to test "csp->toggled_on", else we don't
+ * And if FORCE_LOAD, then we want the if to test "csp->toggled_on", else we don't
  */
-#ifdef FEATURE_TOGGLE
-#   define IS_TOGGLED_ON_AND (csp->flags & CSP_FLAG_TOGGLED_ON) &&
-#else /* ifndef FEATURE_TOGGLE */
+#ifdef TOGGLE
+#   define IS_TOGGLED_ON_AND (csp->toggled_on) &&
+#else /* ifndef TOGGLE */
 #   define IS_TOGGLED_ON_AND
-#endif /* ndef FEATURE_TOGGLE */
-#ifdef FEATURE_FORCE_LOAD
-#   define IS_NOT_FORCED_AND !(csp->flags & CSP_FLAG_FORCED) &&
-#else /* ifndef FEATURE_FORCE_LOAD */
+#endif /* ndef TOGGLE */
+#ifdef FORCE_LOAD
+#   define IS_NOT_FORCED_AND (!csp->force) && 
+#else /* ifndef FORCE_LOAD */
 #   define IS_NOT_FORCED_AND
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
 
 #define IS_ENABLED_AND   IS_TOGGLED_ON_AND IS_NOT_FORCED_AND
 
    char buf[BUFFER_SIZE];
-   char *hdr;
-   char *p;
-   char *req;
+   char *hdr, *p, *req;
+   char *err = NULL;
    fd_set rfds;
-   int n;
-   jb_socket maxfd;
-   int server_body;
+   int n, maxfd, server_body;
    int ms_iis5_hack = 0;
    int byte_count = 0;
    const struct forward_spec * fwd;
    struct http_request *http;
-   int len; /* for buffer sizes */
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
    int block_popups;         /* bool, 1==will block popups */
    int block_popups_now = 0; /* bool, 1==currently blocking popups */
-#endif /* def FEATURE_KILL_POPUPS */
-
-   int pcrs_filter;        /* bool, 1==will filter through pcrs */
-   int gif_deanimate;      /* bool, 1==will deanimate gifs */
-
-   /* Function that does the content filtering for the current request */
-   char *(*content_filter)() = NULL;
-
-   /* Skeleton for HTTP response, if we should intercept the request */
+#endif /* def KILLPOPUPS */
+#ifdef PCRS
+   int pcrs_filter;   /* bool, 1==will filter through pcrs */
+   int filtering = 0; /* bool, 1==currently filtering through pcrs */
+#endif /* def PCRS */
    struct http_response *rsp;
 
    http = csp->http;
@@ -769,13 +373,13 @@ static void chat(struct client_state *csp)
     * could get blocked here if a client connected, then didn't say anything!
     */
 
-   for (;;)
+   while (FOREVER)
    {
-      len = read_socket(csp->cfd, buf, sizeof(buf));
+      n = read_socket(csp->cfd, buf, sizeof(buf));
 
-      if (len <= 0) break;      /* error! */
+      if (n <= 0) break;      /* error! */
 
-      add_to_iob(csp, buf, len);
+      add_to_iob(csp, buf, n);
 
       req = get_header(csp);
 
@@ -788,8 +392,8 @@ static void chat(struct client_state *csp)
       {
          continue;   /* more to come! */
       }
-
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
       /* If this request contains the FORCE_PREFIX,
        * better get rid of it now and set the force flag --oes
        */
@@ -798,11 +402,14 @@ static void chat(struct client_state *csp)
       {
          strclean(req, FORCE_PREFIX);
          log_error(LOG_LEVEL_FORCE, "Enforcing request \"%s\".\n", req);
-         csp->flags |= CSP_FLAG_FORCED;
+         csp->force = 1;
+      } 
+      else
+      {
+         csp->force = 0;
       }
-
-#endif /* def FEATURE_FORCE_LOAD */
-
+#endif /* def FORCE_LOAD */
+  
       parse_http_request(req, http, csp);
       freez(req);
       break;
@@ -830,171 +437,98 @@ static void chat(struct client_state *csp)
     * we have to do one of the following:
     *
     * create = use the original HTTP request to create a new
-    *          HTTP request that has either the path component
-    *          without the http://domainspec (w/path) or the
-    *          full orininal URL (w/url)
-    *          Note that the path and/or the HTTP version may
-    *          have been altered by now.
-    *
-    * connect = Open a socket to the host:port of the server
-    *           and short-circuit server and client socket.
+    *          HTTP request that has only the path component
+    *          without the http://domainspec
+    * pass   = pass the original HTTP request unchanged
     *
-    * pass =  Pass the request unchanged if forwarding a CONNECT
-    *         request to a parent proxy. Note that we'll be sending
-    *         the CFAIL message ourselves if connecting to the parent
-    *         fails, but we won't send a CSUCCEED message if it works,
-    *         since that would result in a double message (ours and the
-    *         parent's). After sending the request to the parent, we simply
-    *         tunnel.
+    * drop   = drop the HTTP request
     *
     * here's the matrix:
     *                        SSL
     *                    0        1
     *                +--------+--------+
     *                |        |        |
-    *             0  | create | connect|
-    *                | w/path |        |
+    *             0  | create | drop   |
+    *                |        |        |
     *  Forwarding    +--------+--------+
     *                |        |        |
-    *             1  | create | pass   |
-    *                | w/url  |        |
+    *             1  | pass   | pass   |
+    *                |        |        |
     *                +--------+--------+
     *
     */
 
-   /*
-    * Determine the actions for this URL
-    */
-#ifdef FEATURE_TOGGLE
-   if (!(csp->flags & CSP_FLAG_TOGGLED_ON))
+   if (fwd->forward_host)
    {
-      /* Most compatible set of actions (i.e. none) */
-      init_current_action(csp->action);
+      /* if forwarding, just pass the request as is */
+      enlist(csp->headers, http->cmd);
    }
    else
-#endif /* ndef FEATURE_TOGGLE */
    {
-      url_actions(http, csp);
-   }
-
-
-   /*
-    * Check if a CONNECT request is allowable:
-    * In the absence of a +limit-connect action, allow only port 443.
-    * If there is an action, allow whatever matches the specificaton.
-    */
-   if(http->ssl)
-   {
-      if(  ( !(csp->action->flags & ACTION_LIMIT_CONNECT) && csp->http->port != 443)
-           || (csp->action->flags & ACTION_LIMIT_CONNECT
-              && !match_portlist(csp->action->string[ACTION_STRING_LIMIT_CONNECT], csp->http->port)) )
+      if (http->ssl == 0)
       {
-         strcpy(buf, CFORBIDDEN);
-         write_socket(csp->cfd, buf, strlen(buf));
-
-         log_error(LOG_LEVEL_CONNECT, "Denying suspicious CONNECT request from %s", csp->ip_addr_str);
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \" \" 403 0", csp->ip_addr_str);
-
-         return;
+         /* otherwise elide the host information from the url */
+         p = NULL;
+         p = strsav(p, http->gpc);
+         p = strsav(p, " ");
+         p = strsav(p, http->path);
+         p = strsav(p, " ");
+         p = strsav(p, http->ver);
+         enlist(csp->headers, p);
+         freez(p);
       }
    }
 
+   /* decide what we're to do with cookies */
 
-   /*
-    * Downgrade http version from 1.1 to 1.0 if +downgrade
-    * action applies
-    */
-   if ( (http->ssl == 0)
-     && (!strcmpic(http->ver, "HTTP/1.1"))
-     && (csp->action->flags & ACTION_DOWNGRADE))
+#ifdef TOGGLE
+   if (!csp->toggled_on)
    {
-      freez(http->ver);
-      http->ver = strdup("HTTP/1.0");
-
-      if (http->ver == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "Out of memory downgrading HTTP version");
-      }
-   }
-
-   /* 
-    * Save a copy of the original request for logging
-    */
-   http->ocmd = strdup(http->cmd);
-
-   if (http->ocmd == NULL)
-   {
-      log_error(LOG_LEVEL_FATAL, "Out of memory copying HTTP request line");
+      /* Most compatible set of actions (i.e. none) */
+      init_current_action(csp->action);
    }
-
-   /*
-    * (Re)build the HTTP request for non-SSL requests.
-    * If forwarding, use the whole URL, else, use only the path.
-    */
-   if (http->ssl == 0)
+   else
+#endif /* ndef TOGGLE */
    {
-      freez(http->cmd);
-
-      http->cmd = strdup(http->gpc);
-      string_append(&http->cmd, " ");
-
-      if (fwd->forward_host)
-      {
-         string_append(&http->cmd, http->url);
-      }
-      else
-      {
-         string_append(&http->cmd, http->path);
-      }
-
-      string_append(&http->cmd, " ");
-      string_append(&http->cmd, http->ver);
-
-      if (http->cmd == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "Out of memory rewiting SSL command");
-      }
+      url_actions(http, csp);
    }
-   enlist(csp->headers, http->cmd);
-
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    /*
     * If we're logging cookies in a cookie jar, and the user has not
     * supplied any wafers, and the user has not told us to suppress the
     * vanilla wafer, then send the vanilla wafer.
     */
    if ((csp->config->jarfile != NULL)
-       && list_is_empty(csp->action->multi[ACTION_MULTI_WAFER])
+       && (csp->action->multi[ACTION_MULTI_WAFER]->next == NULL)
        && ((csp->action->flags & ACTION_VANILLA_WAFER) != 0))
    {
       enlist(csp->action->multi[ACTION_MULTI_WAFER], VANILLA_WAFER);
    }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
-
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
    block_popups               = ((csp->action->flags & ACTION_NO_POPUPS) != 0);
-#endif /* def FEATURE_KILL_POPUPS */
-
+#endif /* def KILLPOPUPS */
+#ifdef PCRS
    pcrs_filter                = (csp->rlist != NULL) &&  /* There are expressions to be used */
-                                (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER]));
+                                ((csp->action->flags & ACTION_FILTER) != 0);
+#endif /* def PCRS */
 
-   gif_deanimate              = ((csp->action->flags & ACTION_DEANIMATE) != 0);
 
    /* grab the rest of the client's headers */
 
-   for (;;)
+   while (FOREVER)
    {
-      if ( ( ( p = get_header(csp) ) != NULL) && ( *p == '\0' ) )
+      if ( ( p = get_header(csp) ) && ( *p == '\0' ) )
       {
-         len = read_socket(csp->cfd, buf, sizeof(buf));
-         if (len <= 0)
+         n = read_socket(csp->cfd, buf, sizeof(buf));
+         if (n <= 0)
          {
             log_error(LOG_LEVEL_ERROR, "read from client failed: %E");
             return;
          }
-         add_to_iob(csp, buf, len);
+         add_to_iob(csp, buf, n);
          continue;
       }
 
@@ -1003,52 +537,59 @@ static void chat(struct client_state *csp)
       enlist(csp->headers, p);
       freez(p);
    }
-   /*
-    * We have a request. Now, check to see if we need to
-    * intercept it, i.e. If ..
-    */
 
+   /* We have a request. */
+
+   hdr = sed(client_patterns, add_client_headers, csp);
+   destroy_list(csp->headers);
+
+   /* 
+    * Now, check to see if we need to intercept it, i.e.
+    * If
+    */
    if (
        /* a CGI call was detected and answered */
-       (NULL != (rsp = dispatch_cgi(csp)))
+        (NULL != (rsp = dispatch_cgi(csp))) 
 
        /* or we are enabled and... */
        || (IS_ENABLED_AND (
 
             /* ..the request was blocked */
-          ( NULL != (rsp = block_url(csp)))
+           ( NULL != (rsp = block_url(csp)))
 
           /* ..or untrusted */
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
           || ( NULL != (rsp = trust_url(csp)))
-#endif /* def FEATURE_TRUST */
+#endif 
 
           /* ..or a fast redirect kicked in */
-#ifdef FEATURE_FAST_REDIRECTS
-          || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) &&
-                (NULL != (rsp = redirect_url(csp))))
-#endif /* def FEATURE_FAST_REDIRECTS */
-          ))
-      )
+#ifdef FAST_REDIRECTS
+          || (((csp->action->flags & ACTION_FAST_REDIRECTS) != 0) && 
+                    (NULL != (rsp = redirect_url(csp))))
+#endif /* def FAST_REDIRECTS */
+                ))
+       )
    {
       /* Write the answer to the client */
-      if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-       || write_socket(csp->cfd, rsp->body, rsp->content_length))
-      {
+      if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+            || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+      { 
          log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
       }
 
-#ifdef FEATURE_STATISTICS
+#ifdef STATISTICS
       /* Count as a rejected request */
-      csp->flags |= CSP_FLAG_REJECTED;
-#endif /* def FEATURE_STATISTICS */
+      csp->rejected = 1;
+#endif /* def STATISTICS */
 
       /* Log (FIXME: All intercept reasons apprear as "crunch" with Status 200) */
       log_error(LOG_LEVEL_GPC, "%s%s crunch!", http->hostport, http->path);
-      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->ocmd);
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 3", csp->ip_addr_str, http->cmd); 
 
       /* Clean up and return */
       free_http_response(rsp);
+      freez(hdr);
       return;
    }
 
@@ -1068,74 +609,67 @@ static void chat(struct client_state *csp)
 
    csp->sfd = forwarded_connect(fwd, http, csp);
 
-   if (csp->sfd == JB_INVALID_SOCKET)
+   if (csp->sfd < 0)
    {
       log_error(LOG_LEVEL_CONNECT, "connect to: %s failed: %E",
                 http->hostport);
 
       if (errno == EINVAL)
       {
-         rsp = error_response(csp, "no-such-domain", errno);
+          rsp = error_response(csp, "no-such-domain", errno);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 404 0", 
+                   csp->ip_addr_str, http->cmd);
       }
       else
       {
-         rsp = error_response(csp, "connect-failed", errno);
+          rsp = error_response(csp, "connect-failed", errno);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                   csp->ip_addr_str, http->cmd);
       }
 
-
       /* Write the answer to the client */
       if(rsp)
-      {
-         if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-          || write_socket(csp->cfd, rsp->body, rsp->content_length))
-         {
+       {
+         if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+               || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+         { 
             log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
          }
       }
 
       free_http_response(rsp);
+      freez(hdr);
       return;
    }
 
    log_error(LOG_LEVEL_CONNECT, "OK");
 
-   hdr = sed(client_patterns, add_client_headers, csp);
-   if (hdr == NULL)
-   {
-      /* FIXME Should handle error properly */
-      log_error(LOG_LEVEL_FATAL, "Out of memory parsing client header");
-   }
-
-   list_remove_all(csp->headers);
-
    if (fwd->forward_host || (http->ssl == 0))
    {
       /* write the client's (modified) header to the server
        * (along with anything else that may be in the buffer)
        */
 
-      if (write_socket(csp->sfd, hdr, strlen(hdr))
-       || (flush_socket(csp->sfd, csp) <  0))
+      n = strlen(hdr);
+
+      if ((write_socket(csp->sfd, hdr, n) != n)
+          || (flush_socket(csp->sfd, csp   ) <  0))
       {
          log_error(LOG_LEVEL_CONNECT, "write header to: %s failed: %E",
                     http->hostport);
 
-         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                   csp->ip_addr_str, http->ocmd);
+         log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                   csp->ip_addr_str, http->cmd); 
 
          rsp = error_response(csp, "connect-failed", errno);
 
          if(rsp)
          {
-            if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-             || write_socket(csp->cfd, rsp->body, rsp->content_length))
-            {
+            if ((write_socket(csp->cfd, rsp->head, n) != n)
+               || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+            { 
                log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
             }
          }
@@ -1152,10 +686,10 @@ static void chat(struct client_state *csp)
        * so just send the "connect succeeded" message to the
        * client, flush the rest, and get out of the way.
        */
-      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n",
-                csp->ip_addr_str, http->ocmd);
+      log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 2\n", 
+                csp->ip_addr_str, http->cmd); 
 
-      if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1))
+      if (write_socket(csp->cfd, CSUCCEED, sizeof(CSUCCEED)-1) < 0)
       {
          freez(hdr);
          return;
@@ -1174,21 +708,14 @@ static void chat(struct client_state *csp)
 
    server_body = 0;
 
-   for (;;)
+   while (FOREVER)
    {
-#ifdef __OS2__
-      /*
-       * FD_ZERO here seems to point to an errant macro which crashes.
-       * So do this by hand for now...
-       */
-      memset(&rfds,0x00,sizeof(fd_set));
-#else
       FD_ZERO(&rfds);
-#endif
+
       FD_SET(csp->cfd, &rfds);
       FD_SET(csp->sfd, &rfds);
 
-      n = select((int)maxfd+1, &rfds, NULL, NULL, NULL);
+      n = select(maxfd+1, &rfds, NULL, NULL, NULL);
 
       if (n < 0)
       {
@@ -1202,14 +729,14 @@ static void chat(struct client_state *csp)
 
       if (FD_ISSET(csp->cfd, &rfds))
       {
-         len = read_socket(csp->cfd, buf, sizeof(buf));
+         n = read_socket(csp->cfd, buf, sizeof(buf));
 
-         if (len <= 0)
+         if (n <= 0)
          {
             break; /* "game over, man" */
          }
 
-         if (write_socket(csp->sfd, buf, (size_t)len))
+         if (write_socket(csp->sfd, buf, n) != n)
          {
             log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
             return;
@@ -1220,32 +747,32 @@ static void chat(struct client_state *csp)
       /*
        * The server wants to talk.  It could be the header or the body.
        * If `hdr' is null, then it's the header otherwise it's the body.
-       * FIXME: Does `hdr' really mean `host'? No.
+       * FIXME: Does `hdr' really mean `host'?
        */
 
 
       if (FD_ISSET(csp->sfd, &rfds))
       {
          fflush( 0 );
-         len = read_socket(csp->sfd, buf, sizeof(buf) - 1);
+         n = read_socket(csp->sfd, buf, sizeof(buf) - 1);
 
-         if (len < 0)
+         if (n < 0)
          {
             log_error(LOG_LEVEL_ERROR, "read from: %s failed: %E", http->host);
 
-            log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0",
-                      csp->ip_addr_str, http->ocmd);
+            log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 503 0", 
+                      csp->ip_addr_str, http->cmd); 
 
             rsp = error_response(csp, "connect-failed", errno);
 
             if(rsp)
             {
-               if (write_socket(csp->cfd, rsp->head, rsp->head_length)
-                || write_socket(csp->cfd, rsp->body, rsp->content_length))
-               {
+               if ((write_socket(csp->cfd, rsp->head, rsp->head_length) != rsp->head_length)
+                   || (write_socket(csp->cfd, rsp->body, rsp->content_length) != rsp->content_length))
+               { 
                   log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
-               }
-            }
+                          }
+                       }
 
             free_http_response(rsp);
             return;
@@ -1254,15 +781,15 @@ static void chat(struct client_state *csp)
          /* Add a trailing zero.  This lets filter_popups
           * use string operations.
           */
-         buf[len] = '\0';
+         buf[n] = '\0';
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
          /* Filter the popups on this read. */
          if (block_popups_now)
          {
-            filter_popups(buf, csp);
+            filter_popups(buf, n);
          }
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
          /* Normally, this would indicate that we've read
           * as much as the server has sent us and we can
@@ -1282,56 +809,32 @@ static void chat(struct client_state *csp)
           * doesn't generate a valid header, then we won't
           * transmit anything to the client.
           */
-         if (len == 0)
+         if (n == 0)
          {
-
+            /* This hack must only be enforced for headers. */
             if (server_body || http->ssl)
             {
-               /*
-                * If we have been buffering up the document,
-                * now is the time to apply content modification
-                * and send the result to the client.
-                */
-               if (content_filter)
+#ifdef PCRS
+               if (filtering)
                {
-                  /*
-                   * If the content filter fails, use the original
-                   * buffer and length.
-                   * (see p != NULL ? p : csp->iob->cur below)
-                   */
-                  if (NULL == (p = (*content_filter)(csp)))
-                  {
-                     csp->content_length = csp->iob->eod - csp->iob->cur;
-                  }
-
+                  p = re_process_buffer(csp);
                   hdr = sed(server_patterns, add_server_headers, csp);
-                  if (hdr == NULL)
-                  {
-                     /* FIXME Should handle error properly */
-                     log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-                  }
-
-                  if (write_socket(csp->cfd, hdr, strlen(hdr))
-                   || write_socket(csp->cfd, p != NULL ? p : csp->iob->cur, csp->content_length))
+                  n = strlen(hdr);
+                  if ((write_socket(csp->cfd, hdr, n) != n)
+                      || (write_socket(csp->cfd, p, csp->content_length) != csp->content_length))
                   {
-                     log_error(LOG_LEVEL_ERROR, "write modified content to client failed: %E");
+                     log_error(LOG_LEVEL_CONNECT, "write modified content to client failed: %E");
                      return;
                   }
-
-                  freez(hdr);
-                  if (NULL != p) {
-                     freez(p);
-                  }
+               freez(hdr);
+               freez(p);
                }
-
+#endif /* def PCRS */
                break; /* "game over, man" */
             }
 
-            /*
-             * This is NOT the body, so
-             * Let's pretend the server just sent us a blank line.
-             */
-            len = sprintf(buf, "\r\n");
+            /* Let's pretend the server just sent us a blank line. */
+            n = sprintf(buf, "\r\n");
 
             /*
              * Now, let the normal header parsing algorithm below do its
@@ -1343,63 +846,27 @@ static void chat(struct client_state *csp)
 
          /*
           * If this is an SSL connection or we're in the body
-          * of the server document, just write it to the client,
-          * unless we need to buffer the body for later content-filtering
+          * of the server document, just write it to the client.
           */
 
          if (server_body || http->ssl)
          {
-            if (content_filter)
+#ifdef PCRS
+            if (filtering)
             {
-               add_to_iob(csp, buf, len);
-
-               /*
-                * If the buffer limit will be reached on the next read,
-                * switch to non-filtering mode, i.e. make & write the
-                * header, flush the socket and get out of the way.
-                */
-               if (((size_t)(csp->iob->eod - csp->iob->buf)) + (size_t)BUFFER_SIZE > csp->config->buffer_limit)
-               {
-                  size_t hdrlen;
-
-                  log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back.");
-
-                  hdr = sed(server_patterns, add_server_headers, csp);
-                  if (hdr == NULL)
-                  {
-                     /* FIXME Should handle error properly */
-                     log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-                  }
-
-                  hdrlen = strlen(hdr);
-                  byte_count += hdrlen;
-
-                  if (write_socket(csp->cfd, hdr, hdrlen)
-                   || ((len = flush_socket(csp->cfd, csp)) < 0))
-                  {
-                     log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
-
-                     freez(hdr);
-                     return;
-                  }
-
-                  freez(hdr);
-                  byte_count += len;
-
-                  content_filter = NULL;
-                  server_body = 1;
-
-               }
+               add_to_iob(csp, buf, n); /* Buffer the body for filtering */
             }
             else
+#endif /* def PCRS */
             {
-               if (write_socket(csp->cfd, buf, (size_t)len))
+               /* just write */
+               if (write_socket(csp->cfd, buf, n) != n)
                {
                   log_error(LOG_LEVEL_ERROR, "write to client failed: %E");
                   return;
                }
             }
-            byte_count += len;
+            byte_count += n;
             continue;
          }
          else
@@ -1410,11 +877,11 @@ static void chat(struct client_state *csp)
              */
 
             /* buffer up the data we just read */
-            add_to_iob(csp, buf, len);
+            add_to_iob(csp, buf, n);
 
             /* get header lines from the iob */
 
-            while ((p = get_header(csp)) != NULL)
+            while ((p = get_header(csp)))
             {
                if (*p == '\0')
                {
@@ -1459,73 +926,60 @@ static void chat(struct client_state *csp)
              */
 
             hdr = sed(server_patterns, add_server_headers, csp);
-            if (hdr == NULL)
-            {
-               /* FIXME Should handle error properly */
-               log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
-            }
+            n   = strlen(hdr);
+
+            /* write the server's (modified) header to
+             * the client (along with anything else that
+             * may be in the buffer)
+             */
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
             /* Start blocking popups if appropriate. */
 
-            if ((csp->content_type & CT_TEXT) &&  /* It's a text / * MIME-Type */
-                !http->ssl    &&                  /* We talk plaintext */
-                block_popups)                     /* Policy allows */
+            if (csp->is_text  &&  /* It's a text / * MIME-Type */
+                !http->ssl    &&  /* We talk plaintext */
+                block_popups)     /* Policy allows */
             {
                block_popups_now = 1;
-               /*
-                * Filter the part of the body that came in the same read
-                * as the last headers:
-                */
-               filter_popups(csp->iob->cur, csp);
             }
 
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
-            /* Buffer and pcrs filter this if appropriate. */
+#ifdef PCRS
+            /* Start re_filtering this if appropriate. */
 
-            if ((csp->content_type & CT_TEXT) &&  /* It's a text / * MIME-Type */
-                !http->ssl    &&                  /* We talk plaintext */
-                pcrs_filter)                      /* Policy allows */
+            if (csp->is_text  &&  /* It's a text / * MIME-Type */
+                !http->ssl    &&  /* We talk plaintext */
+                pcrs_filter)      /* Policy allows */
             {
-               content_filter = pcrs_filter_response;
+               filtering = 1;
             }
 
-            /* Buffer and gif_deanimate this if appropriate. */
+/* This next line is a little ugly, but it simplifies the if statement below. */
+/* Basically if using PCRS, we want the OR condition to require "!filtering"  */
+#define NOT_FILTERING_AND !filtering &&
 
-            if ((csp->content_type & CT_GIF)  &&  /* It's a image/gif MIME-Type */
-                !http->ssl    &&                  /* We talk plaintext */
-                gif_deanimate)                    /* Policy allows */
-            {
-               content_filter = gif_deanimate_response;
-            }
+#else /* not def PCRS */
 
-            /*
-             * Only write if we're not buffering for content modification
-             */
-            if (!content_filter)
-            {
-               /* write the server's (modified) header to
-                * the client (along with anything else that
-                * may be in the buffer)
-                */
+#define NOT_FILTERING_AND
 
-               if (write_socket(csp->cfd, hdr, strlen(hdr))
-                || ((len = flush_socket(csp->cfd, csp)) < 0))
-               {
-                  log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
+#endif /* def PCRS */
 
-                  /* the write failed, so don't bother
-                   * mentioning it to the client...
-                   * it probably can't hear us anyway.
-                   */
-                  freez(hdr);
-                  return;
-               }
+            if (NOT_FILTERING_AND ((write_socket(csp->cfd, hdr, n) != n)
+                || (n = flush_socket(csp->cfd, csp) < 0)))
+            {
+               log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
 
-               byte_count += len;
+               /* the write failed, so don't bother
+                * mentioning it to the client...
+                * it probably can't hear us anyway.
+                */
+               freez(hdr);
+               return;
             }
 
+            NOT_FILTERING_AND (byte_count += n);
+
             /* we're finished with the server's header */
 
             freez(hdr);
@@ -1547,8 +1001,8 @@ static void chat(struct client_state *csp)
       return; /* huh? we should never get here */
    }
 
-   log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d",
-             csp->ip_addr_str, http->ocmd, byte_count);
+   log_error(LOG_LEVEL_CLF, "%s - - [%T] \"%s\" 200 %d", 
+             csp->ip_addr_str, http->cmd, byte_count); 
 }
 
 
@@ -1574,12 +1028,12 @@ static void serve(struct client_state *csp)
    chat(csp);
    close_socket(csp->cfd);
 
-   if (csp->sfd != JB_INVALID_SOCKET)
+   if (csp->sfd >= 0)
    {
       close_socket(csp->sfd);
    }
 
-   csp->flags &= ~CSP_FLAG_ACTIVE;
+   csp->active = 0;
 
 }
 
@@ -1606,28 +1060,6 @@ static int32 server_thread(void *data)
 #endif
 
 
-/*********************************************************************
- *
- * Function    :  usage
- *
- * Description :  Print usage info & exit.
- *
- * Parameters  :  Pointer to argv[0] for identifying ourselves
- *
- * Returns     :  No. ,-)
- *
- *********************************************************************/
-void usage(const char *myname)
-{
-   printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n"
-           "Usage: %s [--help] [--version] [--no-daemon] [--pidfile pidfile] [--user user[.group]] [configfile]\n"
-           "Aborting.\n", myname);
-   exit(2);
-
-}
-
-
 /*********************************************************************
  *
  * Function    :  main
@@ -1647,116 +1079,50 @@ void usage(const char *myname)
  *                any load fails, and can't bind port.
  *
  *                Else main never returns, the process must be signaled
- *                to terminate execution.  Or, on Windows, use the
+ *                to terminate execution.  Or, on Windows, use the 
  *                "File", "Exit" menu option.
  *
  *********************************************************************/
 #ifdef __MINGW32__
-int real_main(int argc, const char *argv[])
+int _main(int argc, const char *argv[])
 #else
 int main(int argc, const char *argv[])
 #endif
 {
-   int argc_pos = 0;
-#ifdef unix
-   struct passwd *pw = NULL;
-   struct group *grp = NULL;
-   char *p;
-#endif
-
-   Argc = argc;
-   Argv = argv;
-
    configfile =
-#if !defined(_WIN32)
+#ifdef AMIGA
+   "AmiTCP:db/junkbuster/config"
+#elif !defined(_WIN32)
    "config"
 #else
-   "config.txt"
+   "junkbstr.txt"
 #endif
       ;
 
-   /*
-    * Parse the command line arguments
-    */
-   while (++argc_pos < argc)
-   {
 #if !defined(_WIN32) || defined(_WIN_CONSOLE)
-
-      if (strcmp(argv[argc_pos], "--help") == 0)
-      {
-         usage(argv[0]);
-      }
-
-      else if(strcmp(argv[argc_pos], "--version") == 0)
-      {
-         printf("Privoxy version " VERSION " (" HOME_PAGE_URL ")\n");
-         exit(0);
-      }
-
-      else if (strcmp(argv[argc_pos], "--no-daemon" ) == 0)
-      {
-         no_daemon = 1;
-      }
-#if defined(unix)
-      else if (strcmp(argv[argc_pos], "--pidfile" ) == 0)
-      {
-         if (++argc_pos == argc) usage(argv[0]);
-         pidfile = strdup(argv[argc_pos]);
-      }
-
-      else if (strcmp(argv[argc_pos], "--user" ) == 0)
-      {
-         if (++argc_pos == argc) usage(argv[argc_pos]);
-
-         if ((NULL != (p = strchr(argv[argc_pos], '.'))) && *(p + 1) != '0')
-         {
-            *p++ = '\0';
-            if (NULL == (grp = getgrnam(p)))
-            {
-               log_error(LOG_LEVEL_FATAL, "Group %s not found.", p);
-            }
-         }
-
-         if (NULL == (pw = getpwnam(argv[argc_pos])))
-         {
-            log_error(LOG_LEVEL_FATAL, "User %s not found.", argv[argc_pos]);
-         }
-
-         if (p != NULL) *--p = '\0';
-      }
-#endif /* defined(unix) */
-      else
-#endif /* defined(_WIN32) && !defined(_WIN_CONSOLE) */
-      {
-         configfile = argv[argc_pos];
-      }
-
-   } /* -END- while (more arguments) */
-
-#if defined(unix)
-   if ( *configfile != '/' )
+   if ((argc >= 2) && (strcmp(argv[1], "--help")==0))
+   {
+      printf("JunkBuster proxy version " VERSION ".\n\n"
+         "Usage: %s [configfile]\n\n"
+         "See " HOME_PAGE_URL " for details.\n"
+         "This program is distributed under the GNU GPL, version 2 or later.\n",
+         argv[0]);
+      exit(2);
+   }
+   if ((argc >= 2) && (strcmp(argv[1], "--version")==0))
    {
-      char *abs_file;
+      printf(VERSION "\n");
+      exit(2);
+   }
+#endif /* !defined(_WIN32) || defined(_WIN_CONSOLE) */
 
-      /* make config-filename absolute here */
-      if ( !(basedir = getcwd( NULL, 1024 )))
-      {
-         perror("get working dir failed");
-         exit( 1 );
-      }
+   Argc = argc;
+   Argv = argv;
 
-      if ( !(abs_file = malloc( strlen( basedir ) + strlen( configfile ) + 5 )))
-      {
-         perror("malloc failed");
-         exit( 1 );
-      }
-      strcpy( abs_file, basedir );
-      strcat( abs_file, "/" );
-      strcat( abs_file, configfile );
-      configfile = abs_file;
+   if (argc > 1)
+   {
+      configfile = argv[1];
    }
-#endif /* defined unix */
-
 
    files->next = NULL;
 
@@ -1766,37 +1132,11 @@ int main(int argc, const char *argv[])
    InitWin32();
 #endif
 
-   /*
-    * Unix signal handling
-    *
-    * Catch the abort, interrupt and terminate signals for a graceful exit
-    * Catch the hangup signal so the errlog can be reopened.
-    * Ignore the broken pipe and child signals
-    *  FIXME: Isn't ignoring the default for SIGCHLD anyway and why ignore SIGPIPE? 
-    */
-#if !defined(_WIN32) && !defined(__OS2__) && !defined(AMIGA)
-{
-   int idx;
-   const int catched_signals[] = { SIGABRT, SIGTERM, SIGINT, SIGHUP, 0 };
-   const int ignored_signals[] = { SIGPIPE, SIGCHLD, 0 };
-
-   for (idx = 0; catched_signals[idx] != 0; idx++)
-   {
-      if (signal(catched_signals[idx], sig_handler) == SIG_ERR)
-      {
-         log_error(LOG_LEVEL_FATAL, "Can't set signal-handler for signal %d: %E", catched_signals[idx]);
-      }
-   }
 
-   for (idx = 0; ignored_signals[idx] != 0; idx++)
-   {
-      if (signal(ignored_signals[idx], SIG_IGN) == SIG_ERR)
-      {
-         log_error(LOG_LEVEL_FATAL, "Can't set ignore-handler for signal %d: %E", ignored_signals[idx]);
-      }
-   }
+#ifndef _WIN32
+   signal(SIGPIPE, SIG_IGN);
+   signal(SIGCHLD, SIG_IGN);
 
-}
 #else /* ifdef _WIN32 */
 # ifdef _WIN_CONSOLE
    /*
@@ -1808,96 +1148,6 @@ int main(int argc, const char *argv[])
 #endif /* def _WIN32 */
 
 
-   /* Initialize the CGI subsystem */
-   cgi_init_error_messages();
-
-   /*
-    * If runnig on unix and without the --nodaemon
-    * option, become a daemon. I.e. fork, detach
-    * from tty and get process group leadership
-    */
-#if defined(unix)
-{
-   pid_t pid = 0;
-#if 0
-   int   fd;
-#endif
-
-   if (!no_daemon)
-   {
-      pid  = fork();
-
-      if ( pid < 0 ) /* error */
-      {
-         perror("fork");
-         exit( 3 );
-      }
-      else if ( pid != 0 ) /* parent */
-      {
-         int status;
-         pid_t wpid;
-         /*
-          * must check for errors
-          * child died due to missing files aso
-          */
-         sleep( 1 );
-         wpid = waitpid( pid, &status, WNOHANG );
-         if ( wpid != 0 )
-         {
-            exit( 1 );
-         }
-         exit( 0 );
-      }
-      /* child */
-#if 1
-      /* Should be more portable, but not as well tested */
-      setsid();
-#else /* !1 */
-#ifdef __FreeBSD__
-      setpgrp(0,0);
-#else /* ndef __FreeBSD__ */
-      setpgrp();
-#endif /* ndef __FreeBSD__ */
-      fd = open("/dev/tty", O_RDONLY);
-      if ( fd )
-      {
-         /* no error check here */
-         ioctl( fd, TIOCNOTTY,0 );
-         close ( fd );
-      }
-#endif /* 1 */
-      /* FIXME: should close stderr (fd 2) here too, but the test
-       * for existence
-       * and load config file is done in listen_loop() and puts
-       * some messages on stderr there.
-       */
-
-      close( 0 );
-      close( 1 );
-      chdir("/");
-
-   } /* -END- if (!no_daemon) */
-
-   /*
-    * As soon as we have written the PID file, we can switch
-    * to the user and group ID indicated by the --user option
-    */
-   write_pid_file();
-   
-   if (NULL != pw)
-   {
-      if (((NULL != grp) && setgid(grp->gr_gid)) || (setgid(pw->pw_gid)))
-      {
-         log_error(LOG_LEVEL_FATAL, "Cannot setgid(): Insufficient permissions.");
-      }
-      if (setuid(pw->pw_uid))
-      {
-         log_error(LOG_LEVEL_FATAL, "Cannot setuid(): Insufficient permissions.");
-      }
-   }
-}
-#endif /* defined unix */
-
    listen_loop();
 
    /* NOTREACHED */
@@ -1906,78 +1156,6 @@ int main(int argc, const char *argv[])
 }
 
 
-/*********************************************************************
- *
- * Function    :  bind_port_helper
- *
- * Description :  Bind the listen port.  Handles logging, and aborts
- *                on failure.
- *
- * Parameters  :
- *          1  :  config = Privoxy configuration.  Specifies port
- *                         to bind to.
- *
- * Returns     :  Port that was opened.
- *
- *********************************************************************/
-static jb_socket bind_port_helper(struct configuration_spec * config)
-{
-   int result;
-   jb_socket bfd;
-
-   if ( (config->haddr != NULL)
-     && (config->haddr[0] == '1')
-     && (config->haddr[1] == '2')
-     && (config->haddr[2] == '7')
-     && (config->haddr[3] == '.') )
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d for local connections only",
-                config->hport);
-   }
-   else if (config->haddr == NULL)
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d on all IP addresses",
-                config->hport);
-   }
-   else
-   {
-      log_error(LOG_LEVEL_INFO, "Listening on port %d on IP address %s",
-                config->hport, config->haddr);
-   }
-
-   result = bind_port(config->haddr, config->hport, &bfd);
-
-   if (result < 0)
-   {
-      switch(result)
-      {
-         case -3 :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: "
-               "There may be another Privoxy or some other "
-               "proxy running on port %d",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY",
-                      config->hport, config->hport);
-
-         case -2 :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: " 
-               "The hostname is not resolvable",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport);
-
-         default :
-            log_error(LOG_LEVEL_FATAL, "can't bind to %s:%d: because %E",
-               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", config->hport);
-      }
-
-      /* shouldn't get here */
-      return JB_INVALID_SOCKET;
-   }
-
-   config->need_bind = 0;
-
-   return bfd;
-}
-
-
 /*********************************************************************
  *
  * Function    :  listen_loop
@@ -1992,67 +1170,51 @@ static jb_socket bind_port_helper(struct configuration_spec * config)
 static void listen_loop(void)
 {
    struct client_state *csp = NULL;
-   jb_socket bfd;
+   int bfd;
    struct configuration_spec * config;
 
    config = load_config();
 
-   bfd = bind_port_helper(config);
+   log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)",
+             config->haddr ? config->haddr : "INADDR_ANY", config->hport);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-   while (!g_terminate)
-#else
-   for (;;)
-#endif
+   bfd = bind_port(config->haddr, config->hport);
+
+   if (bfd < 0)
+   {
+      log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E "
+         "- There may be another junkbuster or some other "
+         "proxy running on port %d", 
+         (NULL != config->haddr) ? config->haddr : "INADDR_ANY", 
+         config->hport, config->hport
+      );
+      /* shouldn't get here */
+      return;
+   }
+
+   config->need_bind = 0;
+
+
+   while (FOREVER)
    {
-#if !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) && !defined(__OS2__)
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
       while (waitpid(-1, NULL, WNOHANG) > 0)
       {
          /* zombie children */
       }
-#endif /* !defined(FEATURE_PTHREAD) && !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
-
-      /*
-       * Free data that was used by died threads
-       */
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
       sweep();
 
-#if defined(unix)
-      /*
-       * Re-open the errlog after HUP signal
-       */
-      if (received_hup_signal)
-      {
-         init_error_log(Argv[0], config->logfile, config->debug);
-         received_hup_signal = 0;
-      }
-#endif
-
-#ifdef __OS2__
-#ifdef FEATURE_COOKIE_JAR
-      /*
-       * Need a workaround here: we have to fclose() the jarfile, or we die because it's
-       * already open.  I think unload_configfile() is not being run, which should do
-       * this work.  Until that can get resolved, we'll use this workaround.
-       */
-       if (csp)
-         if(csp->config)
-           if (csp->config->jar)
-           {
-             fclose(csp->config->jar);
-             csp->config->jar = NULL;
-           }
-#endif /* FEATURE_COOKIE_JAR */
-#endif /* __OS2__ */
-
       if ( NULL == (csp = (struct client_state *) zalloc(sizeof(*csp))) )
       {
          log_error(LOG_LEVEL_FATAL, "malloc(%d) for csp failed: %E", sizeof(*csp));
          continue;
       }
 
-      csp->flags |= CSP_FLAG_ACTIVE;
-      csp->sfd    = JB_INVALID_SOCKET;
+      memset(csp, '\0', sizeof(*csp));
+
+      csp->active = 1;
+      csp->sfd    = -1;
 
       csp->config = config = load_config();
 
@@ -2073,7 +1235,23 @@ static void listen_loop(void)
 
          close_socket(bfd);
 
-         bfd = bind_port_helper(config);
+         log_error(LOG_LEVEL_CONNECT, "bind (%s, %d)",
+                   config->haddr ? config->haddr : "INADDR_ANY", config->hport);
+         bfd = bind_port(config->haddr, config->hport);
+
+         if (bfd < 0)
+         {
+            log_error(LOG_LEVEL_FATAL, "can't bind %s:%d: %E "
+               "- There may be another junkbuster or some other "
+               "proxy running on port %d", 
+               (NULL != config->haddr) ? config->haddr : "INADDR_ANY", 
+               config->hport, config->hport
+            );
+            /* shouldn't get here */
+            return;
+         }
+
+         config->need_bind = 0;
       }
 
       log_error(LOG_LEVEL_CONNECT, "accept connection ... ");
@@ -2085,7 +1263,7 @@ static void listen_loop(void)
 #ifdef AMIGA
          if(!childs)
          {
-            exit(1);
+            exit(1); 
          }
 #endif
          freez(csp);
@@ -2096,12 +1274,10 @@ static void listen_loop(void)
          log_error(LOG_LEVEL_CONNECT, "OK");
       }
 
-#ifdef FEATURE_TOGGLE
-      if (g_bToggleIJB)
-      {
-         csp->flags |= CSP_FLAG_TOGGLED_ON;
-      }
-#endif /* def FEATURE_TOGGLE */
+#if defined(TOGGLE)
+      /* by haroon - most of credit to srt19170 */
+      csp->toggled_on = g_bToggleIJB;
+#endif
 
       if (run_loader(csp))
       {
@@ -2109,7 +1285,6 @@ static void listen_loop(void)
          /* Never get here - LOG_LEVEL_FATAL causes program exit */
       }
 
-#ifdef FEATURE_ACL
       if (block_acl(NULL,csp))
       {
          log_error(LOG_LEVEL_CONNECT, "Connection dropped due to ACL");
@@ -2117,7 +1292,6 @@ static void listen_loop(void)
          freez(csp);
          continue;
       }
-#endif /* def FEATURE_ACL */
 
       /* add it to the list of clients */
       csp->next = clients->next;
@@ -2130,34 +1304,10 @@ static void listen_loop(void)
 /* this is a switch () statment in the C preprocessor - ugh */
 #undef SELECTED_ONE_OPTION
 
-/* Use Pthreads in preference to native code */
-#if defined(FEATURE_PTHREAD) && !defined(SELECTED_ONE_OPTION)
-#define SELECTED_ONE_OPTION
-         {
-            pthread_t the_thread;
-            pthread_attr_t attrs;
-
-            pthread_attr_init(&attrs);
-            pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
-            child_id = (pthread_create(&the_thread, &attrs,
-               (void*)serve, csp) ? -1 : 0);
-            pthread_attr_destroy(&attrs);
-         }
-#endif
-
 #if defined(_WIN32) && !defined(_CYGWIN) && !defined(SELECTED_ONE_OPTION)
 #define SELECTED_ONE_OPTION
          child_id = _beginthread(
-            (void (*)(void *))serve,
-            64 * 1024,
-            csp);
-#endif
-
-#if defined(__OS2__) && !defined(SELECTED_ONE_OPTION)
-#define SELECTED_ONE_OPTION
-         child_id = _beginthread(
-            (void(* _Optlink)(void*))serve,
-            NULL,
+            (void*)serve,
             64 * 1024,
             csp);
 #endif
@@ -2186,7 +1336,7 @@ static void listen_loop(void)
             NP_Entry, (ULONG)server_thread,
             NP_Output, Output(),
             NP_CloseOutput, FALSE,
-            NP_Name, (ULONG)"privoxy child",
+            NP_Name, (ULONG)"junkbuster child",
             NP_StackSize, 200*1024,
             TAG_DONE)))
          {
@@ -2199,7 +1349,27 @@ static void listen_loop(void)
 
 #if !defined(SELECTED_ONE_OPTION)
          child_id = fork();
+#endif
+
+#undef SELECTED_ONE_OPTION
+/* end of cpp switch () */
+
+         if (child_id < 0) /* failed */
+         {
+            char buf[BUFFER_SIZE];
+
+            log_error(LOG_LEVEL_ERROR, "can't fork: %E");
+
+            sprintf(buf , "JunkBuster: can't fork: errno = %d", errno);
+
+            write_socket(csp->cfd, buf, strlen(buf));
+            close_socket(csp->cfd);
+            csp->active = 0;
+            sleep(5);
+            continue;
+         }
 
+#if !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA)
          /* This block is only needed when using fork().
           * When using threads, the server thread was
           * created and run by the call to _beginthread().
@@ -2210,7 +1380,7 @@ static void listen_loop(void)
             _exit(0);
 
          }
-         else if (child_id > 0) /* parent */
+         else  /* parent */
          {
             /* in a fork()'d environment, the parent's
              * copy of the client socket and the CSP
@@ -2221,75 +1391,16 @@ static void listen_loop(void)
             wait( NULL );
 #endif /* !defined(_WIN32) && defined(__CYGWIN__) */
             close_socket(csp->cfd);
-            csp->flags &= ~CSP_FLAG_ACTIVE;
-         }
-#endif
-
-#undef SELECTED_ONE_OPTION
-/* end of cpp switch () */
-
-         if (child_id < 0) /* failed */
-         {
-            char buf[BUFFER_SIZE];
-
-            log_error(LOG_LEVEL_ERROR, "can't fork: %E");
-
-            sprintf(buf , "JunkBuster: can't fork: errno = %d", errno);
-
-            write_socket(csp->cfd, buf, strlen(buf));
-            close_socket(csp->cfd);
-            csp->flags &= ~CSP_FLAG_ACTIVE;
-            sleep(5);
-            continue;
+            csp->active = 0;
          }
+#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(AMIGA) */
       }
       else
       {
          serve(csp);
       }
    }
-
-   /* NOTREACHED unless FEATURE_GRACEFUL_TERMINATION is defined */
-
-   /* Clean up.  Aim: free all memory (no leaks) */
-#ifdef FEATURE_GRACEFUL_TERMINATION
-
-   log_error(LOG_LEVEL_ERROR, "Graceful termination requested");
-
-   unload_current_config_file();
-   unload_current_actions_file();
-   unload_current_re_filterfile();
-#ifdef FEATURE_TRUST
-   unload_current_trust_file();
-#endif
-
-   if (config->multi_threaded)
-   {
-      int i = 60;
-      do
-      {
-         sleep(1);
-         sweep();
-      } while ((clients->next != NULL) && (--i > 0));
-
-      if (i <= 0)
-      {
-         log_error(LOG_LEVEL_ERROR, "Graceful termination failed - still some live clients after 1 minute wait.");
-      }
-   }
-   sweep();
-   sweep();
-
-#if defined(unix)
-   free(basedir);
-#endif
-#if defined(_WIN32) && !defined(_WIN_CONSOLE)
-   /* Cleanup - remove taskbar icon etc. */
-   TermLogWindow();
-#endif
-
-   exit(0);
-#endif /* FEATURE_GRACEFUL_TERMINATION */
+   /* NOTREACHED */
 
 }
 
diff --git a/jcc.h b/jcc.h
index 1778f1e..a43a12c 100644 (file)
--- a/jcc.h
+++ b/jcc.h
@@ -1,6 +1,6 @@
-#ifndef JCC_H_INCLUDED
-#define JCC_H_INCLUDED
-#define JCC_H_VERSION "$Id: jcc.h,v 1.11 2002/03/24 13:25:43 swa Exp $"
+#ifndef _JCC_H
+#define _JCC_H
+#define JCC_H_VERSION "$Id: jcc.h,v 1.1.1.1 2001/05/15 13:58:56 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.h,v $
@@ -9,7 +9,7 @@
  *                the main connection-handling function.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: jcc.h,v $
- *    Revision 1.11  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.10  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.9  2002/03/07 03:52:44  oes
- *    Set logging to tty for --no-daemon mode
- *
- *    Revision 1.8  2002/03/04 18:19:49  oes
- *    Added extern const char *pidfile
- *
- *    Revision 1.7  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.6  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.5  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.4  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.3  2001/07/18 12:31:58  oes
- *    moved #define freez from jcc.h to project.h
- *
- *    Revision 1.2  2001/05/31 21:24:47  jongfoster
- *    Changed "permission" to "action" throughout.
- *    Removed DEFAULT_USER_AGENT - it must now be specified manually.
- *    Moved vanilla wafer check into chat(), since we must now
- *    decide whether or not to add it based on the URL.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:56  oes
  *    Initial import of version 2.9.3 source tree
  *
  *********************************************************************/
 \f
 
+/* Declare struct FILE for vars and funcs. */
+#include <stdio.h>
+
+/* All of our project's data types. */
+#include "project.h"
+
+#include "loadcfg.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-struct client_state;
-struct file_list;
+#define freez(X)  if(X) free(X); X = NULL
+
 
 /* Global variables */
 
-#ifdef FEATURE_STATISTICS
+
+#ifdef STATISTICS
 extern int urls_read;
 extern int urls_rejected;
-#endif /*def FEATURE_STATISTICS*/
+#endif /*def STATISTICS*/
 
 extern struct client_state clients[];
-extern struct file_list    files[];
 
-#ifdef unix
-extern const char *pidfile;
-#endif
-extern int no_daemon;
+extern struct file_list    files[];
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-extern int g_terminate;
-#endif
 
 /* Functions */
 
 #ifdef __MINGW32__
-int real_main(int argc, const char *argv[]);
+int _main(int argc, const char *argv[]);
 #else
 int main(int argc, const char *argv[]);
 #endif
@@ -131,7 +86,7 @@ extern const char jcc_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef JCC_H_INCLUDED */
+#endif /* ndef _JCC_H */
 
 /*
   Local Variables:
diff --git a/junkbuster-rh.spec b/junkbuster-rh.spec
new file mode 100644 (file)
index 0000000..0ef6128
--- /dev/null
@@ -0,0 +1,295 @@
+# $Id: junkbuster-rh.spec,v 1.8 2001/06/12 17:15:56 swa Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: junkbuster-rh.spec,v $
+# Revision 1.8  2001/06/12 17:15:56  swa
+# fixes, because a clean build on rh6.1 was impossible.
+# GZIP confuses make, % configure confuses rpm, etc.
+#
+# Revision 1.7  2001/06/11 12:17:26  sarantis
+# fix typo in %post
+#
+# Revision 1.6  2001/06/11 11:28:25  sarantis
+# Further optimizations and adaptations in the spec file.
+#
+# Revision 1.5  2001/06/09 09:14:11  swa
+# shamelessly adapted RPM stuff from the newest rpm that
+# RedHat provided for the JB.
+#
+# Revision 1.4  2001/06/08 20:54:18  swa
+# type with status file. remove forward et. al from file list.
+#
+# Revision 1.3  2001/06/07 17:28:10  swa
+# cosmetics
+#
+# Revision 1.2  2001/06/04 18:31:58  swa
+# files are now prefixed with either `confdir' or `logdir'.
+# `make redhat-dist' replaces both entries confdir and logdir
+# with redhat values
+#
+# Revision 1.1  2001/06/04 10:44:57  swa
+# `make redhatr-dist' now works. Except for the paths
+# in the config file.
+#
+#
+#
+Summary: The Internet Junkbuster
+Vendor: http://ijbswa.sourceforge.net
+Name: junkbuster
+Version: 2.9.4
+Release: 1
+Source0: http://www.waldherr.org/junkbuster/ijbswa.tar.gz
+Copyright: GPL
+BuildRoot: %{_tmppath}/%{name}-root
+Group: Networking/Utilities
+URL: http://ijbswa.sourceforge.net/
+Packager: Stefan Waldherr <stefan@waldherr.org>
+Obsoletes: junkbuster-raw junkbuster-blank
+Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service 
+Conflicts: junkbuster-raw junkbuster-blank
+
+%description
+The Internet Junkbuster stops your browser from displaying the
+advertisement images that pervade many commercial web pages.  Since
+your browser has to download fewer images, surfing the web should be
+faster.
+
+%define ijbconf %{_sysconfdir}/junkbuster
+
+%prep
+%setup -c -n ijbswa
+
+%build
+./configure
+make
+strip junkbuster
+
+%pre
+/usr/sbin/useradd -d /etc/junkbuster -u 73 -r junkbust > /dev/null 2>&1 || /bin/true
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \
+         ${RPM_BUILD_ROOT}%{_mandir}/man8 \
+         ${RPM_BUILD_ROOT}/var/log/junkbuster \
+         ${RPM_BUILD_ROOT}%{ijbconf}/templates \
+         ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \
+         ${RPM_BUILD_ROOT}%{_sysconfdir}/rc.d/init.d
+
+install -s -m 744 junkbuster $RPM_BUILD_ROOT%{_sbindir}/junkbuster
+cp -f junkbuster.1 $RPM_BUILD_ROOT%{_mandir}/man8/junkbuster.8
+cp -f permissionsfile $RPM_BUILD_ROOT%{ijbconf}/permissionsfile
+cp -f re_filterfile $RPM_BUILD_ROOT%{ijbconf}/re_filterfile
+cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust
+cp -f templates/default $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f templates/show-status  $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f templates/show-status-file  $RPM_BUILD_ROOT%{ijbconf}/templates/
+cp -f junkbuster.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/junkbuster
+install -m 755 junkbuster.init $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/junkbuster
+install -m 744 -d $RPM_BUILD_ROOT/var/log/junkbuster
+
+# verify all file locations, etc. in the config file
+# don't start with ^ or commented lines are not replaced
+cat config | \
+    sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \
+#    sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \
+#    sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \
+#    sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \
+#    sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \
+#    sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \
+#    sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \
+    sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \
+    $RPM_BUILD_ROOT%{ijbconf}/config
+
+%post
+if [ "$1" = "1" ]; then
+        /sbin/chkconfig --add junkbuster
+fi
+
+%preun
+if [ "$1" = "0" ]; then
+       /sbin/service junkbuster stop > /dev/null 2>&1 ||:
+       /sbin/chkconfig --del junkbuster
+fi
+
+%postun
+if [ "$1" -ge "1" ]; then
+       /sbin/service junkbuster condrestart > /dev/null 2>&1
+fi
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+# %doc ijbfaq.html ijbman.html README README.TOO gpl.html
+%doc junkbuster.weekly junkbuster.monthly
+%dir %{ijbconf}
+%config %{ijbconf}/*
+%attr(0744,junkbust,junkbust) %dir /var/log/junkbuster
+%config %{_sysconfdir}/logrotate.d/junkbuster
+%attr(0744,junkbust,junkbust)/usr/sbin/junkbuster
+%{_mandir}/man8/*
+%config %{_sysconfdir}/rc.d/init.d/junkbuster
+
+
+%changelog
+
+* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
+- rework of RPM
+
+* Mon Sep 25 2000 Stefan Waldherr <stefan@waldherr.org>
+- CLF Logging patch by davep@cyw.uklinux.net
+- Hal DeVore <haldevore@earthling.net> fix akamaitech in blocklist
+
+* Sun Sep 17 2000 Stefan Waldherr <stefan@waldherr.org>
+- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch.
+- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied
+  numerous fixes and enhancements for Steve's patch.
+- adamlock@netscape.com (Adam Lock) in the windows version:
+  - Taskbar activity spinner always spins even when logging is
+  turned off (which is the default) - people who don't
+  like the spinner can turn it off from a menu option.
+  - Taskbar popup menu has a options submenu - people can now
+  open the settings files for cookies, blockers etc.
+  without opening the JB window.
+  - Logging functionality works again
+  - Buffer overflow is fixed - new code uses a bigger buffer
+  and snprintf so it shouldn't overflow anymore.
+- Fixed userid swa, group learning problem while installing.
+  root must build RPM.
+- Added patch by Benjamin Low <ben@snrc.uow.edu.au> that prevents JB to
+  core dump when there is no log file.
+- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de.
+- Fixed man page to include imagefile and popupfile.
+- Sanity check for the statistics function added.
+- "Patrick D'Cruze" <pdcruze@orac.iinet.net.au>: It seems Microsoft
+ are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS.
+ With IIS/5, it appears to omit the trailing \r\n from http header
+ only messages.  eg, when I visit http://www.hotmail.com, IIS/5
+ responds with a HTTP 302 redirect header.  However, this header
+ message is missing the trailing \r\n.  IIS/5 then closes the
+ connection.  Junkbuster, unfortunately, discards the header becomes
+ it thinks it is incomplete - and it is.  MS have transmitted an
+ incomplete header!
+- Added bug reports and patch submission forms in the docs.
+
+* Mon Mar 20 2000 Stefan Waldherr <stefan@waldherr.org>
+       Andrew <anw@tirana.freewire.co.uk> extended the JB:
+       Display of statistics of the total number of requests and the number
+       of requests filtered by junkbuster, also the percentage of requests
+       filtered. Suppression of the listing of files on the proxy-args page.
+       All stuff optional and configurable.
+
+* Sun Sep 12 1999 Stefan Waldherr <stefan@waldherr.org>
+       Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the 
+       code which prevented the JB from handling URLs of the form
+       user:password@www.foo.com. Fixed.
+
+* Mon Aug  2 1999 Stefan Waldherr <stefan@waldherr.org>
+       Blank images are no longer cached, thanks to a hint from Markus 
+        Breitenbach <breitenb@rbg.informatik.tu-darmstadt.de>. The user 
+        agent is NO longer set by the Junkbuster. Sadly, many sites depend 
+        on the correct browser version nowadays. Incorporated many 
+       suggestions from Jan "Yenya" Kasprzak <kas@fi.muni.cz> for the
+        spec file. Fixed logging problem and since runlevel 2 does not 
+        use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with
+        /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker 
+        <walker@netgate.net>. You should now be able to build this RPM as 
+        a non-root user (mathias@weidner.sem.lipsia.de).
+
+* Sun Jan 31 1999 Stefan Waldherr <stefan@waldherr.org>
+       /var/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist
+       to allow more sophisticated matching of blocked images. Logrotate
+       logfile. Added files for auto-updating the blocklist et al.
+
+* Wed Dec 16 1998 Stefan Waldherr <stefan@waldherr.org>
+       Configure blank version via config file. No separate blank
+       version anymore. Added Roland's <roland@spinnaker.rhein.de>
+       patch to show a logo instead of a blank area. Added a suggestion
+       from Alex <alex@cocoa.demon.co.uk>: /var/lock/subsys/junkbuster.
+       More regexps in the blocklist. Prepared the forwardfile for
+       squid. Extended image regexp with help from gabriel 
+       <somlo@CS.ColoState.EDU>.
+
+* Thu Nov 19 1998 Stefan Waldherr <stefan@waldherr.org>
+       All RPMs now identify themselves in the show-proxy-args page.
+       Released Windoze version. Run junkbuster as nobody instead of
+       root. 
+
+* Fri Oct 30 1998 Stefan Waldherr <stefan@waldherr.org>
+       Newest version. First release (hence the little version number
+       mixture -- 2.0.2-0 instead of 2.0-7). This version tightens 
+       security over 2.0.1; some multi-user sites will need to change 
+       the listen-address in the configuration file. The blank version of
+        the Internet Junkbuster has a more sophisticated way of replacing
+       images. All RPMs identify themselves in the show-proxy-args page.
+
+* Thu Sep 23 1998 Stefan Waldherr <stefan@waldherr.org>
+       Modified the blocking feature, so that only GIFs and JPEGs are
+       blocked and replaced but not HTML pages. Thanks to 
+       "Gerd Flender" <plgerd@informatik.uni-siegen.de> for this nice
+       idea. Added numerous stuff to the blocklist. Keep patches in
+        seperate files and no longer in diffs (easier to maintain).
+
+* Tue Jun 16 1998 Stefan Waldherr <swa@cs.cmu.edu>
+        Moved config files to /etc/junkbuster directory, moved man page,
+       added BuildRoot directive (Thanks to Alexey Nogin <ayn2@cornell.edu>)
+        Made new version junkbuster-raw (which is only a stripped version of 
+        the junkuster rpm, i.e. without my blocklist, etc.)
+
+* Tue Jun 16 1998 (2.0-1)
+       Uhm, not that much. Just a new junkbuster version that
+       fixes a couple of bugs ... and of course a bigger 
+       blocklist with the unique Now-less-ads-than-ever(SM)
+       feature.
+       Oh, one thing: I changed the default user agent to Linux -- no 
+       need anymore to support Apple.
+
+* Tue Jun 16 1998 (2.0-0)
+       Now-less-ads-than-ever (SM)
+       compiled with gcc instead of cc
+       compiled with -O3, thus it should be a little faster
+       show-proxy-args now works
+       /etc/junkbuster.init wasn't necessary
+
+* Tue Jun 16 1998 (1.4)
+       some more config files were put into /etc
+       The junkbuster-blank rpm returns a 1x1 pixel image, that gets 
+       displayed by Netscape instead of the blocked image.
+       Read http://www.waldherr.org/junkbuster/ for
+       further info.
+
+* Tue Jun 16 1998 (1.3)
+       The program has been moved to /usr/sbin (from /usr/local/bin)
+       Init- and stopscripts (/etc/rc.d/rc*) have been added so
+       that the junkbuster starts automatically during bootup.
+       The /etc/blocklist file is much more sophisticated. Theoretically
+       one should e.g. browse all major US and German newspapers without
+       seeing one annoying ad.
+       junkbuster.init was modified. It now starts junkbuster with an
+       additional "-r @" flag.
diff --git a/junkbuster-suse.spec b/junkbuster-suse.spec
new file mode 100644 (file)
index 0000000..9218a2f
--- /dev/null
@@ -0,0 +1,175 @@
+# $Id: junkbuster-suse.spec,v 1.4 2001/06/08 20:53:36 swa Exp $
+#
+# Written by and Copyright (C) 2001 the SourceForge
+# IJBSWA team.  http://ijbswa.sourceforge.net
+#
+# Based on the Internet Junkbuster originally written
+# by and Copyright (C) 1997 Anonymous Coders and 
+# Junkbusters Corporation.  http://www.junkbusters.com
+#
+# This program is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will
+# be useful, but WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.  See the GNU General Public
+# License for more details.
+#
+# The GNU General Public License should be included with
+# this file.  If not, you can view it at
+# http://www.gnu.org/copyleft/gpl.html
+# or write to the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# $Log: junkbuster-suse.spec,v $
+# Revision 1.4  2001/06/08 20:53:36  swa
+# use buildroot, export init to separate file (better manageability)
+#
+# Revision 1.3  2001/06/07 17:28:10  swa
+# cosmetics
+#
+# Revision 1.2  2001/06/07 17:18:44  swa
+# header fixed
+#
+#
+# neededforbuild  -ijb
+# usedforbuild    -ijb aaa_base aaa_dir autoconf automake base bash bindutil binutils bison bzip compress cpio cracklib db devs diffutils e2fsprogs file fileutils findutils flex gawk gcc gdbm gdbm-devel gettext glibc glibc-devel gpm gppshare groff gzip kbd less libtool libz lx_suse make mktemp modutils ncurses ncurses-devel net-tools netcfg nkitb pam pam-devel patch perl pgp ps rcs rpm sendmail sh-utils shadow strace syslogd sysvinit texinfo textutils timezone unzip util-linux vim xdevel xf86 xshared
+
+Vendor:       http://ijbswa.sourceforge.net
+Distribution: defineme
+Name:         junkbuster
+Packager:     Stefan Waldherr <stefan@waldherr.org>
+
+Copyright:    GPL
+BuildRoot: /tmp/junkbuster-rpmbuild
+Group:        Networking/Utilities
+Provides:     ijb
+Obsoletes:    ijb
+Autoreqprov:  on
+Version: 2.9
+Release: 4
+Summary:      The Internet Junkbuster
+Source:  http://www.waldherr.org/junkbuster/ijbswa.tar.gz
+
+#
+# -----------------------------------------------------------------------------
+#
+%description
+The Internet Junkbuster stops your browser from displaying the
+advertisement images that pervade many commercial web pages.  Since
+your browser has to download fewer images, surfing the web should be
+faster.
+
+Authors:
+--------
+    http://ijbswa.sourceforge.net
+
+SuSE series: n
+
+#
+# -----------------------------------------------------------------------------
+#
+%prep
+%setup -c -n ijbswa
+
+#
+# -----------------------------------------------------------------------------
+#
+%build
+./configure
+make
+
+#
+# -----------------------------------------------------------------------------
+#
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT/{var/log/junkbuster,usr/{sbin,share/man/man1},etc/{junkbuster,junkbuster/templates,init.d}}
+
+install -m 755 junkbuster.init.suse $RPM_BUILD_ROOT/etc/init.d/junkbuster
+ln -sf $RPM_BUILD_ROOT/etc/init.d/junkbuster $RPM_BUILD_ROOT/usr/sbin/rcjunkbuster
+
+install -m 755 junkbuster $RPM_BUILD_ROOT/usr/sbin
+install -d $RPM_BUILD_ROOT/etc/junkbuster
+install -d $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 permissionsfile $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 re_filterfile $RPM_BUILD_ROOT/etc/junkbuster
+# verify all file locations, etc. in the config file
+# don't start with ^ or commented lines are not replaced
+cat config | \
+    sed 's/^confdir.*/confdir \/etc\/junkbuster/g' | \
+#    sed 's/^permissionsfile.*/permissionsfile \/etc\/junkbuster\/permissionsfile/g' | \
+#    sed 's/^re_filterfile.*/re_filterfile \/etc\/junkbuster\/re_filterfile/g' | \
+#    sed 's/^logfile.*/logfile \/var\/log\/junkbuster\/logfile/g' | \
+#    sed 's/^jarfile.*/jarfile \/var\/log\/junkbuster\/jarfile/g' | \
+#    sed 's/^forward.*/forward \/etc\/junkbuster\/forward/g' | \
+#    sed 's/^aclfile.*/aclfile \/etc\/junkbuster\/aclfile/g' > \
+    sed 's/^logdir.*/logdir \/var\/log\/junkbuster/g' > \
+    config.tmp
+cp -f config.tmp config
+install -m 644 config $RPM_BUILD_ROOT/etc/junkbuster
+#install -m 644 forward $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 trust $RPM_BUILD_ROOT/etc/junkbuster
+install -m 644 templates/default $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 templates/show-status $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 templates/show-status-file $RPM_BUILD_ROOT/etc/junkbuster/templates
+install -m 644 junkbuster.1 $RPM_BUILD_ROOT/usr/share/man/man1
+%{?suse_check}
+
+#
+# -----------------------------------------------------------------------------
+#
+%post
+sbin/insserv etc/init.d/junkbuster
+
+#
+# -----------------------------------------------------------------------------
+#
+%postun
+sbin/insserv etc/init.d/
+
+#
+# -----------------------------------------------------------------------------
+#
+%files
+#%doc README *.html
+/usr/sbin/junkbuster
+/usr/share/man/man1/junkbuster.1.gz
+%config(noreplace) /etc/junkbuster
+/etc/init.d/junkbuster
+/usr/sbin/rcjunkbuster
+
+#
+# -----------------------------------------------------------------------------
+#
+%changelog -n junkbuster
+* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
+- rework of RPM
+* Wed Feb 14 2001 - uli@suse.de
+- fixed init script
+* Wed Dec 06 2000 - bjacke@suse.de
+- renamed package to junkbuster
+- fixed copyright tag
+* Thu Nov 30 2000 - uli@suse.de
+- moved init script to /etc/init.d
+* Wed Feb 16 2000 - kukuk@suse.de
+- Move /usr/man -> /usr/share/man
+- Mark /etc/ijb as "config(noreplace)"
+* Mon Sep 20 1999 - uli@suse.de
+- fixed init script
+* Mon Sep 13 1999 - bs@suse.de
+- ran old prepare_spec on spec file to switch to new prepare_spec.
+* Thu Apr 01 1999 - daniel@suse.de
+- do not start ijb as root (security)
+* Tue Mar 30 1999 - daniel@suse.de
+- don´t use saclfile.ini
+* Tue Mar 30 1999 - daniel@suse.de
+- small fix to whitelist-configuration,
+  version is and was 2.0.2 WITHOUT Stefan Waldherr's patches
+  (http://www.waldherr.org/junkbuster/)
+* Mon Mar 01 1999 - daniel@suse.de
+- new package: version 2.0
diff --git a/junkbuster.1 b/junkbuster.1
new file mode 100644 (file)
index 0000000..d88294d
--- /dev/null
@@ -0,0 +1,871 @@
+.TH JUNKBUSTER 1 "http://www.junkbusters.com/ht/en/ijb2.0man.html"\r
+.SH NAME\r
+\fBjunkbuster\fP\r
+- The\r
+Internet Junkbuster\r
+Proxy\r
+\s-2(TM)\s+2\r
+.SH SYNOPSIS\r
+\fBjunkbuster\fP\r
+\fI\&configfile\fP\r
+(Version 2.0 onwards)\r
+.br\r
+\fBjunkbstr.exe\fP\r
+\fI\&configfile\fP\r
+(Windows)\r
+.br\r
+\fBjunkbuster\fP\r
+[-a]\r
+[-y]\r
+[-s]\r
+[-c]\r
+[-v]\r
+.br\r
+[-u user_agent]\r
+[-r referer]\r
+[-t from]\r
+.br\r
+[-b blockfile]\r
+[-j jarfile]\r
+[-l logfile]\r
+.br\r
+[-w NAME=VALUE]\r
+[-x Header_text]\r
+.br\r
+[-h [bind_host_address][:bind_port]]\r
+.br\r
+[-f forward_host[:port]]\r
+[-d N]\r
+.br\r
+[-g gw_protocol[:[gw_host][:gw_port]]]\r
+.br\r
+(Version 1.4 and earlier)\r
+.SH DESCRIPTION\r
+\fBjunkbuster\fP\r
+is an instrumentable proxy that filters the \r
+\s-2HTTP\s0\r
+stream between\r
+web servers and browsers.\r
+Its main purpose is to enhance privacy.\r
+.P\r
+Versions before 2.0 used command-line options;\r
+Versions from 2.0 onward use a configuration file.\r
+The following descriptions of the options first give the older\r
+command-line usage, then the new configfile line.\r
+.P\r
+In Versions 2.0.1 upwards on Windows,\r
+a start-up message is printed and the configuration is read from the file\r
+\fC\&junkbstr.ini\fP\r
+if it exists and no argument was given.\r
+.P\r
+All files except the configfile\r
+are checked for changes before each page is fetched,\r
+so they may edited without restarting the proxy.\r
+.SS OPTIONS\r
+.TP\r
+.\" anchor: o_b blockfile\r
+\fI-b blockfile\fP (Old) blockfile \fIblockfile\fP (New)\r
+Block\" ijbfaq.html#blocking\r
+requests to\r
+\s-2URL\s0s\r
+matching any pattern given in the lines of the\r
+\fI\&blockfile\fP.\r
+The\r
+\fBjunkbuster\fP\r
+instead returns status 202, indicating that the request has been accepted\r
+(though not completed),\r
+and a\r
+message identifying itself\" ijbfaq.html#show\r
+(though the browser may\r
+display only a broken image icon).\r
+(Versions before 2.0 returned an error 403 (Forbidden).)\r
+The syntax of a pattern is\r
+\fB\&[domain][:port][/path]\fP\r
+(the\r
+\fB\&http://\fP\r
+or\r
+\fB\&https://\fP\r
+protocol part is omitted).\r
+To decide if a pattern matches a target, the domains are compared first,\r
+then the paths. \r
+.P\r
+To compare the domains,\r
+the pattern domain and the target\r
+domain specified in the\r
+\s-2URL\s0\r
+are each broken into their components.\r
+(Components are separated by the\r
+\fC\&.\fP\r
+(period) character.)\r
+Next each of the target components\r
+is compared with the corresponding pattern component: last with last,\r
+next-to-last with next-to-last, and so on.\r
+(This is called\r
+\fIright-anchored\fP\r
+matching.)\r
+If all of the pattern components find their match in the target,\r
+then the domains are considered a match.\r
+Case is irrelevant when comparing domain components.\r
+.P\r
+A successfully\r
+matching pattern can be an anchored substring of a target, but\r
+not vice versa.\r
+Thus if a pattern doesn't specify a domain,\r
+it matches all domains.\r
+.\" anchor: wildcard\r
+Furthermore, when comparing two components,\r
+the components must either match in their entirety or up to a wildcard\r
+\fC\&* \fP\r
+(star character) in the pattern.  The wildcard feature\r
+implements only a "prefix" match capability ("abc*" vs. "abcdefg"),\r
+not suffix matching ("*efg" vs. "abcdefg") or\r
+infix matching ("abc*efg" vs. "abcdefg").\r
+The feature is restricted to the domain component;\r
+it is unrelated to the optional\r
+regular expression\r
+feature in the path\r
+(described below).\" ijbman.html#regex\r
+.P\r
+If a numeric port\r
+is specified in the pattern domain, then the target port must\r
+match as well.  The default port in a target is port 80.\r
+.P\r
+If the domain and port match,\r
+then the target\r
+\s-2URL\s0\r
+path is checked for\r
+a match against the path in the pattern.\r
+Paths are compared with a simple case-sensitive\r
+left-anchored substring comparison.\r
+Once again, the pattern can be an\r
+anchored substring of the target, but not vice versa.\r
+A path of\r
+\fC\&/\fP\r
+(slash) would match all paths.  Wildcards are not considered in\r
+path comparisons.\r
+.P\r
+For example, the target\r
+\s-2URL\s0\r
+.br\r
+.ti +0.25i\r
+\fB\&the.yellow-brick-road.com/TinMan/has_no_brain\fP\r
+.br\r
+would be matched (and blocked) by the following patterns\r
+.br\r
+.ti +0.25i\r
+\fB\&yellow-brick-road.com\fP\r
+.br\r
+and\r
+.br\r
+.ti +0.25i\r
+\fB\&Yellow*.COM\fP\r
+.br\r
+and\r
+.br\r
+.ti +0.25i\r
+\fB\&/TinM\fP\r
+.br\r
+but not\r
+.br\r
+.ti +0.25i\r
+\fB\&follow.the.yellow-brick-road.com\fP\r
+.br\r
+or\r
+.br\r
+.ti +0.25i\r
+\fB\&/tinman\fP\r
+.br\r
+.P\r
+Comments in a blockfile start with a\r
+\fB\&#\fP\r
+(hash) character and end at a new line.\r
+Blank lines are also ignored.\r
+.P\r
+Lines beginning with a\r
+\fC\&~\fP\r
+(tilde) character are taken to be\r
+exceptions:\" ijbfaq.html#exceptions\r
+a\r
+\s-2URL\s0\r
+blocked by previous patterns that matches the rest of\r
+the line is let through. (The last match wins.)\r
+.P\r
+Patterns\r
+may contain\r
+\s-2POSIX\s0\r
+regular expressions\" ijbfaq.html#regex\r
+provided the\r
+\fBjunkbuster\fP\r
+was compiled with this option\r
+(the default in Version 2.0 on).\r
+The idiom\r
+\fC\&/*.*/ad\fP\r
+can then be used\r
+to match any\r
+\s-2URL\s0\r
+containing\r
+\fC\&/ad\fP\r
+(such as\r
+\fC\&http://nomatterwhere.com/images/advert/g3487.gif\fP\r
+for example).\r
+These expressions\r
+don't work\" ijbman.html#substring\r
+in the domain part.\r
+.P\r
+In version 1.3 and later\r
+the blockfile and cookiefile are checked for changes before each request.\r
+.TP\r
+tinygif \fIN\fP\r
+Set appearance of blocked GIFs. You can select one of the following\r
+values:\r
+.br\r
+.br\r
+\h'-\w"0 = "u'0 = Show a ``broken icon'' in the browser\r
+.br\r
+\h'-\w"1 = "u'1 = Show a one pixel transparent GIF\r
+.br\r
+\h'-\w"2 = "u'2 = Show a GIF with the word ``JUNKBUSTER''\r
+.TP\r
+popupfile \fI\&popup\fP\r
+Sets the name of the popupfile. If uncommented, the popupfile\r
+controls on which sites Javascript popup windows are disabled.\r
+.TP\r
+.\" anchor: o_w wafer\r
+\fI-w NAME=VALUE\fP (Old) wafer \fINAME=VALUE\fP (New)\r
+Specifies a pair to be sent as a cookie with every request\r
+to the server.\" ijbfaq.html#wafers\r
+(Such boring cookies are called\r
+\fI\&wafers\fP.)\r
+This option may be called more than once to generate multiple wafers.\r
+The original\r
+Netscape specification\r
+prohibited\r
+semi-colons, commas and white space;\r
+these characters will be\r
+\s-2URL\s0-encoded\r
+if used in wafers.\r
+The Path and Domain attributes are not currently supported.\r
+.TP\r
+.\" anchor: o_c cookiefile\r
+\fI-c cookiefile\fP (Old) cookiefile \fIcookiefile\fP (New)\r
+Enforce the cookie management policy specified in the\r
+\fI\&cookiefile.\fP\r
+.\" anchor: java\r
+If this option is not used all cookies are silently crunched,\r
+so that users who never want cookies aren't bothered by browsers\r
+asking whether each cookie should be accepted.\r
+However, cookies can\r
+still get through\" ijbfaq.html#breakthrough\r
+via\r
+JavaScript\" links.html#javascript\r
+and\r
+\s-2SSL\s0,\r
+so alerts should be left on.\r
+.P\r
+In Version 1.2 and later\r
+this option must be followed by a\r
+filename\" ijbfaq.html#crumble\r
+containing instructions on which sites are allowed to\r
+receive and set cookies.\r
+.\" anchor: drop\r
+By default cookies are dropped in both the browser's request\r
+and the server's response, unless the\r
+\s-2URL\s0\r
+requested matches an entry in the\r
+\fI\&cookiefile\fP.\r
+The matching algorithm is the same as for the blockfile.\r
+A leading\r
+\fC\&>\fP\r
+character allows\r
+server-bound\" ijbfaq.html#directional\r
+cookies only;\r
+a\r
+\fC\&<\fP\r
+allows only browser-bound cookies;\r
+a\r
+\fC\&~\fP\r
+character stops cookies in\r
+both directions.\" ijbfaq.html#crumble\r
+Thus a cookiefile containing a single line with the two characters\r
+\fC\&>*\fP\r
+will pass on all cookies to servers but not give any new ones to the browser.\r
+.TP\r
+.\" anchor: o_j jarfile\r
+\fI-j jarfile\fP (Old) jarfile \fIjarfile\fP (New)\r
+All Set-cookie attempts by the server are\r
+logged\" ijbfaq.html#jar\r
+to\r
+\fI\&jarfile\fP.\r
+If no wafer is specified,\r
+one containing a\r
+canned notice\" ijbfaq.html#notice\r
+(the \r
+\fI\&vanilla wafer\fP)\r
+is added as an alert to the server\r
+unless the\r
+suppress-vanilla-wafer\" ijbman.html#suppress-vanilla-wafer\r
+option is invoked.\r
+.TP\r
+.\" anchor: o_v suppress-vanilla-wafer\r
+\fI-v\fP (Old) suppress-vanilla-wafer \fI\fP (New)\r
+Suppress the vanilla wafer.\r
+.TP\r
+.\" anchor: o_t from\r
+\fI-t from\fP (Old) from \fIfrom\fP (New)\r
+If the browser\r
+discloses an email address\" ijbfaq.html#from\r
+in the\r
+\fB\&FROM\fP\r
+header (most don't),\r
+replace it with\r
+\fI\&from.\fP\r
+If\r
+\fI\&from\fP\r
+is set to\r
+\fB\&.\fP\r
+(the period character)\r
+the\r
+\fB\&FROM\fP\r
+is passed to the server unchanged.\r
+The default is to delete the\r
+\fB\&FROM\fP\r
+header.\r
+.TP\r
+.\" anchor: o_r referer\r
+\fI-r referer\fP (Old) referer \fIreferer\fP (New)\r
+Whenever the browser discloses the\r
+\s-2URL\s0\r
+that\r
+led to\" ijbfaq.html#referer\r
+the current request,\r
+replace it with\r
+\fI\&referer.\fP\r
+If\r
+\fI\&referer\fP\r
+is set to\r
+\fB\&.\fP\r
+(period)\r
+the \r
+\s-2URL\s0\r
+is passed to the server unchanged.\r
+In \r
+Version 1.4\r
+and later, if referer is set to \r
+\fB\&@\fP\r
+(at) the\r
+\s-2URL\s0\r
+is sent in cases where the cookiefile\r
+specifies that a cookie would be sent.\r
+(No way to send bogus referers selectively is provided.)\r
+The default is to delete Referer.\r
+.P\r
+Version 2.0 also accepts the spelling\r
+\fC\&referrer\fP,\r
+which most dictionaries consider correct.\r
+.TP\r
+.\" anchor: o_u user-agent\r
+\fI-u user-agent\fP (Old) user-agent \fIuser-agent\fP (New)\r
+Information disclosed by the browser\r
+about itself\" ijbfaq.html#agent\r
+is replaced with the value\r
+\fI\&user-agent.\fP\r
+If\r
+\fI\&user-agent\fP\r
+is set to\r
+\fB\&.\fP\r
+(period)\r
+the\r
+\fB\&User-Agent\fP\r
+header is passed to the server unchanged,\r
+along with any\r
+\fB\&UA\fP\r
+headers produced by\r
+\s-2MS-IE\s0\r
+(which would otherwise be deleted).\r
+In \r
+Version 1.4\r
+and later, if\r
+\fI\&user-agent\fP\r
+is set to\r
+\fB\&@\fP\r
+(at) these headers are sent unchanged in cases where the cookiefile\r
+specifies that a cookie would be sent,\r
+otherwise only default\r
+\fB\&User-Agent\fP\r
+header is sent.\r
+That default\r
+is Mozilla/3.0 (Netscape)\r
+with an unremarkable\r
+Macintosh\" ijbfaq.html#infer\r
+configuration.\r
+If used with a browser less advanced than Mozilla/3.0 or IE-3, the default\r
+may encourage pages containing extensions that confuse the browser.\r
+.TP\r
+.\" anchor: o_h listen-address\r
+\fI-h [host][:port]\fP (Old) listen-address \fI[host][:port]\fP (New)\r
+If\r
+\fI\&host\fP\r
+is specified,\r
+bind the\r
+\fBjunkbuster\fP\r
+to that\r
+\s-2IP\s0\r
+address.\r
+If a\r
+\fI\&port\fP\r
+is specified, use it.\r
+The default\r
+port\r
+is 8000;\r
+the default host is\r
+\fC\&localhost\fP.\r
+Before Version 2.0.2,\r
+the default was to bind to all \r
+\s-2IP\s0\r
+addresses\r
+(\fB\&INADDR_ANY\fP);\r
+but this has been restricted to\r
+\fB\&localhost\fP\r
+to avoid unintended security breaches.\r
+(To open the proxy to all, use the line\r
+.br\r
+.ti +0.25i\r
+\fB\&listen-address :8000\fP\r
+.br\r
+in the configuration file.)\r
+.TP\r
+.\" anchor: o_f forwardfile\r
+\fI-f forward_host[:port]\fP (Old) forwardfile \fIforwardfile\fP (New)\r
+Version 1.X required all\r
+\s-2HTTP\s0\r
+requests from the client to be forwarded to the same destination.\r
+Version 2.0 takes its routing specification from a\r
+\fI\&forwardfile\fP,\r
+allowing selection of the proxy (a.k.a. forwarding host) and gateway\r
+according to the\r
+\s-2URL\s0.\r
+Here is a typical line.\r
+.br\r
+.ft CW\r
+.S 8\r
+.nf\r
+.sp\r
+*         lpwa.com:8000      .      .\r
+.S\r
+.ft\r
+.fi\r
+.sp\r
+\r
+.P\r
+Each line contains four fields:\r
+\fB\&target\fP,\r
+\fB\&forward_to\fP,\r
+\fB\&via_gateway_type\fP\r
+and\r
+\fB\&gateway\fP.\r
+As usual, the\r
+last\" ijbman.html#compare\r
+\fB\&target\fP\r
+domain that matches the requested\r
+\s-2URL\s0\r
+wins,\r
+and the\r
+\fC\&*\fP\r
+character alone matches any domain.\r
+The target domain need not be a fully qualified\r
+hostname; it can be a general domain such as\r
+\fC\&com\fP\r
+or\r
+\fC\&co.uk\fP\r
+or even just a port number.\r
+.\" anchor: nose\r
+For example, because\r
+<a href="http://lpwa.com">LPWA</a>\r
+does not handle\r
+SSL,\" ijbfaq.html#encrypt\r
+the line above will typically be followed by a line such as\r
+.br\r
+.ft CW\r
+.S 8\r
+.nf\r
+.sp\r
+:443  .      .      .\r
+.S\r
+.ft\r
+.fi\r
+.sp\r
+\r
+to allow SSL transactions to proceed directly.\r
+The cautious would also\r
+add an entry in their blockfile to stop transactions\r
+to port 443 for all but specified trusted sites.\r
+.P\r
+If the winning\r
+\fB\&forward_to\fP\r
+field is\r
+\fC\&.\fP\r
+(the dot character) the proxy connects \r
+directly to the server given in the\r
+\s-2URL\s0,\r
+otherwise it forwards to the host and port number specified.\r
+The default port is 8000.\r
+The\r
+\fC\&via_gateway_type\fP\r
+and\r
+\fC\&gateway\fP\r
+fields also use a dot to indicate no gateway protocol.\r
+The gateway protocols are explained\r
+below.\" ijbman.html#o_g\r
+.P\r
+The example line above in a forwardfile alone\r
+would send everything through port 8000 at\r
+\fC\&lpwa.com\fP\r
+with no gateway protocol,\r
+and is equivalent to the old\r
+\fC\&-f lpwa.com:8000\fP\r
+with no\r
+\fC\&-g\fP\r
+option.\r
+For more information see the example file provided with the distribution.\r
+.P\r
+Configure with care: no loop detection is performed.\r
+When setting up chains of proxies that might loop back, try adding\r
+Squid.\" ijbman.html#squid\r
+.TP\r
+.\" anchor: o_g \r
+\fI-g gw_protocol[:[gw_host][:gw_port]]\fP (Old) \r
+Use\r
+\fI\&gw_protocol\fP\r
+as the gateway protocol.\r
+This option was introduced in Version 1.4,\r
+but was folded into the\r
+forwardfile\" ijbman.html#forwardfile\r
+option in Version 2.0.\r
+The default is to use no gateway protocol;\r
+this may be explicitly specified as\r
+\fB\&direct\fP\r
+on the command line\r
+or the dot character in the forwardfile.\r
+The\r
+\fC\&SOCKS4\fP\r
+protocol may be specified as\r
+\fB\&socks\fP\r
+or\r
+\fB\&socks4\fP.\r
+The\r
+\fC\&SOCKS4A\fP\r
+protocol is specified as\r
+\fB\&socks4a\fP.\r
+The\r
+\fC\&SOCKS5\fP\r
+protocol is not currently supported.\r
+The default\r
+\s-2SOCKS\s0\r
+\fI\&gw_port\fP\r
+is 1080.\r
+.P\r
+The user's browser should\r
+\fInot\fP\r
+be\r
+configured\" ijbfaq.html#socks\r
+to use\r
+\fC\&SOCKS\fP;\r
+the proxy conducts the negotiations, not the browser.\r
+.P\r
+The user identification capabilities of\r
+\fC\&SOCKS4\fP\r
+are deliberately not used;\r
+the user is always identified to the\r
+\fC\&SOCKS\fP\r
+server as\r
+\fC\&userid=anonymous\fP.\r
+If the server's policy is to reject requests from\r
+\fC\&anonymous\fP,\r
+the proxy will not work.\r
+Use a\r
+debug\" ijbman.html#o_d\r
+value of 3\r
+to see the status returned by the server.\r
+.TP\r
+.\" anchor: o_d debug\r
+\fI-d N\fP (Old) debug \fIN\fP (New)\r
+Set debug mode.\r
+The most common value is 1,\r
+to\r
+pinpoint\" ijbfaq.html#pinpoint\r
+offensive\r
+\s-2URL\s0s,\r
+so they can be added to the blockfile.\r
+The value of\r
+\fB\&N\fP\r
+is a bitwise\r
+logical-\s-2OR\s0\r
+of the following values:\r
+.br\r
+.br\r
+\h'-\w"1 = "u'1 = URLs (show each URL requested by the browser);\r
+.br\r
+\h'-\w"2 = "u'2 = Connections (show each connection to or from the proxy);\r
+.br\r
+\h'-\w"4 = "u'4 = I/O (log I/O errors);\r
+.br\r
+\h'-\w"8 = "u'8 = Headers (as each header is scanned, show the header and what is done to it);\r
+.br\r
+\h'-\w"16 = "u'16 = Log everything (including debugging traces and the contents of the pages).\r
+.\" anchor: or\r
+Multiple\r
+\fB\&debug\fP\r
+lines are permitted; they are logical OR-ed together.\r
+.P\r
+Because most browsers send several requests in parallel\r
+the debugging output may appear intermingled, so the\r
+single-threaded\" ijbman.html#single-threaded\r
+option is recommended when using\r
+debug\" ijbman.html#debug\r
+with\r
+\fB\&N\fP\r
+greater than 1.\r
+.TP\r
+.\" anchor: o_y add-forwarded-header\r
+\fI-y\fP (Old) add-forwarded-header \fI\fP (New)\r
+Add \r
+\fB\&X-Forwarded-For\fP\r
+headers to the server-bound \r
+\s-2HTTP\s0\r
+stream\r
+indicating the client \r
+\s-2IP\s0\r
+address\r
+to the server,\" ijbfaq.html#detect\r
+in the new style of\r
+Squid 1.1.4.\" ijbman.html#squid\r
+If you want the traditional\r
+\fC\&HTTP_FORWARDED\fP\r
+response header, add it manually with the\r
+-x\" ijbman.html#o_x\r
+option.\r
+.TP\r
+.\" anchor: o_x add-header\r
+\fI-x HeaderText\fP (Old) add-header \fIHeaderText\fP (New)\r
+Add the\r
+\fI\&HeaderText\fP\r
+verbatim to requests to the server.\r
+Typical uses include\r
+adding old-style forwarding notices such as\r
+\fB\&Forwarded: by http://pro-privacy-isp.net\fP\r
+and reinstating the\r
+\fB\&Proxy-Connection: Keep-Alive\fP\r
+header\r
+(which the\r
+\fBjunkbuster\fP\r
+deletes so as\r
+not\" ijbfaq.html#detect\r
+to reveal its existence).\r
+No checking is done for correctness or plausibility,\r
+so it can be used to throw any old trash into the server-bound \r
+\s-2HTTP\s0\r
+stream.\r
+Please don't litter.\r
+.TP\r
+.\" anchor: o_s single-threaded\r
+\fI-s\fP (Old) single-threaded \fI\fP (New)\r
+Doesn't\r
+\fB\&fork()\fP\r
+a separate process\r
+(or create a separate thread)\r
+to handle each connection.\r
+Useful when debugging to keep the process single threaded.\r
+.TP\r
+.\" anchor: o_l logfile\r
+\fI-l logfile\fP (Old) logfile \fIlogfile\fP (New)\r
+Write all debugging data into\r
+\fI\&logfile.\fP\r
+The default\r
+\fI\&logfile\fP\r
+is the standard output.\r
+.TP\r
+.\" anchor: o_acl aclfile\r
+aclfile \fIaclfile\fP (New)\r
+Unless this option is used, the proxy talks to anyone who can connect to it,\r
+and everyone who can has equal permissions on where they can go.\r
+An access file allows restrictions to be placed on these two policies,\r
+by distinguishing some\r
+\fIsource\fP\r
+\s-2IP\s0\r
+addresses and/or\r
+some\r
+\fIdestination\fP\r
+addresses.\r
+(If a\r
+forwarder or a gateway\" ijbman.html#forwardfile\r
+is being used, its address is considered the destination address,\r
+not the ultimate\r
+\s-2IP\s0\r
+address of the\r
+\s-2URL\s0\r
+requested.)\r
+.P\r
+Each line of the access file begins with\r
+either the word\r
+\fB\&permit\fP\r
+or\r
+\fB\&deny\fP\r
+followed by source and (optionally) destination addresses \r
+to be matched against those of the\r
+\s-2HTTP\s0\r
+request.\r
+The last matching line specifies the result: if it was a\r
+\fB\&deny\fP\r
+line or if no line matched,\r
+the request will be refused.\r
+.P\r
+A source or destination\r
+can be specified as a single numeric\r
+\s-2IP\s0\r
+address,\r
+or with a hostname, provided that the host's name\r
+can be resolved to a numeric address: this cannot be used to block all\r
+\fB\&.mil \fP\r
+domains for example,\r
+because there is no single address associated with that domain name.\r
+Either form may be followed by a slash and an integer\r
+\fB\&N\fP,\r
+specifying a subnet mask of\r
+\fB\&N\fP\r
+bits.\r
+For example,\r
+\fB\&permit 207.153.200.72/24\fP\r
+matches the entire Class-C subnet from\r
+207.153.200.0\r
+through 207.153.200.255.\r
+(A netmask of 255.255.255.0 corresponds to 24 bits of\r
+ones in the netmask, as with\r
+\fC\&*_MASKLEN=24\fP.)\r
+A value of 16 would be used for a Class-B subnet.\r
+A value of zero for\r
+\fB\&N\fP\r
+in the subnet mask length will cause any address to match;\r
+this can be used to express a default rule.\r
+For more information see the example file provided with the distribution.\r
+.P\r
+If you like these access controls\r
+you should probably have\r
+firewall;\" ijbfaq.html#firewall\r
+they are not intended to replace one.\r
+.TP\r
+.\" anchor: o_tf trustfile\r
+trustfile \fItrustfile\fP (New)\r
+This feature is experimental, has not been fully documented and is\r
+very subject to change.\r
+The goal is for parents to be able to choose a page or site whose\r
+links they regard suitable for their\r
+young children\" ijbfaq.html#children\r
+and for the proxy to allow access only to sites mentioned there.\r
+To do this the proxy examines the\r
+referer\" ijbman.html#o_r\r
+variable on each page request to check they resulted from\r
+a click on the ``trusted referer'' site: if so the referred site\r
+is added to a list of trusted sites, so that the child can\r
+then move around that site.\r
+There are several uncertainties in this scheme that experience may be\r
+able to iron out; check back in the months ahead.\r
+.TP\r
+.\" anchor: o_ti trust_info_url\r
+trust_info_url \fItrust_info_url\fP (New)\r
+When access is denied due to lack of a trusted referer, this\r
+\s-2URL\s0\r
+is displayed with a message pointing the user to it for further information.\r
+.TP\r
+.\" anchor: o_hc hide-console\r
+hide-console \fI\fP (New)\r
+In the Windows version only, instructs the program\r
+to disconnect from and hide the command console after starting.\r
+.TP\r
+.\" anchor: o_a \r
+\fI-a\fP (Old) \r
+(Obsolete) Accept the server's\r
+\fB\&Set-cookie\fP\r
+headers, passing them through to the browser.\r
+.\" anchor: obsolete\r
+This option was removed in Version 1.2\r
+and replaced by an improvement to the\r
+-c\" ijbman.html#o_c\r
+option.\r
+.LE\r
+.SH INSTALLATION AND USE\r
+Browsers must be told where to find the\r
+\fBjunkbuster\fP\r
+(e.g.\r
+\fB\&localhost\fP\r
+port 8000).\r
+To set the \r
+\s-2HTTP\s0\r
+proxy in Netscape 3.0,\r
+go through:\r
+\fB\&Options\fP;\r
+\fB\&Network Preferences\fP;\r
+\fB\&Proxies\fP;\r
+\fB\&Manual Proxy Configuration\fP;\r
+\fB\&View\fP.\r
+See the\r
+\s-2FAQ\s0\r
+for other browsers.\r
+The\r
+Security Proxy\" ijbfaq.html#security\r
+should also be set to the same values,\r
+otherwise\r
+\fB\&shttp:\fP\r
+\s-2URL\s0s\r
+won't work.\r
+.P\r
+Note the limitations\r
+explained in the\r
+\s-2FAQ\s0.\r
+.SH CHECKING OPTIONS\r
+To allow users to\r
+check\" ijbfaq.html#show\r
+that a\r
+\fBjunkbuster\fP\r
+is running and how it is configured,\r
+it intercepts requests for any\r
+\s-2URL\s0\r
+ending in\r
+\fB\&/show-proxy-args\fP\r
+and blocks it,\r
+returning instead returns information on its\r
+version number and\r
+current configuration\r
+including the contents of its blockfile.\r
+To get an explicit warning that no\r
+\fBjunkbuster\fP\r
+intervened if the proxy was not configured,\r
+it's best to point it to a\r
+\s-2URL\s0\r
+that does this, such as\r
+http://internet.junkbuster.com/cgi-bin/show-proxy-args\r
+on Junkbusters's website.\r
+.SH SEE ALSO\r
+http://www.waldherr.org/junkbuster/\" waldherr.org#\r
+.br\r
+http://www.junkbusters.com/ht/en/ijbfaq.html\" ijbfaq.html#\r
+.br\r
+http://www.junkbusters.com/ht/en/cookies.html\" cookies.html#\r
+.br\r
+http://internet.junkbuster.com/cgi-bin/show-proxy-args\r
+.br\r
+http://www.cis.ohio-state.edu/htbin/rfc/rfc2109.html\r
+.br\r
+http://squid.nlanr.net/Squid/\r
+.br\r
+http://www-math.uni-paderborn.de/~axel/\r
+.SH COPYRIGHT AND GPL\r
+Written and copyright by the Anonymous Coders and Junkbusters Corporation\r
+and made available under the\r
+GNU General Public License (GPL).\" gpl.html#\r
+This software comes with\r
+NO WARRANTY.\" gpl.html#nowarr\r
+Internet Junkbuster\r
+Proxy\r
+is a\r
+trademark\" legal.html#marks\r
+of Junkbusters Corporation.\r
diff --git a/junkbuster.init b/junkbuster.init
new file mode 100644 (file)
index 0000000..f35001a
--- /dev/null
@@ -0,0 +1,133 @@
+#!/bin/sh
+#  ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.init,v $
+# 
+#  Purpose     :  This shell script takes care of starting and stopping
+#                 junkbuster.
+#                 This works only correctly if the user `nobody' is allowed
+#                 to be in the directory where this file is called 
+#                 (for example: /root is NOT ok)
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 Based on the Internet Junkbuster originally written
+#                 by and Copyright (C) 1997 Anonymous Coders and
+#                 Junkbusters Corporation.  http://www.junkbusters.com
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: junkbuster.init,v $
+#     Revision 1.7  2001/06/28 13:40:26  sarantis
+#     remove single quotes from $JB; it was not expanded.
+#
+#     Revision 1.6  2001/06/28 13:38:42  sarantis
+#     formatting changes; individual return values are returned from the init script.
+#
+#     Revision 1.5  2001/06/11 11:37:40  sarantis
+#     Minor editing changes.
+#
+#     Revision 1.4  2001/06/09 09:14:11  swa
+#     shamelessly adapted RPM stuff from the newest rpm that
+#     RedHat provided for the JB.
+#
+#     Revision 1.3  2001/05/25 10:12:44  oes
+#     Fixed default case in switch statement (# -> *)
+#
+#     Revision 1.2  2001/05/24 07:52:24  swa
+#     added header. removed ^M.
+#
+# 
+# ********************************************************************/
+
+# This is file /etc/rc.d/init.d/junkbuster and was put here 
+# by the junkbuster rpm
+#
+# chkconfig: 235 84 09
+#
+# description: This shell script takes care of starting and stopping \
+#             junkbuster.
+#
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+. /etc/sysconfig/network
+
+#  Check that networking is up.
+[ ${NETWORKING} = "no" ] && exit 0
+[ -f /usr/sbin/junkbuster ] || exit 0
+
+[ -f /etc/junkbuster/config ] || exit 0
+
+# See how we were called.
+
+JB="/usr/sbin/junkbuster /etc/junkbuster/config & "
+start () {
+       # start daemon
+       [ -f /var/lock/subsys/junkbuster ] && exit 0
+       echo -n $"Starting junkbuster: "
+       daemon --user junkbust $JB 
+       RETVAL=$?
+       echo
+       [ $RETVAL = 0 ] && touch /var/lock/subsys/junkbuster
+       return $RETVAL
+}
+
+stop () {
+       # stop daemon
+       echo -n $"Stopping junkbuster: "
+       killproc junkbuster && rm -f /var/lock/subsys/junkbuster
+       RETVAL=$?
+       echo
+       return $RETVAL
+}
+
+case "$1" in
+  start)
+       start   
+       ;;
+  stop)
+       stop    
+       ;;
+  reload|restart)
+       stop
+       start
+       RETVAL=$?
+       ;;
+  condrestart)
+       # restart only if already running
+       if [ -f /var/lock/subsys/junkbuster ] ; then
+               stop
+               start
+               RETVAL=$?
+       fi 
+       ;;
+  status)
+       status junkbuster
+       RETVAL=$?
+       ;;
+  *)
+       echo $"Usage: junkbuster {start|stop|reload|restart|condrestart|status}"
+       exit 1
+esac
+
+exit $RETVAL
diff --git a/junkbuster.init.suse b/junkbuster.init.suse
new file mode 100644 (file)
index 0000000..e49579e
--- /dev/null
@@ -0,0 +1,76 @@
+#! /bin/sh
+#  ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.init,v $
+# 
+#  Purpose     :  This shell script takes care of starting and stopping
+#                 junkbuster.
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 Based on the Internet Junkbuster originally written
+#                 by and Copyright (C) 1997 Anonymous Coders and
+#                 Junkbusters Corporation.  http://www.junkbusters.com
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: junkbuster.init,v $
+#
+# 
+# ********************************************************************/
+### BEGIN INIT INFO
+# Provides:       junkbuster ijb
+# Required-Start: $network syslog
+# Required-Stop:
+# Default-Start:  3 5
+# Default-Stop:
+# Description:    Starts the Internet Junkbuster
+### END INIT INFO
+. /etc/rc.config
+base=\${0##*/}
+link=\${base#*[SK][0-9][0-9]}
+#test \$link = \$base && START_IJB=yes
+#test "\$START_IJB" = "yes" || exit 0
+return=\$rc_done
+case "\$1" in
+    start)
+        echo -n "Starting The Internet Junkbuster"
+        su - nobody -c 'nohup /usr/sbin/junkbuster /etc/junkbuster/config < /dev/null > /dev/null &'
+        sleep 1
+        echo -e "\$return"
+        ;;
+    stop)
+        echo -n "Shutting down The Internet Junkbuster"
+        killproc -TERM /usr/sbin/junkbuster || return=\$rc_failed
+        echo -e "\$return"
+        ;;
+    restart|reload)
+        \$0 stop && \$0 start || return=\$rc_failed
+        ;;
+    status)
+        checkproc /usr/sbin/junkbuster && echo OK || echo No process
+        ;;
+    *)
+        echo "Usage: \$0 {start|restart|status|stop}"
+        exit 1
+esac
+test "\$return" = "\$rc_done" || exit 1
+exit 0
similarity index 56%
rename from privoxy.logrotate
rename to junkbuster.logrotate
index 035112a..e13ee1d 100644 (file)
@@ -1,15 +1,15 @@
 #
-# Logrotate file for Privoxy RPM
+# Logrotate file for Junkbuster RPM
 #
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.logrotate,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.logrotate,v $
 # 
-#  Purpose     :  Rotates all potential Privoxy logfiles
+#  Purpose     :  Rotates all potential Junkbuster logfiles
 #                 
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.logrotate,v $
-#     Revision 1.3  2002/03/24 15:19:57  swa
-#     name change related issue.
-#
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.7  2001/12/30 14:07:32  steudten
-#     - Add signal handling (unix)
-#     - Add SIGHUP handler (unix)
-#     - Add creation of pidfile (unix)
-#     - Add action 'top' in rc file (RH)
-#     - Add entry 'SIGNALS' to manpage
-#     - Add exit message to logfile (unix)
-#
-#     Revision 1.6  2001/12/13 23:19:43  steudten
-#     Add 'restart' of junkbuster service after rotate logfiles.
-#     Better we could use the well known 'kill -HUP', but the handler
-#     isn't there at this time.
-#
-#     Revision 1.5  2001/11/05 21:31:51  steudten
-#     Change switch mode from weekly to size 1M
-#
-#     Revision 1.4  2001/06/28 13:30:22  sarantis
-#     add missingok for the jarfile entry
-#
+#     $Log: junkbuster.logrotate,v $
 #     Revision 1.3  2001/06/04 18:31:58  swa
 #     files are now prefixed with either `confdir' or `logdir'.
 #     `make redhat-dist' replaces both entries confdir and logdir
 # 
 # ********************************************************************/
 
-/var/log/privoxy/logfile {
+/var/log/junkbuster/logfile {
    compress
-   size 1M
-   postrotate
-        /sbin/service privoxy reload  2> /dev/null || true
-   endscript
+   weekly
 }
 
-/var/log/privoxy/jarfile {
-   missingok
-   compress
-   size 1M
-   postrotate
-        /sbin/service privoxy reload  2> /dev/null || true
-   endscript
+/var/log/junkbuster/jarfile {
+  missingok
+  compress
+  weekly
 }
similarity index 87%
rename from privoxy.monthly
rename to junkbuster.monthly
index 15734dd..89dac65 100644 (file)
@@ -2,13 +2,13 @@
 
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.monthly,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/gateway.h,v $
 # 
 #  Purpose     :  Downloads updated configuration (blocklists, ...)
 #                 to the machine.
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.monthly,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.3  2001/05/24 07:41:33  swa
-#     added header
-#
+#     $Log: gateway.h,v $
 # 
 # 
 # ********************************************************************/
similarity index 84%
rename from privoxy.weekly
rename to junkbuster.weekly
index 81424f8..fdd5bf1 100644 (file)
@@ -2,13 +2,13 @@
 
 # ********************************************************************
 # 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.weekly,v $
+#  File        :  $Source: /cvsroot/ijbswa/current/junkbuster.monthly,v $
 # 
 #  Purpose     :  Downloads updated configuration (blocklists, ...)
 #                 to the machine.
 # 
 #  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
 # 
 #                 Based on the Internet Junkbuster originally written
 #                 by and Copyright (C) 1997 Anonymous Coders and 
 #                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 # 
 #  Revisions   :
-#     $Log: privoxy.weekly,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.2  2001/05/24 07:52:24  swa
-#     added header. removed ^M.
-#
+#     $Log: junkbuster.monthly,v $
 #     Revision 1.3  2001/05/24 07:41:33  swa
 #     added header
 #
index 3465373..95dfabb 100644 (file)
@@ -1,4 +1,4 @@
-const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Exp $";
+const char killpopup_rcs[] = "$Id: killpopup.c,v 1.3 2001/05/22 18:56:28 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/killpopup.c,v $
@@ -6,13 +6,13 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
  * Purpose     :  Handles the filtering of popups.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -32,54 +32,6 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
  *
  * Revisions   :
  *    $Log: killpopup.c,v $
- *    Revision 1.15  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.14  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.13  2001/11/13 00:16:40  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.12  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.11  2001/10/07 15:42:41  oes
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Revision 1.10  2001/09/22 16:34:44  jongfoster
- *    Removing unneeded #includes
- *
- *    Revision 1.9  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/20 19:29:25  haroon
- *    - In v1.5 forgot to add that I implemented LOG_LEVEL_POPUPS in errlog.c,
- *      errlog.h and killpopup.c. In that case, it is superfluous to have define for
- *      POPUP_VERBOSE, so I removed the defines and logging is now done
- *      via log_error(LOG_LEVEL_POPUPS, ....)
- *
- *    Revision 1.6  2001/07/19 19:11:35  haroon
- *    - Implemented Guy's idea of replacing window.open( with 1;''.concat(
- *    - Implemented Guy's idea of replacing .resizeTo( with .scrollTo(
- *
- *    Revision 1.5  2001/07/18 15:02:52  haroon
- *    improved nuking of window.open
- *
- *    Revision 1.4  2001/06/29 13:29:55  oes
- *    Added FIXMEs (and didn't repair, hehe)
- *
  *    Revision 1.3  2001/05/22 18:56:28  oes
  *    CRLF -> LF
  *
@@ -109,102 +61,122 @@ const char killpopup_rcs[] = "$Id: killpopup.c,v 1.15 2002/03/24 13:25:43 swa Ex
 #include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
+#include <malloc.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <ctype.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
 #include "project.h"
 #include "killpopup.h"
-#include "errlog.h"
+#include "jcc.h"
 
 const char killpopup_h_rcs[] = KILLPOPUP_H_VERSION;
 
-#ifdef FEATURE_KILL_POPUPS
+#ifdef KILLPOPUPS
+
+/* Change these for debug output.  *lots*. */
+/*#define POPUP_VERBOSE 1*/
+#undef POPUP_VERBOSE
+
 
 /*********************************************************************
  *
  * Function    :  filter_popups
  *
- * Description :  Filter the block of data that's been read from the server
- *                for javascript popup code and replace by syntactically
- *                neutral code of the same size.
- *                Raise the CSP_FLAG_MODIFIED flag on success.
+ * Description :  Filter the block of data that's been read from the server.
+ *                Caller is responsible for checking permissons list
+ *                to determine if this function should be called.
+ *                FIXME: Should use the replacements proposed by Guy
  *
  * Parameters  :
  *          1  :  buff = Buffer to scan and modify.  Null terminated.
- *          2  :  csp = Client state pointer
+ *          2  :  size = Buffer size, excluding null terminator.
  *
  * Returns     :  void
  *
  *********************************************************************/
-void filter_popups(char *buff, struct client_state *csp)
+void filter_popups(char *buff, int size)
 {
-   char *start_p = NULL;
-   char *close_p = NULL;
+   char *popup = NULL;
+   char *close = NULL;
    char *p     = NULL;
+   char *q     = NULL; /* by BREITENB NEW! */
 
-   /*
-    * replace the window.open( with a harmless JavaScript replacement
-    * (notice the two single quotes)
-    */
-   while ((start_p = strstr(buff, "window.open(")) != NULL)
+   while ((popup = strstr( buff, "window.open(" )) != NULL)
    {
-      if (start_p)
+#ifdef POPUP_VERBOSE
+      fprintf(logfp, "Found start of window open" );
+#endif
+      close = strstr( popup+1, ");" );
+      if ( close )
       {
-         strncpy(start_p, "1;''.concat(", 12);
-         log_error(LOG_LEVEL_POPUPS, "Blocked popup window open");
-         csp->flags |= CSP_FLAG_MODIFIED;
+#ifdef POPUP_VERBOSE
+         fprintf(logfp, "Found end of window open" );
+#endif
+         for ( p = popup; p != (close+1); p++ )
+         {
+            *p = ' ';
+         }
+#ifdef POPUP_VERBOSE
+         fprintf(logfp, "Blocked %s\n", host_name );
+#endif
+      }
+      else
+      {
+#ifdef POPUP_VERBOSE
+         fprintf(logfp, "Couldn't find end, turned into comment.  Read boundary?\n" );
+#endif
+         *popup = '/';
+         popup++;
+         *popup = '/';
       }
-   }
 
-   /*
-    * replace the .resizeTo( with a harmless JavaScript replacement
-    */
-   while ((start_p = strstr(buff, ".resizeTo(")) != NULL)
-   {
-      if (start_p)
+
+      q=popup; /* by BREITENB NEW! */
+      while (q>=buff)
+      {
+         if (*q==' ' || *q=='\t')
+            q--;
+         else break;
+      }
+      if (q>=buff)
       {
-         strncpy(start_p, ".scrollTo(", 10);
-         log_error(LOG_LEVEL_POPUPS, "Blocked popup window resize");
-         csp->flags |= CSP_FLAG_MODIFIED;
+         if (*q=='=') *++q='1';
+         /* result of popup is assigned to a variable! ensure success. hehehe. */
       }
    }
 
-   /* 
-    * Filter onUnload and onExit
-    */
-   start_p = strstr(buff, "<body");
-   if (!start_p) start_p = strstr(buff, "<BODY");
-   if (!start_p) start_p = strstr(buff, "<Body");
-   if (!start_p) start_p = strstr(buff, "<BOdy");
-   if (start_p)
+   /* Filter all other crap like onUnload onExit etc.  (by BREITENB) NEW!*/
+   popup=strstr( buff, "<body");
+   if (!popup) popup=strstr( buff, "<BODY");
+   if (!popup) popup=strstr( buff, "<Body");
+   if (!popup) popup=strstr( buff, "<BOdy");
+   if (popup)
    {
-      close_p = strchr(start_p, '>');
-      if (close_p)
+      close=strchr(popup,'>');
+      if (close)
       {
-         /* we are now between <body and the ending > */
-         p = strstr(start_p, "onUnload");
+         /* we are now between <body and the ending > FIXME: No, we're anywhere! --oes*/
+         p=strstr(popup, "onUnload");
          if (p)
          {
-            strncpy(p, "_nU_", 4);
-            csp->flags |= CSP_FLAG_MODIFIED;
+            strncpy(p,"_nU_",4);
          }
-         p = strstr(start_p, "onExit");
+         p=strstr(popup, "onExit");
          if (p)
          {
-            strncpy(p, "_nE_", 4);
-            csp->flags |= CSP_FLAG_MODIFIED;
+            strncpy(p,"_nE_",4);
          }
       }
    }
 
 }
 
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
 /*
   Local Variables:
index 7d2eadf..23bd7d7 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef KILLPOPUP_H_INCLUDED
-#define KILLPOPUP_H_INCLUDED
-#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.7 2002/03/24 13:25:43 swa Exp $"
+#ifndef _KILLPOPUP_H
+#define _KILLPOPUP_H
+#define KILLPOPUP_H_VERSION "$Id: killpopup.h,v 1.1.1.1 2001/05/15 13:58:58 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/killpopup.h,v $
@@ -8,7 +8,7 @@
  * Purpose     :  Handles the filtering of popups.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: killpopup.h,v $
- *    Revision 1.7  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.6  2001/10/07 15:42:41  oes
- *    filter_popups now gets a csp pointer so it can raise the new
- *      CSP_FLAG_MODIFIED flag.
- *
- *    Revision 1.5  2001/07/31 14:44:22  oes
- *    Deleted unused size parameter from filter_popups()
- *
- *    Revision 1.4  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.3  2001/07/29 18:59:21  jongfoster
- *    - Changing #define _KILLPOPUP_H to KILLPOPUP_H_INCLUDED
- *    - Adding extern "C" {}
- *
- *    Revision 1.2  2001/05/20 01:21:20  jongfoster
- *    Version 2.9.4 checkin.
- *    - Merged popupfile and cookiefile, and added control over PCRS
- *      filtering, in new "permissionsfile".
- *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
- *      file error you now get a message box (in the Win32 GUI) rather
- *      than the program exiting with no explanation.
- *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
- *      skipping.
- *    - Removed tabs from "config"
- *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
- *    - Bumped up version number.
- *
  *    Revision 1.1.1.1  2001/05/15 13:58:58  oes
  *    Initial import of version 2.9.3 source tree
  *
 
 #include "project.h"
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+#ifdef KILLPOPUPS
 
-#ifdef FEATURE_KILL_POPUPS
+extern void filter_popups(char *buff, int size);
 
-extern void filter_popups(char *buff, struct client_state *csp);
-
-#endif /* def FEATURE_KILL_POPUPS */
+#endif /* def KILLPOPUPS */
 
 /* Revision control strings from this header and associated .c file */
 extern const char killpopup_rcs[];
 extern const char killpopup_h_rcs[];
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef KILLPOPUP_H_INCLUDED */
+#endif /* ndef _KILLPOPUP_H */
 
 /*
   Local Variables:
diff --git a/list.c b/list.c
index 6cd7f89..18e5da7 100644 (file)
--- a/list.c
+++ b/list.c
@@ -1,4 +1,4 @@
-const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
+const char list_rcs[] = "$Id: list.c,v 1.4 2001/06/29 13:30:22 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/list.c,v $
@@ -8,13 +8,13 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
  *                   `destroy_list', `enlist' and `list_to_text'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -34,47 +34,6 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: list.c,v $
- *    Revision 1.14  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.13  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.12  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.11  2001/10/23 21:21:03  jongfoster
- *    New error handling - error codes are now jb_errs, not ints.
- *    Changed the way map() handles out-of-memory, to dramatically
- *    reduce the amount of error-checking clutter needed.
- *
- *    Revision 1.10  2001/09/16 17:30:24  jongfoster
- *    Fixing a compiler warning.
- *
- *    Revision 1.9  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.8  2001/08/07 14:00:20  oes
- *    Fixed comment
- *
- *    Revision 1.7  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.6  2001/07/31 14:44:51  oes
- *    list_to_text() now appends empty line at end
- *
- *    Revision 1.5  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.4  2001/06/29 13:30:22  oes
  *    - Added Convenience function enlist_unique_header(),
  *      which takes the Header name and value as separate
@@ -111,174 +70,23 @@ const char list_rcs[] = "$Id: list.c,v 1.14 2002/03/24 13:25:43 swa Exp $";
 
 #include "config.h"
 
-#ifndef _WIN32
-/* FIXME: The following headers are not needed for Win32.  Are they
- * needed on other platforms?
- */
 #include <stdio.h>
 #include <sys/types.h>
 #include <stdlib.h>
 #include <ctype.h>
-#endif
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
-#include <assert.h>
-
 #include "project.h"
+#include "jcc.h"
 #include "list.h"
 #include "miscutil.h"
 
 const char list_h_rcs[] = LIST_H_VERSION;
 
-
-static int list_is_valid (const struct list *the_list);
-
-
-/*********************************************************************
- *
- * Function    :  list_init
- *
- * Description :  Create a new, empty list in user-allocated memory.
- *                Caller should allocate a "struct list" variable,
- *                then pass it to this function.
- *                (Implementation note:  Rather than calling this
- *                function, you can also just memset the memory to
- *                zero, e.g. if you have a larger structure you
- *                want to initialize quickly.  However, that isn't
- *                really good design.)
- *
- * Parameters  :
- *          1  :  the_list = pointer to list
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void init_list(struct list *the_list)
-{
-   memset(the_list, '\0', sizeof(*the_list));
-}
-
-
-/*********************************************************************
- *
- * Function    :  destroy_list
- *
- * Description :  Destroy a string list (opposite of list_init).
- *                On return, the memory used by the list entries has
- *                been freed, but not the memory used by the_list
- *                itself.  You should not re-use the_list without
- *                calling list_init().
- *
- *                (Implementation note:  You *can* reuse the_list
- *                without calling list_init(), but please don't.
- *                If you want to remove all entries from a list
- *                and still have a usable list, then use
- *                list_remove_all().)
- *
- * Parameters  :
- *          1  :  the_list = pointer to list
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void destroy_list (struct list *the_list)
-{
-   struct list_entry *cur_entry, *next_entry;
-
-   assert(the_list);
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry)
-   {
-      next_entry = cur_entry->next;
-      freez(cur_entry->str);
-      free(cur_entry);
-   }
-
-   the_list->first = NULL;
-   the_list->last = NULL;
-}
-
-
-/*********************************************************************
- *
- * Function    :  list_is_valid
- *
- * Description :  Check that a string list is valid.  The intended
- *                usage is "assert(list_is_valid(the_list))".
- *                Currently this checks that "the_list->last"
- *                is correct, and that the list dosn't contain
- *                circular references.  It is likely to crash if
- *                it's passed complete garbage.
- *
- * Parameters  :
- *          1  :  the_list = pointer to list.  Must be non-null.
- *
- * Returns     :  1 if list is valid, 0 otherwise.
- *
- *********************************************************************/
-static int list_is_valid (const struct list *the_list)
-{
-   /*
-    * If you don't want this check, just change the line below
-    * from "#if 1" to "#if 0".
-    */
-#if 1
-   const struct list_entry *cur_entry;
-   const struct list_entry *last_entry = NULL;
-   int length = 0;
-
-   assert(the_list);
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
-   {
-      last_entry = cur_entry;
-
-      if (cur_entry->str)
-      {
-         /*
-          * Just check that this string can be accessed - i.e. it's a valid
-          * pointer.
-          */
-         strlen(cur_entry->str);
-      }
-
-      /*
-       * Check for looping back to first
-       */
-      if ((length != 0) && (cur_entry == the_list->first))
-      {
-         return 0;
-      }
-
-      /*
-       * Arbitrarily limit length to prevent infinite loops.
-       */
-      if (++length > 1000)
-      {
-         return 0;
-      }
-
-      /*
-       * Check this isn't marked as the last entry, unless of course it's
-       * *really* the last entry.
-       */
-      if ((the_list->last == cur_entry) && (cur_entry->next != NULL))
-      {
-         /* This is the last entry, but there's data after it !!?? */
-         return 0;
-      }
-   }
-
-   return (the_list->last == last_entry);
-#else
-   return 1;
-#endif
-}
-
 /*********************************************************************
  *
  * Function    :  enlist
@@ -286,51 +94,32 @@ static int list_is_valid (const struct list *the_list)
  * Description :  Append a string into a specified string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *          2  :  str = string to add to the list (maybe NULL)
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist(struct list *the_list, const char *str)
+void enlist(struct list *header, const char *str)
 {
-   struct list_entry *cur;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   struct list *cur = (struct list *)malloc(sizeof(*cur));
+   struct list *last;
 
-   if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur))))
+   if (cur)
    {
-      return JB_ERR_MEMORY;
-   }
+      cur->str  = (str ? strdup(str) : NULL);
+      cur->next = NULL;
 
-   if (str)
-   {
-      if (NULL == (cur->str = strdup(str)))
+      last = header->last;
+      if (last == NULL)
       {
-         free(cur);
-         return JB_ERR_MEMORY;
+         last = header;
       }
-   }
-   /* else { cur->str = NULL; }  - implied by zalloc */
-
-   /* cur->next = NULL;  - implied by zalloc */
 
-   if (the_list->last)
-   {
-      the_list->last->next = cur;
-      the_list->last = cur;
-   }
-   else
-   {
-      the_list->first = cur;
-      the_list->last = cur;
+      last->next   = cur;
+      header->last = cur;
    }
 
-   assert(list_is_valid(the_list));
-   return JB_ERR_OK;
 }
 
 
@@ -342,46 +131,28 @@ jb_err enlist(struct list *the_list, const char *str)
  *                string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *          2  :  str = string to add to the list (maybe NULL)
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_first(struct list *the_list, const char *str)
+void enlist_first(struct list *header, const char *str)
 {
-   struct list_entry *cur;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   struct list *cur = (struct list *)malloc(sizeof(*cur));
 
-   if (NULL == (cur = (struct list_entry *)zalloc(sizeof(*cur))))
+   if (cur)
    {
-      return JB_ERR_MEMORY;
-   }
+      cur->str  = (str ? strdup(str) : NULL);
+      cur->next = header->next;
 
-   if (str)
-   {
-      if (NULL == (cur->str = strdup(str)))
+      header->next = cur;
+      if (header->last == NULL)
       {
-         free(cur);
-         return JB_ERR_MEMORY;
+         header->last = cur;
       }
    }
-   /* else { cur->str = NULL; }  - implied by zalloc */
-
-   cur->next = the_list->first;
 
-   the_list->first = cur;
-   if (the_list->last == NULL)
-   {
-      the_list->last = cur;
-   }
-
-   assert(list_is_valid(the_list));
-   return JB_ERR_OK;
 }
 
 
@@ -391,59 +162,49 @@ jb_err enlist_first(struct list *the_list, const char *str)
  *
  * Description :  Append a string into a specified string list,
  *                if & only if it's not there already.
- *                If the num_significant_chars argument is nonzero,
- *                only compare up to the nth character.
+ *                If the n argument is nonzero, only compare up to
+ *                the nth character. 
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  str = string to add to the list
- *          3  :  num_significant_chars = number of chars to use
- *                for uniqueness test, or 0 to require an exact match.
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  str = string to add to the list (maybe NULL)
+ *          3  :  n = number of chars to use for uniqueness test
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
- *                "Success" does not indicate whether or not the
- *                item was already in the list.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_unique(struct list *the_list, const char *str,
-                     size_t num_significant_chars)
+void enlist_unique(struct list *header, const char *str, int n)
 {
-   struct list_entry *cur_entry;
-
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(str);
-   assert(num_significant_chars >= 0);
-   assert(num_significant_chars <= strlen(str));
+   struct list *last;
+   struct list *cur = header->next;
 
-   if (num_significant_chars > 0)
+   while (cur != NULL)
    {
-      for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next)
+      if ((cur->str != NULL) && (
+         (n && (0 == strncmp(str, cur->str, n))) || 
+         (!n && (0 == strcmp(str, cur->str)))))
       {
-         if ( (cur_entry->str != NULL)
-           && (0 == strncmp(str, cur_entry->str, num_significant_chars)))
-         {
-            /* Already there */
-            return JB_ERR_OK;
-         }
+         /* Already there */
+         return;
       }
+      cur = cur->next;
    }
-   else
+
+   cur = (struct list *)malloc(sizeof(*cur));
+
+   if (cur != NULL)
    {
-      /* Test whole string */
-      for (cur_entry = the_list->first; cur_entry != NULL; cur_entry = cur_entry->next)
+      cur->str  = (str ? strdup(str) : NULL); /* FIXME check retval */
+      cur->next = NULL;
+
+      last = header->last;
+      if (last == NULL)
       {
-         if ( (cur_entry->str != NULL) && (0 == strcmp(str, cur_entry->str)))
-         {
-            /* Already there */
-            return JB_ERR_OK;
-         }
+         last = header;
       }
+      last->next   = cur;
+      header->last = cur;
    }
-
-   return enlist(the_list, str);
 }
 
 
@@ -456,84 +217,80 @@ jb_err enlist_unique(struct list *the_list, const char *str,
  *                if & only if there isn't already a header with that name.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  name = HTTP header name (e.g. "Content-type")
- *          3  :  value = HTTP header value (e.g. "text/html")
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  first = first string to add to the list (maybe NULL)
+ *          3  :  second = number of chars to use for uniqueness test
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, the_list will be unchanged.
- *                "Success" does not indicate whether or not the
- *                header was already in the list.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err enlist_unique_header(struct list *the_list, const char *name,
-                            const char *value)
+void enlist_unique_header(struct list *header, const char *name, const char *value)
 {
-   size_t length;
-   jb_err result;
-   char *str;
+   struct list *last;
+   struct list *cur = header->next;
+   int length;
+   char *dummy;
+
+   if (name == NULL || value == NULL) return;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(name);
-   assert(value);
+   dummy = strdup(name);
+   dummy = strsav(dummy, ": ");
+   length = strlen(dummy);
 
-   length = strlen(name) + 2;
-   if (NULL == (str = (char *)malloc(length + strlen(value) + 1)))
+   while (cur != NULL)
    {
-      return JB_ERR_MEMORY;
+      if ((cur->str != NULL) && 
+               (0 == strncmp(dummy, cur->str, length)))
+      {
+         /* Already there */
+         return;
+      }
+      cur = cur->next;
    }
-   strcpy(str, name);
-   str[length - 2] = ':';
-   str[length - 1] = ' ';
-   strcpy(str + length, value);
 
-   result = enlist_unique(the_list, str, length);
+   cur = (struct list *)malloc(sizeof(*cur));
 
-   free(str);
-
-   assert(list_is_valid(the_list));
-
-   return result;
+   if (cur != NULL)
+   {
+      cur->str  = strsav(dummy, value);
+      cur->next = NULL;
 
+      last = header->last;
+      if (last == NULL)
+      {
+         last = header;
+      }
+      last->next   = cur;
+      header->last = cur;
+   }
 }
 
 
 /*********************************************************************
  *
- * Function    :  list_remove_all
+ * Function    :  destroy_list
  *
- * Description :  Remove all entries from a list.  On return, the_list
- *                is a valid, empty list.  Note that this is similar
- *                to destroy_list(), but the difference is that this
- *                function guarantees that the list structure is still
- *                valid after the call.
+ * Description :  Destroy a string list (opposite of enlist)
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  header = pointer to list 'dummy' header
  *
  * Returns     :  N/A
  *
  *********************************************************************/
-void list_remove_all(struct list *the_list)
+void destroy_list(struct list *header)
 {
-   struct list_entry *cur_entry;
-   struct list_entry *next_entry;
+   struct list *p, *n;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = next_entry)
+   for (p = header->next; p ; p = n)
    {
-      next_entry = cur_entry->next;
-      freez(cur_entry->str);
-      free(cur_entry);
+      n = p->next;
+      freez(p->str);
+      free(p);
    }
 
-   the_list->first = the_list->last = NULL;
+   memset(header, '\0', sizeof(*header));
 
-   assert(list_is_valid(the_list));
 }
 
 
@@ -541,56 +298,52 @@ void list_remove_all(struct list *the_list)
  *
  * Function    :  list_to_text
  *
- * Description :  "Flatten" a string list into 1 long \r\n delimited string,
- *                adding an empty line at the end.  NULL entries are ignored.
- *                This function does not change the_list.
+ * Description :  "Flaten" a string list into 1 long \r\n delimited string.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
+ *          1  :  h = pointer to list 'dummy' header
  *
  * Returns     :  NULL on malloc error, else new long string.
- *                Caller must free() it.
  *
  *********************************************************************/
-char *list_to_text(const struct list *the_list)
+char *list_to_text(struct list *h)
 {
-   struct list_entry *cur_entry;
+   struct list *p;
    char *ret = NULL;
    char *s;
-   size_t size = 2;
+   int size;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
+   size = 0;
 
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
+   for (p = h->next; p ; p = p->next)
    {
-      if (cur_entry->str)
+      if (p->str)
       {
-         size += strlen(cur_entry->str) + 2;
+         size += strlen(p->str) + 2;
       }
    }
 
    if ((ret = (char *)malloc(size + 1)) == NULL)
    {
-      return NULL;
+      return(NULL);
    }
 
    ret[size] = '\0';
 
    s = ret;
 
-   for (cur_entry = the_list->first; cur_entry ; cur_entry = cur_entry->next)
+   for (p = h->next; p ; p = p->next)
    {
-      if (cur_entry->str)
+      if (p->str)
       {
-         strcpy(s, cur_entry->str);
+         strcpy(s, p->str);
          s += strlen(s);
          *s++ = '\r'; *s++ = '\n';
       }
    }
-   *s++ = '\r'; *s++ = '\n';
 
-   return ret;
+   return(ret);
+
 }
 
 
@@ -601,54 +354,36 @@ char *list_to_text(const struct list *the_list)
  * Description :  Remove a string from a specified string list.
  *
  * Parameters  :
- *          1  :  the_list = pointer to list
- *          2  :  str = string to remove from the list - non-NULL
+ *          1  :  header = pointer to list 'dummy' header
+ *          2  :  str = string to remove from the list
  *
  * Returns     :  Number of times it was removed.
  *
  *********************************************************************/
-int list_remove_item(struct list *the_list, const char *str)
+int list_remove_item(struct list *header, const char *str)
 {
-   struct list_entry *prev = NULL;
-   struct list_entry *cur;
-   struct list_entry *next;
+   struct list *prev = header;
+   struct list *cur = prev->next;
    int count = 0;
 
-   assert(the_list);
-   assert(list_is_valid(the_list));
-   assert(str);
-
-   cur = the_list->first;
-
    while (cur != NULL)
    {
-      next = cur->next;
-
       if ((cur->str != NULL) && (0 == strcmp(str, cur->str)))
       {
          count++;
 
-         if (prev != NULL)
-         {
-            prev->next = next;
-         }
-         else
-         {
-            the_list->first = next;
-         }
-         free((char *)cur->str);
+         prev->next = cur->next;
+         free(cur->str);
          free(cur);
       }
       else
       {
          prev = cur;
       }
-      cur = next;
+      cur = prev->next;
    }
 
-   the_list->last = prev;
-
-   assert(list_is_valid(the_list));
+   header->last = prev;
 
    return count;
 }
@@ -671,25 +406,18 @@ int list_remove_item(struct list *the_list, const char *str)
  *********************************************************************/
 int list_remove_list(struct list *dest, const struct list *src)
 {
-   struct list_entry *cur;
+   struct list *cur = src->next;
    int count = 0;
 
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
-   for (cur = src->first; cur != NULL; cur = cur->next)
+   while (cur != NULL)
    {
       if (cur->str != NULL)
       {
          count += list_remove_item(dest, cur->str);
       }
+      cur = cur->next;
    }
 
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
    return count;
 }
 
@@ -698,96 +426,35 @@ int list_remove_list(struct list *dest, const struct list *src)
  *
  * Function    :  list_duplicate
  *
- * Description :  Copy a string list
+ * Description :  Duplicate a string list
  *
  * Parameters  :
- *          1  :  dest = Destination list.  Must be a valid list.
- *                       All existing entries will be removed.
- *          1  :  src = pointer to source list for copy.
+ *          1  :  dest = pointer to destination for copy.  Caller allocs.
+ *          2  :  src = pointer to source for copy.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, dest will be empty.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err list_duplicate(struct list *dest, const struct list *src)
+void list_duplicate(struct list *dest, const struct list *src)
 {
-   struct list_entry * cur_src;
-   struct list_entry * cur_dest;
+   struct list * cur_src = src->next;
+   struct list * cur_dest = dest;
 
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   memset(dest, '\0', sizeof(*dest));
 
-   list_remove_all(dest);
-
-   /* Need to process first entry specially so we can set dest->first */
-   cur_src = src->first;
-   if (cur_src)
+   while (cur_src)
    {
-      cur_dest = dest->first = (struct list_entry *)zalloc(sizeof(*cur_dest));
+      cur_dest = cur_dest->next = (struct list *)zalloc(sizeof(*cur_dest));
       if (cur_dest == NULL)
       {
-         destroy_list(dest);
-
-         assert(list_is_valid(src));
-         assert(list_is_valid(dest));
-
-         return JB_ERR_MEMORY;
+         return;
       }
-
-      if (cur_src->str)
-      {
-         cur_dest->str = strdup(cur_src->str);
-         if (cur_dest->str == NULL)
-         {
-            destroy_list(dest);
-
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-      }
-      /* else { cur_dest->str = NULL; }  - implied by zalloc */
-
-      /* Now process the rest */
-      for (cur_src = cur_src->next; cur_src; cur_src = cur_src->next)
-      {
-         cur_dest = cur_dest->next = (struct list_entry *)zalloc(sizeof(*cur_dest));
-         if (cur_dest == NULL)
-         {
-            destroy_list(dest);
-
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-         if (cur_src->str)
-         {
-            cur_dest->str = strdup(cur_src->str);
-            if (cur_dest->str == NULL)
-            {
-               destroy_list(dest);
-
-               assert(list_is_valid(src));
-               assert(list_is_valid(dest));
-
-               return JB_ERR_MEMORY;
-            }
-         }
-         /* else { cur_dest->str = NULL; }  - implied by zalloc */
-      }
-
-      dest->last = cur_dest;
+      cur_dest->str = strdup(cur_src->str);
+      cur_src = cur_src->next;
    }
 
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   dest->last = cur_dest;
 
-   return JB_ERR_OK;
 }
 
 
@@ -799,261 +466,120 @@ jb_err list_duplicate(struct list *dest, const struct list *src)
  *                Duplicate items are not added.
  *
  * Parameters  :
- *          1  :  dest = pointer to destination list for merge.
+ *          1  :  dest = pointer to destination for merge.  Caller allocs.
  *          2  :  src = pointer to source for merge.
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *                On error, some (but not all) of src might have
- *                been copied into dest.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err list_append_list_unique(struct list *dest, const struct list *src)
+void list_append_list_unique(struct list *dest, const struct list *src)
 {
-   struct list_entry * cur;
-
-   assert(src);
-   assert(dest);
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
+   struct list * cur = src->next;
 
-   for (cur = src->first; cur; cur = cur->next)
+   while (cur)
    {
-      if (cur->str)
-      {
-         if (enlist_unique(dest, cur->str, 0))
-         {
-            assert(list_is_valid(src));
-            assert(list_is_valid(dest));
-
-            return JB_ERR_MEMORY;
-         }
-      }
+      enlist_unique(dest, cur->str, 0);
+      cur = cur->next;
    }
-
-   assert(list_is_valid(src));
-   assert(list_is_valid(dest));
-
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  list_is_empty
- *
- * Description :  Test whether a list is empty.  Does not change the list.
- *
- * Parameters  :
- *          1  :  the_list = pointer to list to test.
- *
- * Returns     :  Nonzero iff the list contains no entries.
- *
- *********************************************************************/
-int list_is_empty(const struct list *the_list)
-{
-   assert(the_list);
-   assert(list_is_valid(the_list));
-
-   return (the_list->first == NULL);
-}
-
-
-/*********************************************************************
- *
- * Function    :  new_map
- *
- * Description :  Create a new, empty map.
- *
- * Parameters  :  N/A
- *
- * Returns     :  A new, empty map, or NULL if out of memory.
- *
- *********************************************************************/
-struct map *new_map(void)
-{
-   return (struct map *) zalloc(sizeof(struct map));
-}
-
-
-/*********************************************************************
+ * Function    :  map
  *
- * Function    :  free_map
+ * Description :  Add a mapping from given name to given value to a
+ *                given map.
  *
- * Description :  Free the memory occupied by a map and its
- *                depandant strings
+ *                Note: Since all strings will be free()d in free_map()
+ *                      later, use the copy flags for constants or
+ *                      strings that will be independantly free()d.
  *
  * Parameters  :
- *          1  :  the_map = map to be freed.  May be NULL.
+ *          1  :  map = map to add to
+ *          2  :  name = name to add
+ *          3  :  nc = flag set if a copy of name should be used
+ *          4  :  value = value to add
+ *          5  :  vc = flag set if a copy of value should be used
  *
- * Returns     :  N/A
+ * Returns     :  pointer to extended map, or NULL if failiure
  *
  *********************************************************************/
-void free_map(struct map *the_map)
+struct map *map(struct map *map, char *name, int nc, char *value, int vc)
 {
-   struct map_entry *cur_entry;
-   struct map_entry *next_entry;
+   struct map *cur;
 
-   if (the_map == NULL)
+   if (NULL == (cur = zalloc(sizeof(*cur))))
    {
-      return;
+      return(NULL);
    }
 
-   for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = next_entry)
-   {
-      freez(cur_entry->name);
-      freez(cur_entry->value);
-
-      next_entry = cur_entry->next;
-      free(cur_entry);
-   }
+   cur->name  = nc ? strdup(name) : name;
+   cur->value = vc ? strdup(value) : value;
+   cur->next = map;
 
-   the_map->first = the_map->last = NULL;
+   return(cur);
 
-   free(the_map);
 }
 
 
 /*********************************************************************
  *
- * Function    :  map
- *
- * Description :  Add a mapping from given name to given value to a
- *                given map.
- *
- *                Note: Since all strings will be free()d in free_map()
- *                      later, set the copy flags for constants or
- *                      strings that will be independantly free()d.
- *
- *                Note2: This function allows NULL parameters - it
- *                       returns JB_ERR_MEMORY in that case.
- *
- *                Note3: If this function returns JB_ERR_MEMORY,
- *                       it will free(name) unless you specify
- *                       name_needs_copying, and similarly it will
- *                       free(value) unless you specify
- *                       value_needs_copying.
- *
- *                Due to Note2 and Note3 above, the following code
- *                is legal, and will never crash or leak memory even
- *                if the system runs out of memory:
- *
- *                    err = map(mymap, "xyz", 1, html_encode(somestring), 0);
+ * Function    :  lookup
  *
- *                err will be set to JB_ERR_MEMORY if either call runs
- *                out-of-memory.  Without these features, you would
- *                need to check the return value of html_encode in the
- *                above example for NULL, which (at least) doubles the
- *                amount of error-checking code needed.
+ * Description :  Look up an item with a given name in a map, and
+ *                return its value
  *
  * Parameters  :
- *          1  :  the_map = map to add to
- *          2  :  name = name to add
- *          3  :  name_needs_copying = flag set if a copy of name should be used
- *          4  :  value = value to add
- *          5  :  value_needs_copying = flag set if a copy of value should be used
+ *          1  :  name = name parameter to look for
  *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  the value if found, else the empty string
  *
  *********************************************************************/
-jb_err map(struct map *the_map,
-           const char *name, int name_needs_copying,
-           const char *value, int value_needs_copying)
+char *lookup(struct map *map, char *name)
 {
-   struct map_entry *new_entry;
+   struct map *p = map;
 
-   assert(the_map);
-
-   if ( (NULL == value)
-     || (NULL == name)
-     || (NULL == (new_entry = zalloc(sizeof(*new_entry)))) )
+   while (p)
    {
-      if ((name != NULL) && (!name_needs_copying))
+      if (!strcmp(name, p->name))
       {
-          free((char *)name);
+         return p->value;
       }
-      if ((value != NULL) && (!value_needs_copying))
-      {
-          free((char *)value);
-      }
-      return JB_ERR_MEMORY;
-   }
-
-   if (name_needs_copying)
-   {
-      if (NULL == (name = strdup(name)))
-      {
-         free(new_entry);
-         if (!value_needs_copying)
-         {
-             free((char *)value);
-         }
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   if (value_needs_copying)
-   {
-      if (NULL == (value = strdup(value)))
-      {
-         free((char *)name);
-         free(new_entry);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-   new_entry->name = name;
-   new_entry->value = value;
-   /* new_entry->next = NULL;  - implied by zalloc */
-
-   if (the_map->last)
-   {
-      the_map->last->next = new_entry;
-      the_map->last = new_entry;
-   }
-   else
-   {
-      the_map->first = new_entry;
-      the_map->last = new_entry;
+      p = p->next;
    }
+   return "";
 
-   return JB_ERR_OK;
 }
 
 
 /*********************************************************************
  *
- * Function    :  lookup
+ * Function    :  free_map
  *
- * Description :  Look up an item with a given name in a map, and
- *                return its value
+ * Description :  Free the memory occupied by a map and its
+ *                depandant strings
  *
  * Parameters  :
- *          1  :  the_map = map to look in
- *          2  :  name = name parameter to look for
+ *          1  :  list = list to bee freed
  *
- * Returns     :  the value if found, else the empty string.
- *                Return value is alloced as part of the map, so
- *                it is freed when the map is destroyed.  Caller
- *                must not free or modify it.
+ * Returns     :  N/A
  *
  *********************************************************************/
-const char *lookup(const struct map *the_map, const char *name)
+void free_map(struct map *map)
 {
-   const struct map_entry *cur_entry;
-
-   assert(the_map);
-   assert(name);
+   struct map *p = map;
 
-   for (cur_entry = the_map->first; cur_entry != NULL; cur_entry = cur_entry->next)
+   while (p)
    {
-      if (!strcmp(name, cur_entry->name))
-      {
-         return cur_entry->value;
-      }
+      free(p->name);
+      free(p->value);
+
+      map = p->next;
+      free(p);
+      p = map;
    }
-   return "";
+
 }
 
 
diff --git a/list.h b/list.h
index afa4423..bbaa5aa 100644 (file)
--- a/list.h
+++ b/list.h
@@ -1,6 +1,6 @@
-#ifndef LIST_H_INCLUDED
-#define LIST_H_INCLUDED
-#define LIST_H_VERSION "$Id: list.h,v 1.11 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LIST_H
+#define _LIST_H
+#define LIST_H_VERSION "$Id: list.h,v 1.3 2001/06/03 11:03:48 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/list.h,v $
@@ -10,7 +10,7 @@
  *                   `destroy_list', `enlist' and `list_to_text'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: list.h,v $
- *    Revision 1.11  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.10  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.9  2001/10/23 21:21:03  jongfoster
- *    New error handling - error codes are now jb_errs, not ints.
- *    Changed the way map() handles out-of-memory, to dramatically
- *    reduce the amount of error-checking clutter needed.
- *
- *    Revision 1.8  2001/09/16 17:30:24  jongfoster
- *    Fixing a compiler warning.
- *
- *    Revision 1.7  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.6  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.5  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.4  2001/06/29 13:30:37  oes
- *    - Introduced enlist_unique_header()
- *    - Removed logentry from cancelled commit
- *
  *    Revision 1.3  2001/06/03 11:03:48  oes
  *    introduced functions for new list type "map": map(), lookup(),
  *    free_map(), and extended enlist_unique
@@ -104,48 +70,25 @@ extern "C" {
 #endif
 
 
-/*
- * struct list
- *
- * A linked list class.
- */
-
-extern void init_list    (struct list *the_list);
-extern void destroy_list (struct list *the_list);
-
-extern jb_err enlist                 (struct list *the_list, const char *str);
-extern jb_err enlist_unique          (struct list *the_list, const char *str, size_t num_significant_chars);
-extern jb_err enlist_unique_header   (struct list *the_list, const char *name, const char *value);
-extern jb_err enlist_first           (struct list *the_list, const char *str);
-extern jb_err list_append_list_unique(struct list *dest,     const struct list *src);
-extern jb_err list_duplicate         (struct list *dest,     const struct list *src);
-
-extern int    list_remove_item(struct list *the_list, const char *str);
-extern int    list_remove_list(struct list *dest,     const struct list *src);
-extern void   list_remove_all (struct list *the_list);
-
-extern int    list_is_empty(const struct list *the_list);
+extern void enlist(struct list *h, const char *s);
+extern void enlist_unique(struct list *header, const char *str, int n);
+extern void enlist_unique_header(struct list *header, const char *name, const char *value);
+extern void enlist_first(struct list *header, const char *str);
 
-extern char * list_to_text(const struct list *the_list);
+extern int   list_remove_item(struct list *header, const char *str);
 
+extern void  list_append_list_unique(struct list *dest, const struct list *src);
+extern void  list_append_list_unique(struct list *dest, const struct list *src);
+extern int   list_remove_list(struct list *header, const struct list *to_remove);
 
-/*
- * struct map
- *
- * A class which maps names to values.
- *
- * Note: You must allocate this through new_map() and free it
- * through free_map().
- */
-
-extern struct map * new_map  (void);
-extern void         free_map (struct map * the_map);
+extern void  list_duplicate(struct list *dest, const struct list *src);
 
-extern int          map      (struct map * the_map,
-                              const char * name, int name_needs_copying,
-                              const char * value, int value_needs_copying);
-extern const char * lookup   (const struct map * the_map, const char * name);
+extern void  destroy_list(struct list *h);
+extern char *list_to_text(struct list *h);
 
+extern struct map* map(struct map* map, char *name, int nc, char *value, int vc);
+extern char *lookup(struct map *list, char *name);
+extern void free_map(struct map *list);
 
 /* Revision control strings from this header and associated .c file */
 extern const char list_rcs[];
@@ -155,7 +98,7 @@ extern const char list_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LIST_H_INCLUDED */
+#endif /* ndef _LIST_H */
 
 /*
   Local Variables:
index 10bba47..91670bb 100644 (file)
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -1,21 +1,22 @@
-const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $";
+/* vim:ts=3: */
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.16 2001/06/09 10:55:28 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.c,v $
  *
  * Purpose     :  Loads settings from the configuration file into
- *                global variables.  This file contains both the
+ *                global variables.  This file contains both the 
  *                routine to load the configuration and the global
  *                variables it writes to.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -35,110 +36,6 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: loadcfg.c,v $
- *    Revision 1.39  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.38  2002/03/24 13:05:48  jongfoster
- *    Renaming re_filterfile to filterfile
- *
- *    Revision 1.37  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.36  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.35  2002/03/07 03:52:44  oes
- *    Set logging to tty for --no-daemon mode
- *
- *    Revision 1.34  2002/03/06 23:14:35  jongfoster
- *    Trivial cosmetic changes to make function comments easier to find.
- *
- *    Revision 1.33  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.32  2002/03/04 18:24:53  oes
- *    Re-enabled output of unknown config directive hash
- *
- *    Revision 1.31  2002/03/03 15:07:20  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.30  2002/01/22 23:31:43  jongfoster
- *    Replacing strsav() with string_append()
- *
- *    Revision 1.29  2002/01/17 21:02:30  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.28  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.27  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.26  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.25  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.24  2001/10/23 21:40:30  jongfoster
- *    Added support for enable-edit-actions and enable-remote-toggle config
- *    file options.
- *
- *    Revision 1.23  2001/10/07 15:36:00  oes
- *    Introduced new config option "buffer-limit"
- *
- *    Revision 1.22  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.21  2001/09/16 17:10:43  jongfoster
- *    Moving function savearg() here, since it was the only thing left in
- *    showargs.c.
- *
- *    Revision 1.20  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.19  2001/07/15 17:45:16  jongfoster
- *    Removing some unused #includes
- *
- *    Revision 1.18  2001/07/13 14:01:14  oes
- *     - Removed all #ifdef PCRS
- *     - Removed vim-settings
- *
- *    Revision 1.17  2001/06/29 13:31:03  oes
- *    - Improved comments
- *    - Fixed (actionsfile) and sorted hashes
- *    - Introduced admin_address and proxy-info-url
- *      as config parameters
- *    - Renamed config->proxy_args_invocation (which didn't have
- *      the invocation but the options!) to config->proxy_args
- *    - Various adaptions
- *    - Removed logentry from cancelled commit
- *
  *    Revision 1.16  2001/06/09 10:55:28  jongfoster
  *    Changing BUFSIZ ==> BUFFER_SIZE
  *
@@ -285,11 +182,16 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 #include <fcntl.h>
 #include <errno.h>
 #include <ctype.h>
-#include <assert.h>
 
 #ifdef _WIN32
 
+# include <sys/timeb.h>
 # include <windows.h>
+# include <io.h>
+# include <process.h>
+# ifdef TOGGLE
+#  include <time.h>
+# endif /* def TOGGLE */
 
 # include "win32.h"
 # ifndef _WIN_CONSOLE
@@ -301,11 +203,9 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 
 #else /* ifndef _WIN32 */
 
-#ifndef __OS2__
 # include <unistd.h>
-# include <sys/wait.h>
-#endif
 # include <sys/time.h>
+# include <sys/wait.h>
 # include <sys/stat.h>
 # include <signal.h>
 
@@ -316,11 +216,14 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.39 2002/03/24 13:25:43 swa Exp $"
 #include "jcc.h"
 #include "filters.h"
 #include "loaders.h"
+#include "showargs.h"
+#include "parsers.h"
+#include "killpopup.h"
 #include "miscutil.h"
 #include "errlog.h"
+#include "jbsockets.h"
+#include "gateway.h"
 #include "ssplit.h"
-#include "encode.h"
-#include "urlmatch.h"
 
 const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
 
@@ -335,10 +238,10 @@ const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
 #define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
 #define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
 /* by haroon - indicates if ijb is enabled */
 int g_bToggleIJB        = 1;   /* JunkBusters is enabled by default. */
-#endif /* def FEATURE_TOGGLE */
+#endif
 
 /* The filename of the configfile */
 const char *configfile  = NULL;
@@ -367,13 +270,9 @@ static struct file_list *current_configfile = NULL;
 
 #define hash_actions_file              1196306641ul /* "actionsfile" */
 #define hash_admin_address             4112573064ul /* "admin-address" */
-#define hash_buffer_limit              1881726070ul /* "buffer-limit */
 #define hash_confdir                      1978389ul /* "confdir" */
 #define hash_debug                          78263ul /* "debug" */
 #define hash_deny_access               1227333715ul /* "deny-access" */
-#define hash_enable_edit_actions       2517097536ul /* "enable-edit-actions" */
-#define hash_enable_remote_toggle      2979744683ul /* "enable-remote-toggle" */
-#define hash_filterfile                 250887266ul /* "filterfile" */
 #define hash_forward                      2029845ul /* "forward" */
 #define hash_forward_socks4            3963965521ul /* "forward-socks4" */
 #define hash_forward_socks4a           2639958518ul /* "forward-socks4a" */
@@ -383,6 +282,7 @@ static struct file_list *current_configfile = NULL;
 #define hash_logfile                      2114766ul /* "logfile" */
 #define hash_permit_access             3587953268ul /* "permit-access" */
 #define hash_proxy_info_url            3903079059ul /* "proxy-info-url" */
+#define hash_re_filterfile             3877522444ul /* "re_filterfile" */
 #define hash_single_threaded           4250084780ul /* "single-threaded" */
 #define hash_suppress_blocklists       1948693308ul /* "suppress-blocklists" */
 #define hash_toggle                        447966ul /* "toggle" */
@@ -401,7 +301,6 @@ static struct file_list *current_configfile = NULL;
 #define hash_show_on_task_bar           215410365ul /* "show-on-task-bar" */
 
 
-static void savearg(char *command, char *argument, struct configuration_spec * config);
 
 /*********************************************************************
  *
@@ -419,7 +318,7 @@ void unload_configfile (void * data)
 {
    struct configuration_spec * config = (struct configuration_spec *)data;
    struct forward_spec *cur_fwd = config->forward;
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_list *cur_acl = config->acl;
 
    while (cur_acl != NULL)
@@ -429,12 +328,12 @@ void unload_configfile (void * data)
       cur_acl = next_acl;
    }
    config->acl = NULL;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    while (cur_fwd != NULL)
    {
       struct forward_spec * next_fwd = cur_fwd->next;
-      free_url_spec(cur_fwd->url);
+      free_url(cur_fwd->url);
 
       freez(cur_fwd->gateway_host);
       freez(cur_fwd->forward_host);
@@ -442,57 +341,39 @@ void unload_configfile (void * data)
       cur_fwd = next_fwd;
    }
    config->forward = NULL;
-
-#ifdef FEATURE_COOKIE_JAR
+   
+#ifdef JAR_FILES
    if ( NULL != config->jar )
    {
       fclose( config->jar );
       config->jar = NULL;
    }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
-   freez(config->confdir);
-   freez(config->logdir);
+   freez((char *)config->confdir);
+   freez((char *)config->logdir);
 
-   freez(config->haddr);
-   freez(config->logfile);
+   freez((char *)config->haddr);
+   freez((char *)config->logfile);
 
-   freez(config->actions_file);
-   freez(config->admin_address);
-   freez(config->proxy_info_url);
-   freez(config->proxy_args);
+   freez((char *)config->actions_file);
+   freez((char *)config->admin_address);
+   freez((char *)config->proxy_info_url);
+   freez((char *)config->proxy_args);
 
-#ifdef FEATURE_COOKIE_JAR
-   freez(config->jarfile);
-#endif /* def FEATURE_COOKIE_JAR */
+#ifdef JAR_FILES
+   freez((char *)config->jarfile);
+#endif /* def JAR_FILES */
 
-   freez(config->re_filterfile);
-
-}
+#ifndef SPLIT_PROXY_ARGS
+   freez((char *)config->suppress_message);
+#endif /* ndef SPLIT_PROXY_ARGS */
 
+#ifdef PCRS
+   freez((char *)config->re_filterfile);
+#endif /* def PCRS */
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_config_file
- *
- * Description :  Unloads current config file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_config_file(void)
-{
-   if (current_configfile)
-   {
-      current_configfile->unloader = unload_configfile;
-      current_configfile = NULL;
-   }
 }
-#endif
 
 
 /*********************************************************************
@@ -502,7 +383,7 @@ void unload_current_config_file(void)
  * Description :  Load the config file and all parameters.
  *
  * Parameters  :
- *          1  :  csp = Client state (the config member will be
+ *          1  :  csp = Client state (the config member will be 
  *                filled in by this function).
  *
  * Returns     :  0 => Ok, everything else is an error.
@@ -516,9 +397,8 @@ struct configuration_spec * load_config(void)
    struct configuration_spec * config = NULL;
    struct client_state * fake_csp;
    struct file_list *fs;
-   unsigned long linenum = 0;
 
-   if ( !check_file_changed(current_configfile, configfile, &fs))
+   if (!check_file_changed(current_configfile, configfile, &fs))
    {
       /* No need to load */
       return ((struct configuration_spec *)current_configfile->f);
@@ -531,9 +411,9 @@ struct configuration_spec * load_config(void)
 
    log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile);
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
    g_bToggleIJB      = 1;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
    fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config));
 
@@ -547,9 +427,9 @@ struct configuration_spec * load_config(void)
 
    /*
     * This is backwards from how it's usually done.
-    * Following the usual pattern, "fs" would be stored in a member
+    * Following the usual pattern, "fs" would be stored in a member 
     * variable in "csp", and then we'd access "config" from "fs->f",
-    * using a cast.  However, "config" is used so often that a
+    * using a cast.  However, "config" is used so often that a 
     * cast each time would be very ugly, and the extra indirection
     * would waste CPU cycles.  Therefore we store "config" in
     * "csp->config", and "fs" in "csp->config->config_file_list".
@@ -562,8 +442,6 @@ struct configuration_spec * load_config(void)
 
    config->multi_threaded    = 1;
    config->hport             = HADDR_PORT;
-   config->buffer_limit      = 4096 * 1024;
-   config->proxy_args        = strdup("");
 
    if ((configfp = fopen(configfile, "r")) == NULL)
    {
@@ -572,14 +450,14 @@ struct configuration_spec * load_config(void)
       /* Never get here - LOG_LEVEL_FATAL causes program exit */
    }
 
-   while (read_config_line(buf, sizeof(buf), configfp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), configfp, fs) != NULL)
    {
       char cmd[BUFFER_SIZE];
       char arg[BUFFER_SIZE];
       char tmp[BUFFER_SIZE];
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
       struct access_control_list *cur_acl;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
       struct forward_spec *cur_fwd;
       int vec_count;
       char *vec[3];
@@ -625,50 +503,43 @@ struct configuration_spec * load_config(void)
 
       switch( hash_string( cmd ) )
       {
-/* *************************************************************************
+/****************************************************************************
  * actionsfile actions-file-name
  * In confdir by default
- * *************************************************************************/
+ ****************************************************************************/
          case hash_actions_file :
-            freez(config->actions_file);
+            freez((char *)config->actions_file);
             config->actions_file = make_path(config->confdir, arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * admin-address email-address
- * *************************************************************************/
+ ****************************************************************************/
          case hash_admin_address :
-            freez(config->admin_address);
+            freez((char *)config->admin_address);
             config->admin_address = strdup(arg);
-            continue;
+            continue;       
 
-/* *************************************************************************
- * buffer-limit n
- * *************************************************************************/
-         case hash_buffer_limit :
-            config->buffer_limit = (size_t) 1024 * atoi(arg);
-            continue;
-
-/* *************************************************************************
+/****************************************************************************
  * confdir directory-name
- * *************************************************************************/
+ ****************************************************************************/
          case hash_confdir :
-            freez(config->confdir);
-            config->confdir = make_path( NULL, arg);
-            continue;
+            freez((char *)config->confdir);
+            config->confdir = strdup(arg);
+            continue;            
 
-/* *************************************************************************
+/****************************************************************************
  * debug n
  * Specifies debug level, multiple values are ORed together.
- * *************************************************************************/
+ ****************************************************************************/
          case hash_debug :
             config->debug |= atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * deny-access source-ip[/significant-bits] [dest-ip[/significant-bits]]
- * *************************************************************************/
-#ifdef FEATURE_ACL
+ ****************************************************************************/
+#ifdef ACL_FILES
          case hash_deny_access:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -676,7 +547,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "deny-access directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "deny-access directive in configuration file.<br><br>\n");
                continue;
@@ -697,12 +568,12 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Invalid source IP for deny-access "
                      "directive in configuration file: \"%s\"", vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Invalid source IP for deny-access directive"
                   " in configuration file: \"");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "\"<br><br>\n");
                freez(cur_acl);
                continue;
@@ -713,12 +584,12 @@ struct configuration_spec * load_config(void)
                {
                   log_error(LOG_LEVEL_ERROR, "Invalid destination IP for deny-access "
                         "directive in configuration file: \"%s\"", vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "<br>\nWARNING: Invalid destination IP for deny-access directive"
                      " in configuration file: \"");
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "\"<br><br>\n");
                   freez(cur_acl);
                   continue;
@@ -731,50 +602,18 @@ struct configuration_spec * load_config(void)
              * actions file, the last match wins.  However, the internal
              * implementations are different:  The actions file is stored
              * in the same order as the file, and scanned completely.
-             * With the ACL, we reverse the order as we load it, then
+             * With the ACL, we reverse the order as we load it, then 
              * when we scan it we stop as soon as we get a match.
              */
             cur_acl->next  = config->acl;
             config->acl = cur_acl;
 
             continue;
-#endif /* def FEATURE_ACL */
-
-/* *************************************************************************
- * enable-edit-actions 0|1
- * *************************************************************************/
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_edit_actions:
-            if ((*arg != '\0') && (0 != atoi(arg)))
-            {
-               config->feature_flags |= RUNTIME_FEATURE_CGI_EDIT_ACTIONS;
-            }
-            else
-            {
-               config->feature_flags &= ~RUNTIME_FEATURE_CGI_EDIT_ACTIONS;
-            }
-            continue;
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-
-/* *************************************************************************
- * enable-remote-toggle 0|1
- * *************************************************************************/
-#ifdef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_remote_toggle:
-            if ((*arg != '\0') && (0 != atoi(arg)))
-            {
-               config->feature_flags |= RUNTIME_FEATURE_CGI_TOGGLE;
-            }
-            else
-            {
-               config->feature_flags &= ~RUNTIME_FEATURE_CGI_TOGGLE;
-            }
-            continue;
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
+#endif /* def ACL_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * forward url-pattern (.|http-proxy-host[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -782,7 +621,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for forward "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward directive in configuration file.");
                continue;
@@ -804,7 +643,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward directive in configuration file.");
                continue;
@@ -817,7 +656,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -835,9 +674,9 @@ struct configuration_spec * load_config(void)
 
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * forward-socks4 url-pattern socks-proxy[:port] (.|http-proxy[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward_socks4:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -845,7 +684,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "forward-socks4 directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward-socks4 directive in configuration file.");
                continue;
@@ -867,7 +706,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4 "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward-socks4 directive in configuration file.");
                continue;
@@ -880,7 +719,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->gateway_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->gateway_host, ':')))
+               if ((p = strchr(cur_fwd->gateway_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->gateway_port = atoi(p);
@@ -898,7 +737,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -913,12 +752,12 @@ struct configuration_spec * load_config(void)
             /* Add to list. */
             cur_fwd->next = config->forward;
             config->forward = cur_fwd;
-
+            
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * forward-socks4a url-pattern socks-proxy[:port] (.|http-proxy[:port])
- * *************************************************************************/
+ ****************************************************************************/
          case hash_forward_socks4a:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -926,7 +765,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "forward-socks4a directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "forward-socks4a directive in configuration file.");
                continue;
@@ -948,7 +787,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Bad URL specifier for forward-socks4a "
                      "directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Bad URL specifier for "
                   "forward-socks4a directive in configuration file.");
                continue;
@@ -959,7 +798,7 @@ struct configuration_spec * load_config(void)
 
             cur_fwd->gateway_host = strdup(p);
 
-            if (NULL != (p = strchr(cur_fwd->gateway_host, ':')))
+            if ((p = strchr(cur_fwd->gateway_host, ':')))
             {
                *p++ = '\0';
                cur_fwd->gateway_port = atoi(p);
@@ -976,7 +815,7 @@ struct configuration_spec * load_config(void)
             {
                cur_fwd->forward_host = strdup(p);
 
-               if (NULL != (p = strchr(cur_fwd->forward_host, ':')))
+               if ((p = strchr(cur_fwd->forward_host, ':')))
                {
                   *p++ = '\0';
                   cur_fwd->forward_port = atoi(p);
@@ -991,49 +830,49 @@ struct configuration_spec * load_config(void)
             /* Add to list. */
             cur_fwd->next = config->forward;
             config->forward = cur_fwd;
-
+            
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * jarfile jar-file-name
  * In logdir by default
- * *************************************************************************/
-#ifdef FEATURE_COOKIE_JAR
+ ****************************************************************************/
+#ifdef JAR_FILES
          case hash_jarfile :
-            freez(config->jarfile);
+            freez((char *)config->jarfile);
             config->jarfile = make_path(config->logdir, arg);
             continue;
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * listen-address [ip][:port]
- * *************************************************************************/
+ ****************************************************************************/
          case hash_listen_address :
-            freez(config->haddr);
+            freez((char *)config->haddr);
             config->haddr = strdup(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * logdir directory-name
- * *************************************************************************/
+ ****************************************************************************/
          case hash_logdir :
-            freez(config->logdir);
-            config->logdir = make_path(NULL, arg);
-            continue;
+            freez((char *)config->logdir);
+            config->logdir = strdup(arg);
+            continue;            
 
-/* *************************************************************************
+/****************************************************************************
  * logfile log-file-name
  * In logdir by default
- * *************************************************************************/
+ ****************************************************************************/
          case hash_logfile :
-            freez(config->logfile);
-            config->logfile = no_daemon ? NULL : make_path(config->logdir, arg);
+            freez((char *)config->logfile);
+            config->logfile = make_path(config->logdir, arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * permit-access source-ip[/significant-bits] [dest-ip[/significant-bits]]
- * *************************************************************************/
-#ifdef FEATURE_ACL
+ ****************************************************************************/
+#ifdef ACL_FILES
          case hash_permit_access:
             vec_count = ssplit(arg, " \t", vec, SZ(vec), 1, 1);
 
@@ -1041,7 +880,7 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Wrong number of parameters for "
                      "permit-access directive in configuration file.");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Wrong number of parameters for "
                   "permit-access directive in configuration file.<br><br>\n");
 
@@ -1063,12 +902,12 @@ struct configuration_spec * load_config(void)
             {
                log_error(LOG_LEVEL_ERROR, "Invalid source IP for permit-access "
                      "directive in configuration file: \"%s\"", vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "<br>\nWARNING: Invalid source IP for permit-access directive"
                   " in configuration file: \"");
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   vec[0]);
-               string_append(&config->proxy_args,
+               config->proxy_args = strsav( config->proxy_args,
                   "\"<br><br>\n");
                freez(cur_acl);
                continue;
@@ -1080,12 +919,12 @@ struct configuration_spec * load_config(void)
                   log_error(LOG_LEVEL_ERROR, "Invalid destination IP for "
                         "permit-access directive in configuration file: \"%s\"",
                         vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "<br>\nWARNING: Invalid destination IP for permit-access directive"
                      " in configuration file: \"");
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      vec[0]);
-                  string_append(&config->proxy_args,
+                  config->proxy_args = strsav( config->proxy_args,
                      "\"<br><br>\n");
                   freez(cur_acl);
                   continue;
@@ -1098,76 +937,97 @@ struct configuration_spec * load_config(void)
              * actions file, the last match wins.  However, the internal
              * implementations are different:  The actions file is stored
              * in the same order as the file, and scanned completely.
-             * With the ACL, we reverse the order as we load it, then
+             * With the ACL, we reverse the order as we load it, then 
              * when we scan it we stop as soon as we get a match.
              */
             cur_acl->next  = config->acl;
             config->acl = cur_acl;
 
             continue;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * proxy-info-url url
- * *************************************************************************/
+ ****************************************************************************/
          case hash_proxy_info_url :
-            freez(config->proxy_info_url);
+            freez((char *)config->proxy_info_url);
             config->proxy_info_url = strdup(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * re_filterfile file-name
  * In confdir by default.
- * *************************************************************************/
-         case hash_filterfile :
-            freez(config->re_filterfile);
+ ****************************************************************************/
+#ifdef PCRS
+         case hash_re_filterfile :
+            freez((char *)config->re_filterfile);
             config->re_filterfile = make_path(config->confdir, arg);
             continue;
+#endif /* def PCRS */
 
-/* *************************************************************************
+/****************************************************************************
  * single-threaded
- * *************************************************************************/
+ ****************************************************************************/
          case hash_single_threaded :
             config->multi_threaded = 0;
             continue;
 
-/* *************************************************************************
+/****************************************************************************
+ * FIXME: Document this FIXME2: Shouldn't we throw this out? --oes
+ ****************************************************************************/
+#ifndef SPLIT_PROXY_ARGS
+         case hash_suppress_blocklists :
+            if (arg[0] != '\0')
+            {
+               config->suppress_message = strdup(arg);
+            }
+            else
+            {
+               /* There will be NO reference in proxy-args. */
+               config->suppress_message = NULL;
+            }
+
+            config->suppress_blocklists = 1;
+            continue;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+/****************************************************************************
  * toggle (0|1)
- * *************************************************************************/
-#ifdef FEATURE_TOGGLE
+ ****************************************************************************/
+#ifdef TOGGLE
          case hash_toggle :
             g_bToggleIJB = atoi(arg);
             continue;
-#endif /* def FEATURE_TOGGLE */
+#endif /* def TOGGLE */
 
-/* *************************************************************************
+/****************************************************************************
  * trust-info-url url
- * *************************************************************************/
-#ifdef FEATURE_TRUST
+ ****************************************************************************/
+#ifdef TRUST_FILES
          case hash_trust_info_url :
             enlist(config->trust_info, arg);
             continue;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
-/* *************************************************************************
+/****************************************************************************
  * trustfile filename
  * (In confdir by default.)
- * *************************************************************************/
-#ifdef FEATURE_TRUST
+ ****************************************************************************/
+#ifdef TRUST_FILES
          case hash_trustfile :
-            freez(config->trustfile);
+            freez((char *)config->trustfile);
             config->trustfile = make_path(config->confdir, arg);
             continue;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
-/* *************************************************************************
+/****************************************************************************
  * Win32 Console options:
- * *************************************************************************/
+ ****************************************************************************/
 
-/* *************************************************************************
+/****************************************************************************
  * hide-console
- * *************************************************************************/
+ ****************************************************************************/
 #ifdef _WIN_CONSOLE
          case hash_hide_console :
             hideConsole = 1;
@@ -1175,70 +1035,70 @@ struct configuration_spec * load_config(void)
 #endif /*def _WIN_CONSOLE*/
 
 
-/* *************************************************************************
+/****************************************************************************
  * Win32 GUI options:
- * *************************************************************************/
+ ****************************************************************************/
 
 #if defined(_WIN32) && ! defined(_WIN_CONSOLE)
-/* *************************************************************************
+/****************************************************************************
  * activity-animation (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_activity_animation :
             g_bShowActivityAnimation = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  *  close-button-minimizes (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_close_button_minimizes :
             g_bCloseHidesWindow = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-buffer-size (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_buffer_size :
             g_bLimitBufferSize = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-font-name fontnane
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_font_name :
             strcpy( g_szFontFaceName, arg );
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-font-size n
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_font_size :
             g_nFontSize = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-highlight-messages (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_highlight_messages :
             g_bHighlightMessages = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-max-lines n
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_max_lines :
             g_nMaxBufferLines = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * log-messages (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_log_messages :
             g_bLogMessages = atoi(arg);
             continue;
 
-/* *************************************************************************
+/****************************************************************************
  * show-on-task-bar (0|1)
- * *************************************************************************/
+ ****************************************************************************/
          case hash_show_on_task_bar :
             g_bShowOnTaskBar = atoi(arg);
             continue;
@@ -1246,29 +1106,31 @@ struct configuration_spec * load_config(void)
 #endif /* defined(_WIN32) && ! defined(_WIN_CONSOLE) */
 
 
-/* *************************************************************************
- * Warnings about unsupported features
- * *************************************************************************/
-#ifndef FEATURE_ACL
+/****************************************************************************/
+/* Warnings about unsupported features                                      */
+/****************************************************************************/
+#ifndef ACL_FILES
          case hash_deny_access:
-#endif /* ndef FEATURE_ACL */
-#ifndef FEATURE_CGI_EDIT_ACTIONS
-         case hash_enable_edit_actions:
-         case hash_enable_remote_toggle:
-#endif /* def FEATURE_CGI_EDIT_ACTIONS */
-#ifndef FEATURE_COOKIE_JAR
+#endif /* ndef ACL_FILES */
+#ifndef JAR_FILES
          case hash_jarfile :
-#endif /* ndef FEATURE_COOKIE_JAR */
-#ifndef FEATURE_ACL
+#endif /* ndef JAR_FILES */
+#ifndef ACL_FILES
          case hash_permit_access:
-#endif /* ndef FEATURE_ACL */
-#ifndef FEATURE_TOGGLE
+#endif /* ndef ACL_FILES */
+#ifndef PCRS
+         case hash_re_filterfile :
+#endif /* ndef PCRS */
+#ifdef SPLIT_PROXY_ARGS
+         case hash_suppress_blocklists :
+#endif /* def SPLIT_PROXY_ARGS */
+#ifndef TOGGLE
          case hash_toggle :
-#endif /* ndef FEATURE_TOGGLE */
-#ifndef FEATURE_TRUST
+#endif /* ndef TOGGLE */
+#ifndef TRUST_FILES
          case hash_trustfile :
          case hash_trust_info_url :
-#endif /* ndef FEATURE_TRUST */
+#endif /* ndef TRUST_FILES */
 
 #ifndef _WIN_CONSOLE
          case hash_hide_console :
@@ -1289,32 +1151,27 @@ struct configuration_spec * load_config(void)
             /* log_error(LOG_LEVEL_INFO, "Unsupported directive \"%s\" ignored.", cmd); */
             continue;
 
-/* *************************************************************************/
+/****************************************************************************/
          default :
-/* *************************************************************************/
+/****************************************************************************/
             /*
              * I decided that I liked this better as a warning than an
              * error.  To change back to an error, just change log level
              * to LOG_LEVEL_FATAL.
              */
-            log_error(LOG_LEVEL_ERROR, "Unrecognized directive '%s' (%luul) in line %lu in "
-                  "configuration file (%s).",  buf, hash_string(cmd), linenum, configfile);
-            string_append(&config->proxy_args, "<br>\nWARNING: unrecognized directive : ");
-            string_append(&config->proxy_args, buf);
-            string_append(&config->proxy_args, "<br><br>\n");
+            log_error(LOG_LEVEL_ERROR, "Unrecognized directive (%luul) in "
+                  "configuration file: \"%s\"", hash_string( cmd ), buf);
+            config->proxy_args = strsav( config->proxy_args, "<br>\nWARNING: unrecognized directive : ");
+            config->proxy_args = strsav( config->proxy_args, buf);
+            config->proxy_args = strsav( config->proxy_args, "<br><br>\n");
             continue;
 
-/* *************************************************************************/
+/****************************************************************************/
       } /* end switch( hash_string(cmd) ) */
    } /* end while ( read_config_line(...) ) */
 
    fclose(configfp);
 
-   if (NULL == config->proxy_args)
-   {
-      log_error(LOG_LEVEL_FATAL, "Out of memory loading config - insufficient memory for config->proxy_args");
-   }
-
    init_error_log(Argv[0], config->logfile, config->debug);
 
    if (config->actions_file)
@@ -1322,19 +1179,21 @@ struct configuration_spec * load_config(void)
       add_loader(load_actions_file, config);
    }
 
+#ifdef PCRS
    if (config->re_filterfile)
    {
       add_loader(load_re_filterfile, config);
    }
+#endif /* def PCRS */
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
    if (config->trustfile)
    {
       add_loader(load_trustfile, config);
    }
-#endif /* def FEATURE_TRUST */
+#endif
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    if ( NULL != config->jarfile )
    {
       if ( NULL == (config->jar = fopen(config->jarfile, "a")) )
@@ -1344,7 +1203,7 @@ struct configuration_spec * load_config(void)
       }
       setbuf(config->jar, NULL);
    }
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
    if ( NULL == config->haddr )
    {
@@ -1353,7 +1212,7 @@ struct configuration_spec * load_config(void)
 
    if ( NULL != config->haddr )
    {
-      if (NULL != (p = strchr(config->haddr, ':')))
+      if ((p = strchr(config->haddr, ':')))
       {
          *p++ = '\0';
          if (*p)
@@ -1390,16 +1249,24 @@ struct configuration_spec * load_config(void)
    }
    freez(fake_csp);
 
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
 /* FIXME: this is a kludge for win32 */
 #if defined(_WIN32) && !defined (_WIN_CONSOLE)
 
    g_actions_file     = config->actions_file;
+#ifdef PCRS
    g_re_filterfile    = config->re_filterfile;
-
-#ifdef FEATURE_TRUST
+#endif
+#ifdef TRUST_FILES
    g_trustfile        = config->trustfile;
-#endif /* def FEATURE_TRUST */
-
+#endif
+   
 
 #endif /* defined(_WIN32) && !defined (_WIN_CONSOLE) */
 /* FIXME: end kludge */
@@ -1450,77 +1317,6 @@ struct configuration_spec * load_config(void)
 }
 
 
-/*********************************************************************
- *
- * Function    :  savearg
- *
- * Description :  Called from `load_config'.  It saves each non-empty
- *                and non-comment line from config into
- *                config->proxy_args.  This is used to create the
- *                show-proxy-args page.  On error, frees
- *                config->proxy_args and sets it to NULL
- *
- * Parameters  :
- *          1  :  command = config setting that was found
- *          2  :  argument = the setting's argument (if any)
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-static void savearg(char *command, char *argument, struct configuration_spec * config)
-{
-   char * buf;
-   char * s;
-
-   assert(command);
-   assert(*command);
-   assert(argument);
-
-   buf = strdup("");
-
-   s = html_encode(command);
-   if (NULL == s)
-   {
-      freez(buf);
-      freez(config->proxy_args);
-      return;
-   }
-   string_append(&buf, "<a href=\"" REDIRECT_URL "option#");
-   string_append(&buf, s);
-   string_append(&buf, "\">");
-   string_join  (&buf, s);
-   string_append(&buf, "</a> ");
-
-   if ( (NULL != argument) && ('\0' != *argument) )
-   {
-      s = html_encode(argument);
-      if (NULL == s)
-      {
-         freez(buf);
-         freez(config->proxy_args);
-         return;
-      }
-
-      if (strncmpic(argument, "http://", 7) == 0)
-      {
-         string_append(&buf, "<a href=\"");
-         string_append(&buf, s);
-         string_append(&buf, "\">");
-         string_join  (&buf, s);
-         string_append(&buf, "</a>");
-      }
-      else
-      {
-         string_join  (&buf, s);
-      }
-   }
-
-   string_append(&buf, "<br>\n");
-
-   string_join(&config->proxy_args, buf);
-}
-
-
 /*
   Local Variables:
   tab-width: 3
index 3e71b75..ea13f48 100644 (file)
--- a/loadcfg.h
+++ b/loadcfg.h
@@ -1,6 +1,6 @@
-#ifndef LOADCFG_H_INCLUDED
-#define LOADCFG_H_INCLUDED
-#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.10 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LOADCFG_H
+#define _LOADCFG_H
+#define LOADCFG_H_VERSION "$Id: loadcfg.h,v 1.4 2001/05/22 18:46:04 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.h,v $
@@ -11,7 +11,7 @@
  *                variables it writes to.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: loadcfg.h,v $
- *    Revision 1.10  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.9  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.8  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.7  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.6  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.5  2001/05/26 00:28:36  jongfoster
- *    Automatic reloading of config file.
- *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
- *    Most of the global variables have been moved to a new
- *    struct configuration_spec, accessed through csp->config->globalname
- *    Most of the globals remaining are used by the Win32 GUI.
- *
  *    Revision 1.4  2001/05/22 18:46:04  oes
  *
  *    - Enabled filtering banners by size rather than URL
  *********************************************************************/
 \f
 
+/* Declare struct FILE for vars and funcs. */
+#include <stdio.h>
+
+/* All of our project's data types. */
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* Don't need project.h, only this: */
-struct configuration_spec;
-
 /* Global variables */
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
 /* indicates if ijb is enabled */
 extern int g_bToggleIJB;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
 extern const char *configfile;
 
@@ -163,14 +131,10 @@ extern const char *configfile;
  */
 extern int Argc;
 extern const char **Argv;
-extern short int MustReload;
 
 
 extern struct configuration_spec * load_config(void);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-void unload_current_config_file(void);
-#endif
 
 /* Revision control strings from this header and associated .c file */
 extern const char loadcfg_rcs[];
@@ -180,7 +144,7 @@ extern const char loadcfg_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LOADCFG_H_INCLUDED */
+#endif /* ndef _JCC_H */
 
 /*
   Local Variables:
index f63b916..7752a97 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,21 +1,21 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.17 2001/06/29 13:31:51 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.c,v $
  *
  * Purpose     :  Functions to load and unload the various
  *                configuration files.  Also contains code to manage
- *                the list of active loaders, and to automatically
+ *                the list of active loaders, and to automatically 
  *                unload files that are no longer in use.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -35,126 +35,6 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: loaders.c,v $
- *    Revision 1.46  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.45  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.44  2002/03/16 21:51:00  jongfoster
- *    Fixing free(NULL).
- *
- *    Revision 1.43  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.42  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.41  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.40  2002/03/08 17:46:04  jongfoster
- *    Fixing int/size_t warnings
- *
- *    Revision 1.39  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.38  2002/03/06 22:54:35  jongfoster
- *    Automated function-comment nitpicking.
- *
- *    Revision 1.37  2002/03/03 15:07:49  oes
- *    Re-enabled automatic config reloading
- *
- *    Revision 1.36  2002/01/22 23:46:18  jongfoster
- *    Moving edit_read_line() and simple_read_line() to loaders.c, and
- *    extending them to support reading MS-DOS, Mac and UNIX style files
- *    on all platforms.
- *
- *    Modifying read_config_line() (without changing it's prototype) to
- *    be a trivial wrapper for edit_read_line().  This means that we have
- *    one function to read a line and handle comments, which is common
- *    between the initialization code and the edit interface.
- *
- *    Revision 1.35  2002/01/17 21:03:08  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.34  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.33  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.32  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.31  2001/10/26 17:39:01  oes
- *    Removed csp->referrer
- *    Moved ijb_isspace and ijb_tolower to project.h
- *
- *    Revision 1.30  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.29  2001/10/23 21:38:53  jongfoster
- *    Adding error-checking to create_url_spec()
- *
- *    Revision 1.28  2001/10/07 15:40:39  oes
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.27  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.26  2001/09/22 14:05:22  jongfoster
- *    Bugfix: Multiple escaped "#" characters in a configuration
- *    file are now permitted.
- *    Also removing 3 unused headers.
- *
- *    Revision 1.25  2001/09/13 22:44:03  jongfoster
- *    Adding {} to an if statement
- *
- *    Revision 1.24  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.23  2001/07/20 15:51:54  oes
- *    Fixed indentation of prepocessor commands
- *
- *    Revision 1.22  2001/07/20 15:16:17  haroon
- *    - per Guy's suggestion, added a while loop in sweep() to catch not just
- *      the last inactive CSP but all other consecutive inactive CSPs after that
- *      as well
- *
- *    Revision 1.21  2001/07/18 17:26:24  oes
- *    Changed to conform to new pcrs interface
- *
- *    Revision 1.20  2001/07/17 13:07:01  oes
- *    Fixed segv when last line in config files
- *     lacked a terminating (\r)\n
- *
- *    Revision 1.19  2001/07/13 14:01:54  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.18  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.17  2001/06/29 13:31:51  oes
  *    Various adaptions
  *
@@ -262,39 +142,52 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.46 2002/03/24 13:25:43 swa Exp $"
 #include <stdlib.h>
 #include <sys/types.h>
 #include <string.h>
+#include <malloc.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <ctype.h>
-#include <assert.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
 #include "project.h"
 #include "list.h"
 #include "loaders.h"
+#include "encode.h"
 #include "filters.h"
 #include "parsers.h"
 #include "jcc.h"
+#include "ssplit.h"
 #include "miscutil.h"
 #include "errlog.h"
+#include "gateway.h"
 #include "actions.h"
-#include "urlmatch.h"
 
 const char loaders_h_rcs[] = LOADERS_H_VERSION;
 
+/* Fix a problem with Solaris.  There should be no effect on other
+ * platforms.
+ * Solaris's isspace() is a macro which uses it's argument directly
+ * as an array index.  Therefore we need to make sure that high-bit
+ * characters generate +ve values, and ideally we also want to make
+ * the argument match the declared parameter type of "int".
+ */
+#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))
+
+
 /*
  * Currently active files.
  * These are also entered in the main linked list of files.
  */
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 static struct file_list *current_trustfile      = NULL;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
+#ifdef PCRS
 static struct file_list *current_re_filterfile  = NULL;
-
+#endif /* def PCRS */
 
 
 /*********************************************************************
@@ -332,9 +225,9 @@ void sweep(void)
       fl->active = 0;
    }
 
-   for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next)
+   for (csp = clients; csp && (ncsp = csp->next) ; csp = csp->next)
    {
-      if (ncsp->flags & CSP_FLAG_ACTIVE)
+      if (ncsp->active)
       {
          /* mark this client's files as active */
 
@@ -350,61 +243,56 @@ void sweep(void)
             ncsp->actions_list->active = 1;
          }
 
-         if (ncsp->rlist)     /* pcrsjob files */
+#ifdef PCRS
+         if (ncsp->rlist)     /* perl re files */
          {
             ncsp->rlist->active = 1;
          }
+#endif /* def PCRS */
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
          if (ncsp->tlist)     /* trust files */
          {
             ncsp->tlist->active = 1;
          }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
       }
       else
-      /*
-       * this client is not active, release its resources
-       * and the ones of all inactive clients that might
-       * follow it
-       */
       {
-         while (!(ncsp->flags & CSP_FLAG_ACTIVE))
-         {
-            csp->next = ncsp->next;
-
-            freez(ncsp->ip_addr_str);
-            freez(ncsp->my_ip_addr_str);
-            freez(ncsp->my_hostname);
-            freez(ncsp->x_forwarded);
-            freez(ncsp->iob->buf);
+         /* this client one is not active, release its resources */
+         csp->next = ncsp->next;
 
-            free_http_request(ncsp->http);
+         freez(ncsp->ip_addr_str);
+         freez(ncsp->my_ip_addr_str);
+         freez(ncsp->my_hostname);
 
-            destroy_list(ncsp->headers);
-            destroy_list(ncsp->cookie_list);
+#ifdef TRUST_FILES
+         freez(ncsp->referrer);
+#endif /* def TRUST_FILES */
+         freez(ncsp->x_forwarded);
+         freez(ncsp->iob->buf);
 
-            free_current_action(ncsp->action);
+         free_http_request(ncsp->http);
 
-#ifdef FEATURE_STATISTICS
-            urls_read++;
-            if (ncsp->flags & CSP_FLAG_REJECTED)
-            {
-               urls_rejected++;
-            }
-#endif /* def FEATURE_STATISTICS */
+         destroy_list(ncsp->headers);
+         destroy_list(ncsp->cookie_list);
 
-            freez(ncsp);
+         free_current_action(ncsp->action);
 
-            /* are there any more in sequence after it? */
-            if( (ncsp = csp->next) == NULL)
-               break;
+#ifdef STATISTICS
+         urls_read++;
+         if (ncsp->rejected)
+         {
+            urls_rejected++;
          }
+#endif /* def STATISTICS */
+
+         freez(ncsp);
       }
    }
 
-   for (fl = files; fl && ((nfl = fl->next) != NULL) ; fl = fl->next)
+   for (fl = files; fl && (nfl = fl->next) ; fl = fl->next)
    {
       if ( ( 0 == nfl->active ) && ( NULL != nfl->unloader ) )
       {
@@ -412,6 +300,10 @@ void sweep(void)
 
          (nfl->unloader)(nfl->f);
 
+#ifndef SPLIT_PROXY_ARGS
+         freez(nfl->proxy_args);
+#endif /* ndef SPLIT_PROXY_ARGS */
+
          freez(nfl->filename);
 
          freez(nfl);
@@ -421,18 +313,171 @@ void sweep(void)
 }
 
 
+/*********************************************************************
+ *
+ * Function    :  create_url_spec
+ *
+ * Description :  Creates a "url_spec" structure from a string.
+ *                When finished, free with unload_url().
+ *
+ * Parameters  :
+ *          1  :  url = Target url_spec to be filled in.  Must be
+ *                      zeroed out before the call (e.g. using zalloc).
+ *          2  :  buf = Source pattern, null terminated.  NOTE: The
+ *                      contents of this buffer are destroyed by this
+ *                      function.  If this function succeeds, the
+ *                      buffer is copied to url->spec.  If this
+ *                      function fails, the contents of the buffer
+ *                      are lost forever.
+ *
+ * Returns     :  0 => Ok, everything else is an error.
+ *
+ *********************************************************************/
+int create_url_spec(struct url_spec * url, char * buf)
+{
+   char *p;
+   struct url_spec tmp_url[1];
+
+   /* paranoia - should never happen. */
+   if ((url == NULL) || (buf == NULL))
+   {
+      return 1;
+   }
+
+   /* save a copy of the orignal specification */
+   if ((url->spec = strdup(buf)) == NULL)
+   {
+      return 1;
+   }
+
+   if ((p = strchr(buf, '/')))
+   {
+      if (NULL == (url->path = strdup(p)))
+      {
+         freez(url->spec);
+         return 1;
+      }
+      url->pathlen = strlen(url->path);
+      *p = '\0';
+   }
+   else
+   {
+      url->path    = NULL;
+      url->pathlen = 0;
+   }
+#ifdef REGEX
+   if (url->path)
+   {
+      int errcode;
+      char rebuf[BUFFER_SIZE];
+
+      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
+      {
+         freez(url->spec);
+         freez(url->path);
+         return 1;
+      }
+
+      sprintf(rebuf, "^(%s)", url->path);
+
+      errcode = regcomp(url->preg, rebuf,
+            (REG_EXTENDED|REG_NOSUB|REG_ICASE));
+      if (errcode)
+      {
+         size_t errlen = regerror(errcode,
+            url->preg, buf, sizeof(buf));
+
+         buf[errlen] = '\0';
+
+         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
+            url->spec, buf);
+
+         freez(url->spec);
+         freez(url->path);
+         freez(url->preg);
+
+         return 1;
+      }
+   }
+#endif
+   if ((p = strchr(buf, ':')) == NULL)
+   {
+      url->port = 0;
+   }
+   else
+   {
+      *p++ = '\0';
+      url->port = atoi(p);
+   }
+
+   if ((url->domain = strdup(buf)) == NULL)
+   {
+      freez(url->spec);
+      freez(url->path);
+#ifdef REGEX
+      freez(url->preg);
+#endif /* def REGEX */
+      return 1;
+   }
+
+   /* split domain into components */
+
+   *tmp_url = dsplit(url->domain);
+   url->dbuf = tmp_url->dbuf;
+   url->dcnt = tmp_url->dcnt;
+   url->dvec = tmp_url->dvec;
+   url->unanchored = tmp_url->unanchored;
+
+   return 0; /* OK */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  free_url
+ *
+ * Description :  Called from the "unloaders".  Freez the url
+ *                structure elements.
+ *
+ * Parameters  :
+ *          1  :  url = pointer to a url_spec structure.
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void free_url(struct url_spec *url)
+{
+   if (url == NULL) return;
+
+   freez(url->spec);
+   freez(url->domain);
+   freez(url->dbuf);
+   freez(url->dvec);
+   freez(url->path);
+#ifdef REGEX
+   if (url->preg)
+   {
+      regfree(url->preg);
+      freez(url->preg);
+   }
+#endif
+
+}
+
+
 /*********************************************************************
  *
  * Function    :  check_file_changed
  *
  * Description :  Helper function to check if a file needs reloading.
  *                If "current" is still current, return it.  Otherwise
- *                allocates a new (zeroed) "struct file_list", fills
+ *                allocates a new (zeroed) "struct file_list", fills 
  *                in the disk file name and timestamp, and returns it.
  *
  * Parameters  :
  *          1  :  current = The file_list currently being used - will
- *                          be checked to see if it is out of date.
+ *                          be checked to see if it is out of date. 
  *                          May be NULL (which is treated as out of
  *                          date).
  *          2  :  filename = Name of file to check.
@@ -440,7 +485,10 @@ void sweep(void)
  *                           This will be set to NULL, OR a struct
  *                           file_list newly allocated on the
  *                           heap, with the filename and lastmodified
- *                           fields filled, and all others zeroed.
+ *                           fields filled, standard header giving file
+ *                           name in proxy_args, and all others zeroed.
+ *                           (proxy_args is only filled in if !defined
+ *                           SPLIT_PROXY_ARGS and !suppress_blocklists).
  *
  * Returns     :  If file unchanged: 0 (and sets newfl == NULL)
  *                If file changed: 1 and sets newfl != NULL
@@ -470,6 +518,7 @@ int check_file_changed(const struct file_list * current,
    }
 
    fs = (struct file_list *)zalloc(sizeof(struct file_list));
+
    if (fs == NULL)
    {
       /* Out of memory error */
@@ -485,468 +534,130 @@ int check_file_changed(const struct file_list * current,
       freez (fs);
       return 1;
    }
-   *newfl = fs;
-   return 1;
-}
-
 
-/*********************************************************************
- *
- * Function    :  simple_read_line
- *
- * Description :  Read a single line from a file and return it.
- *                This is basically a version of fgets() that malloc()s
- *                it's own line buffer.  Note that the buffer will
- *                always be a multiple of BUFFER_SIZE bytes long.
- *                Therefore if you are going to keep the string for
- *                an extended period of time, you should probably
- *                strdup() it and free() the original, to save memory.
- *
- *
- * Parameters  :
- *          1  :  dest = destination for newly malloc'd pointer to
- *                line data.  Will be set to NULL on error.
- *          2  :  fp = File to read from
- *          3  :  newline = Standard for newlines in the file.
- *                Will be unchanged if it's value on input is not
- *                NEWLINE_UNKNOWN.
- *                On output, may be changed from NEWLINE_UNKNOWN to
- *                actual convention in file.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   on EOF.
- *
- *********************************************************************/
-jb_err simple_read_line(FILE *fp, char **dest, int *newline)
-{
-   size_t len = 0;
-   size_t buflen = BUFFER_SIZE;
-   char * buf;
-   char * p;
-   int ch;
-   int realnewline = NEWLINE_UNKNOWN;
-
-   if (NULL == (buf = malloc(buflen)))
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
    {
-      return JB_ERR_MEMORY;
-   }
-
-   p = buf;
-
-/*
- * Character codes.  If you have a wierd compiler and the following are
- * incorrect, you also need to fix NEWLINE() in loaders.h
- */
-#define CHAR_CR '\r' /* ASCII 13 */
-#define CHAR_LF '\n' /* ASCII 10 */
-
-   for (;;)
-   {
-      ch = fgetc(fp);
-      if (ch == EOF)
-      {
-         if (len > 0)
-         {
-            *p = '\0';
-            *dest = buf;
-            return JB_ERR_OK;
-         }
-         else
-         {
-            free(buf);
-            *dest = NULL;
-            return JB_ERR_FILE;
-         }
-      }
-      else if (ch == CHAR_CR)
+      char * p = html_encode(filename);
+      if (p)
       {
-         ch = getc(fp);
-         if (ch == CHAR_LF)
-         {
-            if (*newline == NEWLINE_UNKNOWN)
-            {
-               *newline = NEWLINE_DOS;
-            }
-         }
-         else
-         {
-            if (ch != EOF)
-            {
-               ungetc(ch, fp);
-            }
-            if (*newline == NEWLINE_UNKNOWN)
-            {
-               *newline = NEWLINE_MAC;
-            }
-         }
-         *p = '\0';
-         *dest = buf;
-         if (*newline == NEWLINE_UNKNOWN)
-         {
-            *newline = realnewline;
-         }
-         return JB_ERR_OK;
-      }
-      else if (ch == CHAR_LF)
-      {
-         *p = '\0';
-         *dest = buf;
-         if (*newline == NEWLINE_UNKNOWN)
-         {
-            *newline = NEWLINE_UNIX;
-         }
-         return JB_ERR_OK;
-      }
-      else if (ch == 0)
-      {
-         *p = '\0';
-         *dest = buf;
-         return JB_ERR_OK;
+         fs->proxy_args = strsav(fs->proxy_args, "<h2>The file `");
+         fs->proxy_args = strsav(fs->proxy_args, p);
+         fs->proxy_args = strsav(fs->proxy_args, 
+            "' contains the following patterns</h2>\n");
+         freez(p);
       }
+      fs->proxy_args = strsav(fs->proxy_args, "<pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-      *p++ = ch;
+   *newfl = fs;
+   return 1;
 
-      if (++len >= buflen)
-      {
-         buflen += BUFFER_SIZE;
-         if (NULL == (p = realloc(buf, buflen)));
-         {
-            free(buf);
-            return JB_ERR_MEMORY;
-         }
-         buf = p;
-         p = buf + len;
-      }
-   }
 }
 
 
 /*********************************************************************
  *
- * Function    :  edit_read_line
+ * Function    :  read_config_line
  *
  * Description :  Read a single non-empty line from a file and return
  *                it.  Trims comments, leading and trailing whitespace
  *                and respects escaping of newline and comment char.
- *                Provides the line in 2 alternative forms: raw and
- *                preprocessed.
- *                - raw is the raw data read from the file.  If the
- *                  line is not modified, then this should be written
- *                  to the new file.
- *                - prefix is any comments and blank lines that were
- *                  read from the file.  If the line is modified, then
- *                  this should be written out to the file followed
- *                  by the modified data.  (If this string is non-empty
- *                  then it will have a newline at the end).
- *                - data is the actual data that will be parsed
- *                  further by appropriate routines.
- *                On EOF, the 3 strings will all be set to NULL and
- *                0 will be returned.
+ *                Also writes the file to fs->proxy_args.
  *
  * Parameters  :
- *          1  :  fp = File to read from
- *          2  :  raw_out = destination for newly malloc'd pointer to
- *                raw line data.  May be NULL if you don't want it.
- *          3  :  prefix_out = destination for newly malloc'd pointer to
- *                comments.  May be NULL if you don't want it.
- *          4  :  data_out = destination for newly malloc'd pointer to
- *                line data with comments and leading/trailing spaces
- *                removed, and line continuation performed.  May be
- *                NULL if you don't want it.
- *          5  :  newline = Standard for newlines in the file.
- *                On input, set to value to use or NEWLINE_UNKNOWN.
- *                On output, may be changed from NEWLINE_UNKNOWN to
- *                actual convention in file.  May be NULL if you
- *                don't want it.
- *          6  :  line_number = Line number in file.  In "lines" as
- *                reported by a text editor, not lines containing data.
- *
- * Returns     :  JB_ERR_OK     on success
- *                JB_ERR_MEMORY on out-of-memory
- *                JB_ERR_FILE   on EOF.
+ *          1  :  buf = Buffer to use.
+ *          2  :  buflen = Size of buffer in bytes.
+ *          3  :  fp = File to read from
+ *          4  :  fs = File will be written to fs->proxy_args.  May
+ *                be NULL to disable this feature.
+ *
+ * Returns     :  NULL on EOF or error
+ *                Otherwise, returns buf.
  *
  *********************************************************************/
-jb_err edit_read_line(FILE *fp,
-                      char **raw_out,
-                      char **prefix_out,
-                      char **data_out,
-                      int *newline,
-                      unsigned long *line_number)
+char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs)
 {
-   char *p;          /* Temporary pointer   */
-   char *linebuf;    /* Line read from file */
-   char *linestart;  /* Start of linebuf, usually first non-whitespace char */
-   int contflag = 0; /* Nonzero for line continuation - i.e. line ends '\' */
-   int is_empty = 1; /* Flag if not got any data yet */
-   char *raw    = NULL; /* String to be stored in raw_out    */
-   char *prefix = NULL; /* String to be stored in prefix_out */
-   char *data   = NULL; /* String to be stored in data_out   */
-   int scrapnewline;    /* Used for (*newline) if newline==NULL */
-   jb_err rval = JB_ERR_OK;
-
-   assert(fp);
-   assert(raw_out || data_out);
-   assert(newline == NULL
-       || *newline == NEWLINE_UNKNOWN
-       || *newline == NEWLINE_UNIX
-       || *newline == NEWLINE_DOS
-       || *newline == NEWLINE_MAC);
-
-   if (newline == NULL)
-   {
-      scrapnewline = NEWLINE_UNKNOWN;
-      newline = &scrapnewline;
-   }
-
-   /* Set output parameters to NULL */
-   if (raw_out)
-   {
-      *raw_out    = NULL;
-   }
-   if (prefix_out)
-   {
-      *prefix_out = NULL;
-   }
-   if (data_out)
-   {
-      *data_out   = NULL;
-   }
-
-   /* Set string variables to new, empty strings. */
-
-   if (raw_out)
-   {
-      if ((raw = malloc(1)) == NULL)
-      {
-         return JB_ERR_MEMORY;
-      }
-      *raw = '\0';
-   }
-   if (prefix_out)
-   {
-      if ((prefix = malloc(1)) == NULL)
-      {
-         freez(raw);
-         return JB_ERR_MEMORY;
-      }
-      *prefix = '\0';
-   }
-   if (data_out)
-   {
-      if ((data = malloc(1)) == NULL)
-      {
-         freez(raw);
-         freez(prefix);
-         return JB_ERR_MEMORY;
-      }
-      *data = '\0';
-   }
+   char *p, *q;
+   char linebuf[BUFFER_SIZE];
+   int contflag = 0;
 
-   /* Main loop.  Loop while we need more data & it's not EOF. */
+   *buf = '\0';
 
-   while ( (contflag || is_empty)
-        && (JB_ERR_OK == (rval = simple_read_line(fp, &linebuf, newline))))
+   while (fgets(linebuf, sizeof(linebuf), fp))
    {
-      if (line_number)
-      {
-         (*line_number)++;
-      }
-      if (raw)
+#ifndef SPLIT_PROXY_ARGS
+      if (fs && !suppress_blocklists)
       {
-         string_append(&raw,linebuf);
-         if (string_append(&raw,NEWLINE(*newline)))
+         char *html_line = html_encode(linebuf);
+         if (html_line != NULL)
          {
-            freez(prefix);
-            freez(data);
-            free(linebuf);
-            return JB_ERR_MEMORY;
+            fs->proxy_args = strsav(fs->proxy_args, html_line);
+            freez(html_line);
          }
+         fs->proxy_args = strsav(fs->proxy_args, "<br>");
       }
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-      /* Line continuation? Trim escape and set flag. */
-      p = linebuf + strlen(linebuf) - 1;
-      contflag = ((*linebuf != '\0') && (*p == '\\'));
-      if (contflag)
+      /* Trim off newline */
+      if ((p = strpbrk(linebuf, "\r\n")) != NULL)
       {
          *p = '\0';
       }
 
-      /* Trim leading spaces if we're at the start of the line */
-      linestart = linebuf;
-      if (*data == '\0')
+      /* Line continuation? Trim escape and set flag. */
+      if ((p != linebuf) && (*--p == '\\'))
       {
-         /* Trim leading spaces */
-         while (*linestart && isspace((int)(unsigned char)*linestart))
-         {
-            linestart++;
-         }
+         contflag = 1;
+         *p = '\0';
       }
 
-      /* Handle comment characters. */
-      p = linestart;
-      while ((p = strchr(p, '#')) != NULL)
+      /* If there's a comment char.. */
+      if ((p = strpbrk(linebuf, "#")) != NULL)
       {
-         /* Found a comment char.. */
+         /* ..and it's escaped, left-shift the line over the escape. */
          if ((p != linebuf) && (*(p-1) == '\\'))
          {
-            /* ..and it's escaped, left-shift the line over the escape. */
-            char *q = p - 1;
-            while ((*q = *(q + 1)) != '\0')
-            {
-               q++;
-            }
-            /* Now scan from just after the "#". */
+            q = p-1;
+            while ((*q++ = *p++) != '\0') /* nop */;
          }
+         /* Else, chop off the rest of the line */
          else
          {
-            /* Real comment.  Save it... */
-            if (p == linestart)
-            {
-               /* Special case:  Line only contains a comment, so all the
-                * previous whitespace is considered part of the comment.
-                * Undo the whitespace skipping, if any.
-                */
-               linestart = linebuf;
-               p = linestart;
-            }
-            if (prefix)
-            {
-               string_append(&prefix,p);
-               if (string_append(&prefix, NEWLINE(*newline)))
-               {
-                  freez(raw);
-                  freez(data);
-                  free(linebuf);
-                  return JB_ERR_MEMORY;
-               }
-            }
-
-            /* ... and chop off the rest of the line */
             *p = '\0';
          }
-      } /* END while (there's a # character) */
+      }
 
       /* Write to the buffer */
-      if (*linestart)
+      if (*linebuf)
       {
-         is_empty = 0;
-         if (data)
-         {
-            if (string_append(&data, linestart))
-            {
-               freez(raw);
-               freez(prefix);
-               free(linebuf);
-               return JB_ERR_MEMORY;
-            }
-         }
+         strncat(buf, linebuf, buflen - strlen(buf));
       }
 
-      free(linebuf);
-   } /* END while(we need more data) */
-
-   /* Handle simple_read_line() errors - ignore EOF */
-   if ((rval != JB_ERR_OK) && (rval != JB_ERR_FILE))
-   {
-      freez(raw);
-      freez(prefix);
-      freez(data);
-      return rval;
-   }
-
-   if (raw ? (*raw == '\0') : is_empty)
-   {
-      /* EOF and no data there.  (Definition of "data" depends on whether
-       * the caller cares about "raw" or just "data").
-       */
-
-      freez(raw);
-      freez(prefix);
-      freez(data);
-
-      return JB_ERR_FILE;
-   }
-   else
-   {
-      /* Got at least some data */
-
-      /* Remove trailing whitespace */
-      chomp(data);
-
-      if (raw_out)
-      {
-         *raw_out    = raw;
-      }
-      else
-      {
-         freez(raw);
-      }
-      if (prefix_out)
-      {
-         *prefix_out = prefix;
-      }
-      else
-      {
-         freez(prefix);
-      }
-      if (data_out)
-      {
-         *data_out   = data;
-      }
-      else
+      /* Continue? */
+      if (contflag)
       {
-         freez(data);
+         contflag = 0;
+               continue;
       }
-      return JB_ERR_OK;
-   }
-}
 
+      /* Remove leading and trailing whitespace */         
+      chomp(buf);
 
-/*********************************************************************
- *
- * Function    :  read_config_line
- *
- * Description :  Read a single non-empty line from a file and return
- *                it.  Trims comments, leading and trailing whitespace
- *                and respects escaping of newline and comment char.
- *
- * Parameters  :
- *          1  :  buf = Buffer to use.
- *          2  :  buflen = Size of buffer in bytes.
- *          3  :  fp = File to read from
- *          4  :  linenum = linenumber in file
- *
- * Returns     :  NULL on EOF or error
- *                Otherwise, returns buf.
- *
- *********************************************************************/
-char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum)
-{
-   jb_err err;
-   char *buf2 = NULL;
-   err = edit_read_line(fp, NULL, NULL, &buf2, NULL, linenum);
-   if (err)
-   {
-      if (err == JB_ERR_MEMORY)
+      if (*buf)
       {
-         log_error(LOG_LEVEL_FATAL, "Out of memory loading a config file");
+         return buf;
       }
-      return NULL;
-   }
-   else
-   {
-      assert(buf2);
-      assert(strlen(buf2) + 1U < buflen);
-      strncpy(buf, buf2, buflen - 1);
-      free(buf2);
-      buf[buflen - 1] = '\0';
-      return buf;
    }
+
+   /* EOF */
+   return NULL;
+
 }
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 /*********************************************************************
  *
  * Function    :  unload_trustfile
@@ -961,44 +672,16 @@ char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenu
  *********************************************************************/
 static void unload_trustfile(void *f)
 {
-   struct block_spec *cur = (struct block_spec *)f;
-   struct block_spec *next;
-
-   while (cur != NULL)
-   {
-      next = cur->next;
+   struct block_spec *b = (struct block_spec *)f;
+   if (b == NULL) return;
 
-      free_url_spec(cur->url);
-      free(cur);
+   unload_trustfile(b->next); /* Stack is cheap, isn't it? */
 
-      cur = next;
-   }
-
-}
+   free_url(b->url);
 
+   freez(b);
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_trust_file
- *
- * Description :  Unloads current trust file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_trust_file(void)
-{
-   if (current_trustfile)
-   {
-      current_trustfile->unloader = unload_trustfile;
-      current_trustfile = NULL;
-   }
 }
-#endif /* FEATURE_GRACEFUL_TERMINATION */
 
 
 /*********************************************************************
@@ -1023,7 +706,6 @@ int load_trustfile(struct client_state *csp)
    char  buf[BUFFER_SIZE], *p, *q;
    int reject, trusted;
    struct file_list *fs;
-   unsigned long linenum = 0;
 
    if (!check_file_changed(current_trustfile, csp->config->trustfile, &fs))
    {
@@ -1052,7 +734,7 @@ int load_trustfile(struct client_state *csp)
 
    tl = csp->config->trust_list;
 
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
    {
       trusted = 0;
       reject  = 1;
@@ -1068,7 +750,7 @@ int load_trustfile(struct client_state *csp)
          reject = 0;
          p = buf;
          q = p+1;
-         while ((*p++ = *q++) != '\0')
+         while ((*p++ = *q++))
          {
             /* nop */
          }
@@ -1106,7 +788,6 @@ int load_trustfile(struct client_state *csp)
       if (trusted)
       {
          *tl++ = b->url;
-         /* FIXME BUFFER OVERFLOW if >=64 entries */
       }
    }
 
@@ -1114,6 +795,13 @@ int load_trustfile(struct client_state *csp)
 
    fclose(fp);
 
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
    /* the old one is now obsolete */
    if (current_trustfile)
    {
@@ -1137,15 +825,15 @@ load_trustfile_error:
    return(-1);
 
 }
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
+#ifdef PCRS
 /*********************************************************************
  *
  * Function    :  unload_re_filterfile
  *
- * Description :  Unload the re_filter list by freeing all chained
- *                re_filterfile specs and their data.
+ * Description :  Unload the re_filter list.
  *
  * Parameters  :
  *          1  :  f = the data structure associated with the filterfile.
@@ -1155,57 +843,24 @@ load_trustfile_error:
  *********************************************************************/
 static void unload_re_filterfile(void *f)
 {
-   struct re_filterfile_spec *a, *b = (struct re_filterfile_spec *)f;
-
-   while (b != NULL)
-   {
-      a = b->next;
+   struct re_filterfile_spec *b = (struct re_filterfile_spec *)f;
 
-      destroy_list(b->patterns);
-      pcrs_free_joblist(b->joblist);
-      freez(b->name);
-      freez(b->description);
-      freez(b);
+   if (b == NULL) return;
 
-      b = a;
-   }
+   destroy_list(b->patterns);
+   pcrs_free_joblist(b->joblist);
+   freez(b);
 
    return;
 }
 
-
-#ifdef FEATURE_GRACEFUL_TERMINATION
-/*********************************************************************
- *
- * Function    :  unload_current_re_filterfile
- *
- * Description :  Unloads current re_filter file - reset to state at
- *                beginning of program.
- *
- * Parameters  :  None
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void unload_current_re_filterfile(void)
-{
-   if (current_re_filterfile)
-   {
-      current_re_filterfile->unloader = unload_re_filterfile;
-      current_re_filterfile = NULL;
-   }
-}
-#endif
-
-
 /*********************************************************************
  *
  * Function    :  load_re_filterfile
  *
- * Description :  Load the re_filterfile. 
- *                Generate a chained list of re_filterfile_spec's from
- *                the "FILTER: " blocks, compiling all their substitutions
- *                into chained lists of pcrs_job structs.
+ * Description :  Load the re_filterfile. Each non-comment, non-empty
+ *                line is instantly added to the joblist, which is
+ *                a chained list of pcrs_job structs.
  *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
@@ -1217,19 +872,16 @@ int load_re_filterfile(struct client_state *csp)
 {
    FILE *fp;
 
-   struct re_filterfile_spec *new_bl, *bl = NULL;
+   struct re_filterfile_spec *bl;
    struct file_list *fs;
 
    char  buf[BUFFER_SIZE];
    int error;
-   unsigned long linenum = 0;
    pcrs_job *dummy;
 
-   /*
-    * No need to reload if unchanged
-    */
    if (!check_file_changed(current_re_filterfile, csp->config->re_filterfile, &fs))
    {
+      /* No need to load */
       if (csp)
       {
          csp->rlist = current_re_filterfile;
@@ -1241,105 +893,53 @@ int load_re_filterfile(struct client_state *csp)
       goto load_re_filterfile_error;
    }
 
-   /* 
-    * Open the file or fail
-    */
-   if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL)
+   fs->f = bl = (struct re_filterfile_spec  *)zalloc(sizeof(*bl));
+   if (bl == NULL)
    {
       goto load_re_filterfile_error;
    }
 
-   /* 
-    * Read line by line
-    */
-   while (read_config_line(buf, sizeof(buf), fp, &linenum) != NULL)
+   /* Open the file or fail */
+   if ((fp = fopen(csp->config->re_filterfile, "r")) == NULL)
    {
-      /*
-       * If this is the head of a new filter block, make it a
-       * re_filterfile spec of its own and chain it to the list:
-       */
-      if (strncmp(buf, "FILTER:", 7) == 0)
-      {
-         new_bl = (struct re_filterfile_spec  *)zalloc(sizeof(*bl));
-         if (new_bl == NULL)
-         {
-            goto load_re_filterfile_error;
-         }
-
-         new_bl->name = chomp(buf + 7);
-
-         if (NULL != (new_bl->description = strchr(new_bl->name, ' ')))
-         {
-            *new_bl->description++ = '\0';
-            new_bl->description = strdup(chomp(new_bl->description));
-         }
-         else
-         {
-            new_bl->description = strdup("No description available for this filter");
-         }
-
-         new_bl->name = strdup(chomp(new_bl->name));
-         
-         /*
-          * If this is the first filter block, chain it
-          * to the file_list rather than its (nonexistant)
-          * predecessor
-          */
-         if (fs->f == NULL)
-         {
-            fs->f = new_bl;
-         }
-         else
-         {
-            bl->next = new_bl;
-         }
-         bl = new_bl;
-
-         log_error(LOG_LEVEL_RE_FILTER, "Reading in filter \"%s\" (\"%s\")", bl->name, bl->description);
+      goto load_re_filterfile_error;
+   }
 
-         continue;
-      }
+   /* Read line by line */
+   while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
+   {
+      enlist( bl->patterns, buf );
 
-      /* 
-       * Else, save the expression, make it a pcrs_job
-       * and chain it into the current filter's joblist 
-       */
-      if (bl != NULL)
+      /* We have a meaningful line -> make it a job */
+      if ((dummy = pcrs_compile(buf, &error)) == NULL)
       {
-         enlist(bl->patterns, buf);
-
-         if ((dummy = pcrs_compile_command(buf, &error)) == NULL)
-         {
-            log_error(LOG_LEVEL_RE_FILTER,
-                      "Adding re_filter job %s to filter %s failed with error %d.", buf, bl->name, error);
-            continue;
-         }
-         else
-         {
-            dummy->next = bl->joblist;
-            bl->joblist = dummy;
-            log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s to filter %s succeeded.", buf, bl->name);
-         }
+         log_error(LOG_LEVEL_RE_FILTER, 
+               "Adding re_filter job %s failed with error %d.", buf, error);
+         continue;
       }
       else
       {
-         log_error(LOG_LEVEL_ERROR, "Ignoring job %s outside filter block in %s, line %d", buf, csp->config->re_filterfile, linenum);
+         dummy->next = bl->joblist;
+         bl->joblist = dummy;
+         log_error(LOG_LEVEL_RE_FILTER, "Adding re_filter job %s succeeded.", buf);
       }
    }
 
    fclose(fp);
 
-   /* 
-    * Schedule the now-obsolete old data for unloading
-    */
+#ifndef SPLIT_PROXY_ARGS
+   if (!suppress_blocklists)
+   {
+      fs->proxy_args = strsav(fs->proxy_args, "</pre>");
+   }
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+   /* the old one is now obsolete */
    if ( NULL != current_re_filterfile )
    {
       current_re_filterfile->unloader = unload_re_filterfile;
    }
 
-   /*
-    * Chain this file into the global list of loaded files
-    */
    fs->next    = files->next;
    files->next = fs;
    current_re_filterfile = fs;
@@ -1352,11 +952,12 @@ int load_re_filterfile(struct client_state *csp)
    return( 0 );
 
 load_re_filterfile_error:
-   log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E",
+   log_error(LOG_LEVEL_FATAL, "can't load re_filterfile '%s': %E", 
              csp->config->re_filterfile);
    return(-1);
 
 }
+#endif /* def PCRS */
 
 
 /*********************************************************************
@@ -1374,7 +975,7 @@ load_re_filterfile_error:
  * Returns     :  N/A
  *
  *********************************************************************/
-void add_loader(int (*loader)(struct client_state *),
+void add_loader(int (*loader)(struct client_state *), 
                 struct configuration_spec * config)
 {
    int i;
index 216c352..7aa80e6 100644 (file)
--- a/loaders.h
+++ b/loaders.h
@@ -1,6 +1,6 @@
-#ifndef LOADERS_H_INCLUDED
-#define LOADERS_H_INCLUDED
-#define LOADERS_H_VERSION "$Id: loaders.h,v 1.18 2002/03/24 13:25:43 swa Exp $"
+#ifndef _LOADERS_H
+#define _LOADERS_H
+#define LOADERS_H_VERSION "$Id: loaders.h,v 1.5 2001/05/31 21:28:49 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loaders.h,v $
@@ -11,7 +11,7 @@
  *                unload files that are no longer in use.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: loaders.h,v $
- *    Revision 1.18  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.17  2002/03/16 23:54:06  jongfoster
- *    Adding graceful termination feature, to help look for memory leaks.
- *    If you enable this (which, by design, has to be done by hand
- *    editing config.h) and then go to http://i.j.b/die, then the program
- *    will exit cleanly after the *next* request.  It should free all the
- *    memory that was used.
- *
- *    Revision 1.16  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.15  2002/01/22 23:46:18  jongfoster
- *    Moving edit_read_line() and simple_read_line() to loaders.c, and
- *    extending them to support reading MS-DOS, Mac and UNIX style files
- *    on all platforms.
- *
- *    Modifying read_config_line() (without changing it's prototype) to
- *    be a trivial wrapper for edit_read_line().  This means that we have
- *    one function to read a line and handle comments, which is common
- *    between the initialization code and the edit interface.
- *
- *    Revision 1.14  2002/01/17 21:03:08  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Revision 1.13  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.12  2001/11/07 00:02:13  steudten
- *    Add line number in error output for lineparsing for
- *    actionsfile and configfile.
- *    Special handling for CLF added.
- *
- *    Revision 1.11  2001/10/23 21:38:53  jongfoster
- *    Adding error-checking to create_url_spec()
- *
- *    Revision 1.10  2001/09/22 16:36:59  jongfoster
- *    Removing unused parameter fs from read_config_line()
- *
- *    Revision 1.9  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.8  2001/07/29 18:58:15  jongfoster
- *    Removing nested #includes, adding forward declarations for needed
- *    structures, and changing the #define _FILENAME_H to FILENAME_H_INCLUDED.
- *
- *    Revision 1.7  2001/07/13 14:01:54  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.6  2001/06/07 23:14:38  jongfoster
- *    Removing ACL and forward file loaders - these files have
- *    been merged into the config file.
- *
  *    Revision 1.5  2001/05/31 21:28:49  jongfoster
  *    Removed all permissionsfile code - it's now called the actions
  *    file, and (almost) all the code is in actions.c
  *********************************************************************/
 \f
 
+#include "project.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* Structures taken from project.h */
-struct client_state;
-struct file_list;
-struct configuration_spec;
-struct url_spec;
-
 extern void sweep(void);
-extern char *read_config_line(char *buf, size_t buflen, FILE *fp, unsigned long *linenum);
+extern char *read_config_line(char *buf, int buflen, FILE *fp, struct file_list *fs);
 extern int check_file_changed(const struct file_list * current,
                               const char * filename,
                               struct file_list ** newfl);
 
-extern jb_err edit_read_line(FILE *fp,
-                             char **raw_out,
-                             char **prefix_out,
-                             char **data_out,
-                             int *newline,
-                             unsigned long *line_number);
-
-extern jb_err simple_read_line(FILE *fp, char **dest, int *newline);
-
-/*
- * Various types of newlines that a file may contain.
- */
-#define NEWLINE_UNKNOWN 0  /* Newline convention in file is unknown */
-#define NEWLINE_UNIX    1  /* Newline convention in file is '\n'   (ASCII 10) */
-#define NEWLINE_DOS     2  /* Newline convention in file is '\r\n' (ASCII 13,10) */
-#define NEWLINE_MAC     3  /* Newline convention in file is '\r'   (ASCII 13) */
-
-/*
- * Types of newlines that a file may contain, as strings.  If you have an
- * extremely wierd compiler that does not have '\r' == CR == ASCII 13 and
- * '\n' == LF == ASCII 10), then fix CHAR_CR and CHAR_LF in loaders.c as
- * well as these definitions.
- */
-#define NEWLINE(style) ((style)==NEWLINE_DOS ? "\r\n" : \
-                        ((style)==NEWLINE_MAC ? "\r" : "\n"))
-
-
-extern short int MustReload;
 extern int load_actions_file(struct client_state *csp);
-extern int load_re_filterfile(struct client_state *csp);
-
-#ifdef FEATURE_TRUST
+  
+#ifdef TRUST_FILES
 extern int load_trustfile(struct client_state *csp);
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
-#ifdef FEATURE_GRACEFUL_TERMINATION
-#ifdef FEATURE_TRUST
-void unload_current_trust_file(void);
-#endif
-void unload_current_re_filterfile(void);
-#endif /* FEATURE_GRACEFUL_TERMINATION */
+#ifdef PCRS
+extern int load_re_filterfile(struct client_state *csp);
+#endif /* def PCRS */
 
+extern int create_url_spec(struct url_spec * url, char * buf);
+extern void free_url(struct url_spec *url);
 
 extern void add_loader(int (*loader)(struct client_state *), 
                        struct configuration_spec * config);
@@ -226,7 +128,7 @@ extern const char loaders_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef LOADERS_H_INCLUDED */
+#endif /* ndef _LOADERS_H */
 
 /*
   Local Variables:
index ec4de4f..ac363f4 100644 (file)
@@ -1,16 +1,17 @@
-const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp $";
+/* vim:ts=3: */
+const char miscutil_rcs[] = "$Id: miscutil.c,v 1.13 2001/06/29 13:32:14 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.c,v $
  *
  * Purpose     :  zalloc, hash_string, safe_strerror, strcmpic,
- *                strncmpic, chomp, and MinGW32 strdup
+ *                strncmpic, strsav, chomp, and MinGW32 strdup
  *                functions. 
  *                These are each too small to deserve their own file
  *                but don't really fit in any other file.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -36,95 +37,6 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp
  *
  * Revisions   :
  *    $Log: miscutil.c,v $
- *    Revision 1.34  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.33  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.32  2002/03/06 23:02:57  jongfoster
- *    Removing tabs
- *
- *    Revision 1.31  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.30  2002/03/04 18:27:42  oes
- *    - Deleted deletePidFile
- *    - Made write_pid_file use the --pidfile option value
- *      (or no PID file, if the option was absent)
- *    - Played styleguide police
- *
- *    Revision 1.29  2002/03/04 02:08:02  david__schmidt
- *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
- *
- *    Revision 1.28  2002/03/03 09:18:03  joergs
- *    Made jumbjuster work on AmigaOS again.
- *
- *    Revision 1.27  2002/01/21 00:52:32  jongfoster
- *    Adding string_join()
- *
- *    Revision 1.26  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.25  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.24  2001/11/05 21:41:43  steudten
- *    Add changes to be a real daemon just for unix os.
- *    (change cwd to /, detach from controlling tty, set
- *    process group and session leader to the own process.
- *    Add DBG() Macro.
- *    Add some fatal-error log message for failed malloc().
- *    Add '-d' if compiled with 'configure --with-debug' to
- *    enable debug output.
- *
- *    Revision 1.23  2001/10/29 03:48:10  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.22  2001/10/26 17:39:38  oes
- *    Moved ijb_isspace and ijb_tolower to project.h
- *
- *    Revision 1.21  2001/10/23 21:27:50  jongfoster
- *    Standardising error codes in string_append
- *    make_path() no longer adds '\\' if the dir already ends in '\\' (this
- *    is just copying a UNIX-specific fix to the Windows-specific part)
- *
- *    Revision 1.20  2001/10/22 15:33:56  david__schmidt
- *    Special-cased OS/2 out of the Netscape-abort-on-404-in-js problem in
- *    filters.c.  Added a FIXME in front of the offending code.  I'll gladly
- *    put in a better/more robust fix for all parties if one is presented...
- *    It seems that just returning 200 instead of 404 would pretty much fix
- *    it for everyone, but I don't know all the history of the problem.
- *
- *    Revision 1.19  2001/10/14 22:02:57  jongfoster
- *    New function string_append() which is like strsav(), but running
- *    out of memory isn't automatically FATAL.
- *
- *    Revision 1.18  2001/09/20 13:33:43  steudten
- *
- *    change long to int as return value in hash_string(). Remember the wraparound
- *    for int = long = sizeof(4) - thats maybe not what we want.
- *
- *    Revision 1.17  2001/09/13 20:51:29  jongfoster
- *    Fixing potential problems with characters >=128 in simplematch()
- *    This was also a compiler warning.
- *
- *    Revision 1.16  2001/09/10 10:56:59  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.15  2001/07/13 14:02:24  oes
- *    Removed vim-settings
- *
- *    Revision 1.14  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.13  2001/06/29 13:32:14  oes
  *    Removed logentry from cancelled commit
  *
@@ -197,22 +109,31 @@ const char miscutil_rcs[] = "$Id: miscutil.c,v 1.34 2002/03/24 13:25:43 swa Exp
 #include "config.h"
 
 #include <stdio.h>
-#include <sys/types.h>
 #include <stdlib.h>
-#if !defined(_WIN32) && !defined(__OS2__)
-#include <unistd.h>
-#endif /* #if !defined(_WIN32) && !defined(__OS2__) */
 #include <string.h>
+#include <malloc.h>
 #include <ctype.h>
-#include <assert.h>
 
+/*
+ * FIXME: Only need project.h for BUFFER_SIZE.  It would be nice
+ * to remove this dependency.
+ */
 #include "project.h"
 #include "miscutil.h"
 #include "errlog.h"
-#include "jcc.h"
 
 const char miscutil_h_rcs[] = MISCUTIL_H_VERSION;
 
+/* Fix a problem with Solaris.  There should be no effect on other
+ * platforms.
+ * Solaris's isspace() is a macro which uses it's argument directly
+ * as an array index.  Therefore we need to make sure that high-bit
+ * characters generate +ve values, and ideally we also want to make
+ * the argument match the declared parameter type of "int".
+ */
+#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
+#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))   
+
 /*********************************************************************
  *
  * Function    :  zalloc
@@ -226,7 +147,7 @@ const char miscutil_h_rcs[] = MISCUTIL_H_VERSION;
  * Returns     :  Pointer to newly malloc'd memory chunk.
  *
  *********************************************************************/
-void *zalloc(size_t size)
+void *zalloc(int size)
 {
    void * ret;
 
@@ -236,45 +157,7 @@ void *zalloc(size_t size)
    }
 
    return(ret);
-
-}
-
-
-#if defined(unix)
-/*********************************************************************
- *
- * Function    :  write_pid_file 
- *
- * Description :  Writes a pid file with the pid of the main process 
- *
- * Parameters  :  None
- *
- * Returns     :  N/A 
- *
- *********************************************************************/
-void write_pid_file(void)
-{
-   FILE   *fp;
-   
-   /*
-    * If no --pidfile option was given,
-    * we can live without one.
-    */
-   if (pidfile == NULL) return;
-
-   if ((fp = fopen(pidfile, "w")) == NULL)
-   {
-      log_error(LOG_LEVEL_INFO, "can't open pidfile '%s': %E", pidfile);
-   }
-   else
-   {
-      fprintf(fp, "%u\n", (unsigned int) getpid());
-      fclose (fp);
-   }
-   return;
-
 }
-#endif /* def unix */
 
 
 /*********************************************************************
@@ -291,9 +174,9 @@ void write_pid_file(void)
  * Returns     :  an unsigned long variable with the hashed value.
  *
  *********************************************************************/
-unsigned int hash_string( const char* s )
+unsigned long hash_string( const char* s )
 {
-   unsigned int h = 0
+   unsigned long h = 0ul
 
    for ( ; *s; ++s )
    {
@@ -487,20 +370,17 @@ char *chomp(char *string)
 
 }
 
-
 /*********************************************************************
  *
  * Function    :  strsav
  *
  * Description :  Reallocate "old" and append text to it.  This makes
  *                it easier to append to malloc'd strings.
- *                Running out of memory is a FATAL error.
  *
  * Parameters  :
  *          1  :  old = Old text that is to be extended.  Will be
- *                free()d by this routine.  May be NULL.
+ *                free()d by this routine.
  *          2  :  text_to_append = Text to be appended to old.
- *                May be NULL.
  *
  * Returns     :  Pointer to newly malloc'ed appended string.
  *                If there is no text to append, return old.  Caller
@@ -509,172 +389,45 @@ char *chomp(char *string)
  *********************************************************************/
 char *strsav(char *old, const char *text_to_append)
 {
-   size_t old_len, new_len = 0;
+   int old_len, new_len;
    char *p;
 
-   if ((text_to_append == NULL) || (*text_to_append == '\0'))
+   if (( text_to_append == NULL) || (*text_to_append == '\0'))
    {
       return(old);
    }
 
-   if (NULL == old)
-   {
-      if ((p = strdup(text_to_append)) == NULL)
-      {
-         log_error(LOG_LEVEL_FATAL, "strdup() failed!");
-         /* Never get here - LOG_LEVEL_FATAL causes program exit */
-      }
-      return p;
-   }
-
-   old_len = strlen(old);
-   new_len = old_len + strlen(text_to_append) + 1;
-
-   if ((p = realloc(old, new_len)) == NULL)
+   if (NULL != old)
    {
-      log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len);
-      /* Never get here - LOG_LEVEL_FATAL causes program exit */
+      old_len = strlen(old);
    }
-
-   strcpy(p + old_len, text_to_append);
-   return(p);
-}
-
-
-/*********************************************************************
- *
- * Function    :  string_append
- *
- * Description :  Reallocate target_string and append text to it.  
- *                This makes it easier to append to malloc'd strings.
- *                This is similar to the (removed) strsav(), but
- *                running out of memory isn't catastrophic.
- *
- *                Programming style:
- *
- *                The following style provides sufficient error
- *                checking for this routine, with minimal clutter
- *                in the source code.  It is recommended if you
- *                have many calls to this function:
- *
- *                char * s = strdup(...); // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                if (NULL == s) { ... handle error ... }
- *
- *                OR, equivalently:
- *
- *                char * s = strdup(...); // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                string_append(&s, ...);  // don't check for error
- *                if (string_append(&s, ...)) {... handle error ...}
- *
- * Parameters  :
- *          1  :  target_string = Pointer to old text that is to be
- *                extended.  *target_string will be free()d by this
- *                routine.  target_string must be non-NULL.
- *                If *target_string is NULL, this routine will
- *                do nothing and return with an error - this allows
- *                you to make many calls to this routine and only
- *                check for errors after the last one.
- *          2  :  text_to_append = Text to be appended to old.
- *                Must not be NULL.
- *
- * Returns     :  JB_ERR_OK on success, and sets *target_string
- *                   to newly malloc'ed appended string.  Caller
- *                   must free(*target_string).
- *                JB_ERR_MEMORY on out-of-memory.  (And free()s
- *                   *target_string and sets it to NULL).
- *                JB_ERR_MEMORY if *target_string is NULL.
- *
- *********************************************************************/
-jb_err string_append(char **target_string, const char *text_to_append)
-{
-   size_t old_len;
-   char *new_string;
-
-   assert(target_string);
-   assert(text_to_append);
-
-   if (*target_string == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if (*text_to_append == '\0')
+   else
    {
-      return JB_ERR_OK;
+      old_len = 0;
    }
 
-   old_len = strlen(*target_string);
+   new_len = old_len + strlen(text_to_append) + 1;
 
-   if (NULL == (new_string = realloc(*target_string,
-          strlen(text_to_append) + old_len + 1)))
+   if (old)
    {
-      free(*target_string);
-
-      *target_string = NULL;
-      return JB_ERR_MEMORY;
+      if ((p = realloc(old, new_len)) == NULL)
+      {
+         log_error(LOG_LEVEL_FATAL, "realloc(%d) bytes failed!", new_len);
+         /* Never get here - LOG_LEVEL_FATAL causes program exit */
+      }
    }
-
-   strcpy(new_string + old_len, text_to_append);
-
-   *target_string = new_string;
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  string_join
- *
- * Description :  Join two strings together.  Frees BOTH the original
- *                strings.  If either or both input strings are NULL,
- *                fails as if it had run out of memory.
- *
- *                For comparison, string_append requires that the
- *                second string is non-NULL, and doesn't free it.
- *
- *                Rationale: Too often, we want to do
- *                string_append(s, html_encode(s2)).  That assert()s
- *                if s2 is NULL or if html_encode() runs out of memory.
- *                It also leaks memory.  Proper checking is cumbersome.
- *                The solution: string_join(s, html_encode(s2)) is safe,
- *                and will free the memory allocated by html_encode().
- *
- * Parameters  :
- *          1  :  target_string = Pointer to old text that is to be
- *                extended.  *target_string will be free()d by this
- *                routine.  target_string must be non-NULL.
- *          2  :  text_to_append = Text to be appended to old.
- *
- * Returns     :  JB_ERR_OK on success, and sets *target_string
- *                   to newly malloc'ed appended string.  Caller
- *                   must free(*target_string).
- *                JB_ERR_MEMORY on out-of-memory, or if
- *                   *target_string or text_to_append is NULL.  (In
- *                   this case, frees *target_string and text_to_append,
- *                   sets *target_string to NULL).
- *
- *********************************************************************/
-jb_err string_join(char **target_string, char *text_to_append)
-{
-   jb_err err;
-
-   assert(target_string);
-
-   if (text_to_append == NULL)
+   else
    {
-      freez(*target_string);
-      return JB_ERR_MEMORY;
+      if ((p = (char *)malloc(new_len)) == NULL)
+      {
+         log_error(LOG_LEVEL_FATAL, "malloc(%d) bytes failed!", new_len);
+         /* Never get here - LOG_LEVEL_FATAL causes program exit */
+      }
    }
 
-   err = string_append(target_string, text_to_append);
-
-   free(text_to_append);
+   strcpy(p + old_len, text_to_append);
+   return(p);
 
-   return err;
 }
 
 
@@ -696,12 +449,12 @@ jb_err string_join(char **target_string, char *text_to_append)
  *********************************************************************/
 int simplematch(char *pattern, char *text)
 {
-   unsigned char *pat = (unsigned char *) pattern;
-   unsigned char *txt = (unsigned char *) text;
-   unsigned char *fallback = pat; 
+   char *fallback; 
+   char *pat = pattern;
+   char *txt = text;
    int wildcard = 0;
   
-   unsigned char lastchar = 'a';
+   char lastchar = 'a';
    unsigned i;
    unsigned char charmap[32];
   
@@ -803,25 +556,25 @@ int simplematch(char *pattern, char *text)
  *
  * Parameters  :
  *          1  :  string = string to be duplicated
- *          2  :  len = number of bytes to duplicate
+ *          2  :  n = number of bytes to duplicate
  *
  * Returns     :  pointer to copy, or NULL if failiure
  *
  *********************************************************************/
-char *bindup(const char *string, size_t len)
+char *bindup(const char *string, int n)
 {
-   char *duplicate;
+   char *dup;
 
-   if (NULL == (duplicate = (char *)malloc(len)))
+   if (NULL == (dup = (char *)malloc(n)))
    {
       return NULL;
    }
    else
    {
-     memcpy(duplicate, string, len);
+     memcpy(dup, string, n);
    }
 
-   return duplicate;
+   return dup;
 
 }
 
@@ -853,21 +606,7 @@ char * make_path(const char * dir, const char * file)
 
    if(dir)
    {
-      if(dir[0] == '.')
-      {
-         if(dir[1] == '/')
-         {
-            strncpy(path,dir+2,512);
-         }
-         else
-         {
-            strncpy(path,dir+1,512);
-         }
-      }
-      else
-      {
-         strncpy(path,dir,512);
-      }
+      strncpy(path,dir,512);
       path[511]=0;
    } else {
       path[0]=0;
@@ -886,53 +625,24 @@ char * make_path(const char * dir, const char * file)
    }
 
    if ((dir == NULL) || (*dir == '\0') /* No directory specified */
-#if defined(_WIN32) || defined(__OS2__)
+#ifdef _WIN32
       || (*file == '\\') || (file[1] == ':') /* Absolute path (DOS) */
-#else /* ifndef _WIN32 || __OS2__ */
+#else /* ifndef _WIN32 */
       || (*file == '/') /* Absolute path (U*ix) */
-#endif /* ifndef _WIN32 || __OS2__  */
+#endif /* ifndef _WIN32 */
       )
    {
       return strdup(file);
    }
    else
    {
-      char * path;
-
-#if defined(unix)
-      if ( *dir != '/' && basedir && *basedir )
-      {
-         path = malloc( strlen( basedir ) + strlen(dir) + strlen(file) + 3);
-         if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
-         strcpy(path, basedir);
-         strcat(path, "/");
-         strcat(path, dir);
-      }
-      else
-      {
-         path = malloc(strlen(dir) + strlen(file) + 2);
-         if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
-         strcpy(path, dir);
-      }
-#else
-
-      path = malloc(strlen(dir) + strlen(file) + 2);
-      if (!path ) log_error(LOG_LEVEL_FATAL, "malloc failed!");
+      char * path = malloc(strlen(dir) + strlen(file) + 2);
       strcpy(path, dir);
-
-#endif /* defined unix */
-
-#if defined(_WIN32) || defined(__OS2__)
-      if(path[strlen(path)-1] != '\\')
-      {
-         strcat(path, "\\");
-      }
-#else /* ifndef _WIN32 || __OS2__ */
-      if(path[strlen(path)-1] != '/')
-      {
-         strcat(path, "/");
-      }
-#endif /* ifndef _WIN32 || __OS2__ */
+#ifdef _WIN32
+      strcat(path, "\\");
+#else /* ifndef _WIN32 */
+      if(path[strlen(path)-1] != '/') strcat(path, "/");
+#endif /* ifndef _WIN32 */
       strcat(path, file);
 
       return path;
@@ -941,774 +651,6 @@ char * make_path(const char * dir, const char * file)
 }
 
 
-/*
- * What follows is a portable snprintf routine, written by Mark Martinec.
- * See: http://www.ijs.si/software/snprintf/
- * Anyone who needs it can add a define for themselves... so far, only 
- * OS/2 (native) lacks snprintf.
-
-                                  snprintf.c
-                   - a portable implementation of snprintf,
-       including vsnprintf.c, asnprintf, vasnprintf, asprintf, vasprintf
-                                       
-   snprintf is a routine to convert numeric and string arguments to
-   formatted strings. It is similar to sprintf(3) provided in a system's
-   C library, yet it requires an additional argument - the buffer size -
-   and it guarantees never to store anything beyond the given buffer,
-   regardless of the format or arguments to be formatted. Some newer
-   operating systems do provide snprintf in their C library, but many do
-   not or do provide an inadequate (slow or idiosyncratic) version, which
-   calls for a portable implementation of this routine.
-
-Author
-
-   Mark Martinec <mark.martinec@ijs.si>, April 1999, June 2000
-   Copyright Â© 1999, Mark Martinec
-
- */
-
-#ifdef __OS2__
-
-#define PORTABLE_SNPRINTF_VERSION_MAJOR 2
-#define PORTABLE_SNPRINTF_VERSION_MINOR 2
-
-#if defined(NEED_ASPRINTF) || defined(NEED_ASNPRINTF) || defined(NEED_VASPRINTF) || defined(NEED_VASNPRINTF)
-# if defined(NEED_SNPRINTF_ONLY)
-# undef NEED_SNPRINTF_ONLY
-# endif
-# if !defined(PREFER_PORTABLE_SNPRINTF)
-# define PREFER_PORTABLE_SNPRINTF
-# endif
-#endif
-
-#if defined(SOLARIS_BUG_COMPATIBLE) && !defined(SOLARIS_COMPATIBLE)
-#define SOLARIS_COMPATIBLE
-#endif
-
-#if defined(HPUX_BUG_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
-#define HPUX_COMPATIBLE
-#endif
-
-#if defined(DIGITAL_UNIX_BUG_COMPATIBLE) && !defined(DIGITAL_UNIX_COMPATIBLE)
-#define DIGITAL_UNIX_COMPATIBLE
-#endif
-
-#if defined(PERL_BUG_COMPATIBLE) && !defined(PERL_COMPATIBLE)
-#define PERL_COMPATIBLE
-#endif
-
-#if defined(LINUX_BUG_COMPATIBLE) && !defined(LINUX_COMPATIBLE)
-#define LINUX_COMPATIBLE
-#endif
-
-#include <sys/types.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <errno.h>
-
-#ifdef isdigit
-#undef isdigit
-#endif
-#define isdigit(c) ((c) >= '0' && (c) <= '9')
-
-/* For copying strings longer or equal to 'breakeven_point'
- * it is more efficient to call memcpy() than to do it inline.
- * The value depends mostly on the processor architecture,
- * but also on the compiler and its optimization capabilities.
- * The value is not critical, some small value greater than zero
- * will be just fine if you don't care to squeeze every drop
- * of performance out of the code.
- *
- * Small values favor memcpy, large values favor inline code.
- */
-#if defined(__alpha__) || defined(__alpha)
-#  define breakeven_point   2    /* AXP (DEC Alpha)     - gcc or cc or egcs */
-#endif
-#if defined(__i386__)  || defined(__i386)
-#  define breakeven_point  12    /* Intel Pentium/Linux - gcc 2.96 */
-#endif
-#if defined(__hppa)
-#  define breakeven_point  10    /* HP-PA               - gcc */
-#endif
-#if defined(__sparc__) || defined(__sparc)
-#  define breakeven_point  33    /* Sun Sparc 5         - gcc 2.8.1 */
-#endif
-
-/* some other values of possible interest: */
-/* #define breakeven_point  8 */ /* VAX 4000          - vaxc */
-/* #define breakeven_point 19 */ /* VAX 4000          - gcc 2.7.0 */
-
-#ifndef breakeven_point
-#  define breakeven_point   6    /* some reasonable one-size-fits-all value */
-#endif
-
-#define fast_memcpy(d,s,n) \
-  { register size_t nn = (size_t)(n); \
-    if (nn >= breakeven_point) memcpy((d), (s), nn); \
-    else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
-      register char *dd; register const char *ss; \
-      for (ss=(s), dd=(d); nn>0; nn--) *dd++ = *ss++; } }
-
-#define fast_memset(d,c,n) \
-  { register size_t nn = (size_t)(n); \
-    if (nn >= breakeven_point) memset((d), (int)(c), nn); \
-    else if (nn > 0) { /* proc call overhead is worth only for large strings*/\
-      register char *dd; register const int cc=(int)(c); \
-      for (dd=(d); nn>0; nn--) *dd++ = cc; } }
-
-/* prototypes */
-
-#if defined(NEED_ASPRINTF)
-int asprintf   (char **ptr, const char *fmt, /*args*/ ...);
-#endif
-#if defined(NEED_VASPRINTF)
-int vasprintf  (char **ptr, const char *fmt, va_list ap);
-#endif
-#if defined(NEED_ASNPRINTF)
-int asnprintf  (char **ptr, size_t str_m, const char *fmt, /*args*/ ...);
-#endif
-#if defined(NEED_VASNPRINTF)
-int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap);
-#endif
-
-#if defined(HAVE_SNPRINTF)
-/* declare our portable snprintf  routine under name portable_snprintf  */
-/* declare our portable vsnprintf routine under name portable_vsnprintf */
-#else
-/* declare our portable routines under names snprintf and vsnprintf */
-#define portable_snprintf snprintf
-#if !defined(NEED_SNPRINTF_ONLY)
-#define portable_vsnprintf vsnprintf
-#endif
-#endif
-
-#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...);
-#if !defined(NEED_SNPRINTF_ONLY)
-int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap);
-#endif
-#endif
-
-/* declarations */
-
-static char credits[] = "\n\
-@(#)snprintf.c, v2.2: Mark Martinec, <mark.martinec@ijs.si>\n\
-@(#)snprintf.c, v2.2: Copyright 1999, Mark Martinec. Frontier Artistic License applies.\n\
-@(#)snprintf.c, v2.2: http://www.ijs.si/software/snprintf/\n";
-
-#if defined(NEED_ASPRINTF)
-int asprintf(char **ptr, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  size_t str_m;
-  int str_l;
-
-  *ptr = NULL;
-  va_start(ap, fmt);                            /* measure the required size */
-  str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
-  va_end(ap);
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  *ptr = (char *) malloc(str_m = (size_t)str_l + 1);
-  if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-  else {
-    int str_l2;
-    va_start(ap, fmt);
-    str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-    va_end(ap);
-    assert(str_l2 == str_l);
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_VASPRINTF)
-int vasprintf(char **ptr, const char *fmt, va_list ap) {
-  size_t str_m;
-  int str_l;
-
-  *ptr = NULL;
-  { va_list ap2;
-    va_copy(ap2, ap);  /* don't consume the original ap, we'll need it again */
-    str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
-    va_end(ap2);
-  }
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  *ptr = (char *) malloc(str_m = (size_t)str_l + 1);
-  if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-  else {
-    int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-    assert(str_l2 == str_l);
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_ASNPRINTF)
-int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  int str_l;
-
-  *ptr = NULL;
-  va_start(ap, fmt);                            /* measure the required size */
-  str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap);
-  va_end(ap);
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1;      /* truncate */
-  /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
-  if (str_m == 0) {  /* not interested in resulting string, just return size */
-  } else {
-    *ptr = (char *) malloc(str_m);
-    if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-    else {
-      int str_l2;
-      va_start(ap, fmt);
-      str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-      va_end(ap);
-      assert(str_l2 == str_l);
-    }
-  }
-  return str_l;
-}
-#endif
-
-#if defined(NEED_VASNPRINTF)
-int vasnprintf (char **ptr, size_t str_m, const char *fmt, va_list ap) {
-  int str_l;
-
-  *ptr = NULL;
-  { va_list ap2;
-    va_copy(ap2, ap);  /* don't consume the original ap, we'll need it again */
-    str_l = portable_vsnprintf(NULL, (size_t)0, fmt, ap2);/*get required size*/
-    va_end(ap2);
-  }
-  assert(str_l >= 0);        /* possible integer overflow if str_m > INT_MAX */
-  if ((size_t)str_l + 1 < str_m) str_m = (size_t)str_l + 1;      /* truncate */
-  /* if str_m is 0, no buffer is allocated, just set *ptr to NULL */
-  if (str_m == 0) {  /* not interested in resulting string, just return size */
-  } else {
-    *ptr = (char *) malloc(str_m);
-    if (*ptr == NULL) { errno = ENOMEM; str_l = -1; }
-    else {
-      int str_l2 = portable_vsnprintf(*ptr, str_m, fmt, ap);
-      assert(str_l2 == str_l);
-    }
-  }
-  return str_l;
-}
-#endif
-
-/*
- * If the system does have snprintf and the portable routine is not
- * specifically required, this module produces no code for snprintf/vsnprintf.
- */
-#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
-
-#if !defined(NEED_SNPRINTF_ONLY)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
-  va_list ap;
-  int str_l;
-
-  va_start(ap, fmt);
-  str_l = portable_vsnprintf(str, str_m, fmt, ap);
-  va_end(ap);
-  return str_l;
-}
-#endif
-
-#if defined(NEED_SNPRINTF_ONLY)
-int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...) {
-#else
-int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap) {
-#endif
-
-#if defined(NEED_SNPRINTF_ONLY)
-  va_list ap;
-#endif
-  size_t str_l = 0;
-  const char *p = fmt;
-
-/* In contrast with POSIX, the ISO C99 now says
- * that str can be NULL and str_m can be 0.
- * This is more useful than the old:  if (str_m < 1) return -1; */
-
-#if defined(NEED_SNPRINTF_ONLY)
-  va_start(ap, fmt);
-#endif
-  if (!p) p = "";
-  while (*p) {
-    if (*p != '%') {
-   /* if (str_l < str_m) str[str_l++] = *p++;    -- this would be sufficient */
-   /* but the following code achieves better performance for cases
-    * where format string is long and contains few conversions */
-      const char *q = strchr(p+1,'%');
-      size_t n = !q ? strlen(p) : (q-p);
-      if (str_l < str_m) {
-        size_t avail = str_m-str_l;
-        fast_memcpy(str+str_l, p, (n>avail?avail:n));
-      }
-      p += n; str_l += n;
-    } else {
-      const char *starting_p;
-      size_t min_field_width = 0, precision = 0;
-      int zero_padding = 0, precision_specified = 0, justify_left = 0;
-      int alternate_form = 0, force_sign = 0;
-      int space_for_positive = 1; /* If both the ' ' and '+' flags appear,
-                                     the ' ' flag should be ignored. */
-      char length_modifier = '\0';            /* allowed values: \0, h, l, L */
-      char tmp[32];/* temporary buffer for simple numeric->string conversion */
-
-      const char *str_arg;      /* string address in case of string argument */
-      size_t str_arg_l;         /* natural field width of arg without padding
-                                   and sign */
-      unsigned char uchar_arg;
-        /* unsigned char argument value - only defined for c conversion.
-           N.B. standard explicitly states the char argument for
-           the c conversion is unsigned */
-
-      size_t number_of_zeros_to_pad = 0;
-        /* number of zeros to be inserted for numeric conversions
-           as required by the precision or minimal field width */
-
-      size_t zero_padding_insertion_ind = 0;
-        /* index into tmp where zero padding is to be inserted */
-
-      char fmt_spec = '\0';
-        /* current conversion specifier character */
-
-      str_arg = credits;/* just to make compiler happy (defined but not used)*/
-      str_arg = NULL;
-      starting_p = p; p++;  /* skip '%' */
-   /* parse flags */
-      while (*p == '0' || *p == '-' || *p == '+' ||
-             *p == ' ' || *p == '#' || *p == '\'') {
-        switch (*p) {
-        case '0': zero_padding = 1; break;
-        case '-': justify_left = 1; break;
-        case '+': force_sign = 1; space_for_positive = 0; break;
-        case ' ': force_sign = 1;
-     /* If both the ' ' and '+' flags appear, the ' ' flag should be ignored */
-#ifdef PERL_COMPATIBLE
-     /* ... but in Perl the last of ' ' and '+' applies */
-                  space_for_positive = 1;
-#endif
-                  break;
-        case '#': alternate_form = 1; break;
-        case '\'': break;
-        }
-        p++;
-      }
-   /* If the '0' and '-' flags both appear, the '0' flag should be ignored. */
-
-   /* parse field width */
-      if (*p == '*') {
-        int j;
-        p++; j = va_arg(ap, int);
-        if (j >= 0) min_field_width = j;
-        else { min_field_width = -j; justify_left = 1; }
-      } else if (isdigit((int)(*p))) {
-        /* size_t could be wider than unsigned int;
-           make sure we treat argument like common implementations do */
-        unsigned int uj = *p++ - '0';
-        while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
-        min_field_width = uj;
-      }
-   /* parse precision */
-      if (*p == '.') {
-        p++; precision_specified = 1;
-        if (*p == '*') {
-          int j = va_arg(ap, int);
-          p++;
-          if (j >= 0) precision = j;
-          else {
-            precision_specified = 0; precision = 0;
-         /* NOTE:
-          *   Solaris 2.6 man page claims that in this case the precision
-          *   should be set to 0.  Digital Unix 4.0, HPUX 10 and BSD man page
-          *   claim that this case should be treated as unspecified precision,
-          *   which is what we do here.
-          */
-          }
-        } else if (isdigit((int)(*p))) {
-          /* size_t could be wider than unsigned int;
-             make sure we treat argument like common implementations do */
-          unsigned int uj = *p++ - '0';
-          while (isdigit((int)(*p))) uj = 10*uj + (unsigned int)(*p++ - '0');
-          precision = uj;
-        }
-      }
-   /* parse 'h', 'l' and 'll' length modifiers */
-      if (*p == 'h' || *p == 'l') {
-        length_modifier = *p; p++;
-        if (length_modifier == 'l' && *p == 'l') {   /* double l = long long */
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          length_modifier = '2';                  /* double l encoded as '2' */
-#else
-          length_modifier = 'l';                 /* treat it as a single 'l' */
-#endif
-          p++;
-        }
-      }
-      fmt_spec = *p;
-   /* common synonyms: */
-      switch (fmt_spec) {
-      case 'i': fmt_spec = 'd'; break;
-      case 'D': fmt_spec = 'd'; length_modifier = 'l'; break;
-      case 'U': fmt_spec = 'u'; length_modifier = 'l'; break;
-      case 'O': fmt_spec = 'o'; length_modifier = 'l'; break;
-      default: break;
-      }
-   /* get parameter value, do initial processing */
-      switch (fmt_spec) {
-      case '%': /* % behaves similar to 's' regarding flags and field widths */
-      case 'c': /* c behaves similar to 's' regarding flags and field widths */
-      case 's':
-        length_modifier = '\0';          /* wint_t and wchar_t not supported */
-     /* the result of zero padding flag with non-numeric conversion specifier*/
-     /* is undefined. Solaris and HPUX 10 does zero padding in this case,    */
-     /* Digital Unix and Linux does not. */
-#if !defined(SOLARIS_COMPATIBLE) && !defined(HPUX_COMPATIBLE)
-        zero_padding = 0;    /* turn zero padding off for string conversions */
-#endif
-        str_arg_l = 1;
-        switch (fmt_spec) {
-        case '%':
-          str_arg = p; break;
-        case 'c': {
-          int j = va_arg(ap, int);
-          uchar_arg = (unsigned char) j;   /* standard demands unsigned char */
-          str_arg = (const char *) &uchar_arg;
-          break;
-        }
-        case 's':
-          str_arg = va_arg(ap, const char *);
-          if (!str_arg) str_arg_l = 0;
-       /* make sure not to address string beyond the specified precision !!! */
-          else if (!precision_specified) str_arg_l = strlen(str_arg);
-       /* truncate string if necessary as requested by precision */
-          else if (precision == 0) str_arg_l = 0;
-          else {
-       /* memchr on HP does not like n > 2^31  !!! */
-            const char *q = memchr(str_arg, '\0',
-                             precision <= 0x7fffffff ? precision : 0x7fffffff);
-            str_arg_l = !q ? precision : (q-str_arg);
-          }
-          break;
-        default: break;
-        }
-        break;
-      case 'd': case 'u': case 'o': case 'x': case 'X': case 'p': {
-        /* NOTE: the u, o, x, X and p conversion specifiers imply
-                 the value is unsigned;  d implies a signed value */
-
-        int arg_sign = 0;
-          /* 0 if numeric argument is zero (or if pointer is NULL for 'p'),
-            +1 if greater than zero (or nonzero for unsigned arguments),
-            -1 if negative (unsigned argument is never negative) */
-
-        int int_arg = 0;  unsigned int uint_arg = 0;
-          /* only defined for length modifier h, or for no length modifiers */
-
-        long int long_arg = 0;  unsigned long int ulong_arg = 0;
-          /* only defined for length modifier l */
-
-        void *ptr_arg = NULL;
-          /* pointer argument value -only defined for p conversion */
-
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-        long long int long_long_arg = 0;
-        unsigned long long int ulong_long_arg = 0;
-          /* only defined for length modifier ll */
-#endif
-        if (fmt_spec == 'p') {
-        /* HPUX 10: An l, h, ll or L before any other conversion character
-         *   (other than d, i, u, o, x, or X) is ignored.
-         * Digital Unix:
-         *   not specified, but seems to behave as HPUX does.
-         * Solaris: If an h, l, or L appears before any other conversion
-         *   specifier (other than d, i, u, o, x, or X), the behavior
-         *   is undefined. (Actually %hp converts only 16-bits of address
-         *   and %llp treats address as 64-bit data which is incompatible
-         *   with (void *) argument on a 32-bit system).
-         */
-#ifdef SOLARIS_COMPATIBLE
-#  ifdef SOLARIS_BUG_COMPATIBLE
-          /* keep length modifiers even if it represents 'll' */
-#  else
-          if (length_modifier == '2') length_modifier = '\0';
-#  endif
-#else
-          length_modifier = '\0';
-#endif
-          ptr_arg = va_arg(ap, void *);
-          if (ptr_arg != NULL) arg_sign = 1;
-        } else if (fmt_spec == 'd') {  /* signed */
-          switch (length_modifier) {
-          case '\0':
-          case 'h':
-         /* It is non-portable to specify a second argument of char or short
-          * to va_arg, because arguments seen by the called function
-          * are not char or short.  C converts char and short arguments
-          * to int before passing them to a function.
-          */
-            int_arg = va_arg(ap, int);
-            if      (int_arg > 0) arg_sign =  1;
-            else if (int_arg < 0) arg_sign = -1;
-            break;
-          case 'l':
-            long_arg = va_arg(ap, long int);
-            if      (long_arg > 0) arg_sign =  1;
-            else if (long_arg < 0) arg_sign = -1;
-            break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          case '2':
-            long_long_arg = va_arg(ap, long long int);
-            if      (long_long_arg > 0) arg_sign =  1;
-            else if (long_long_arg < 0) arg_sign = -1;
-            break;
-#endif
-          }
-        } else {  /* unsigned */
-          switch (length_modifier) {
-          case '\0':
-          case 'h':
-            uint_arg = va_arg(ap, unsigned int);
-            if (uint_arg) arg_sign = 1;
-            break;
-          case 'l':
-            ulong_arg = va_arg(ap, unsigned long int);
-            if (ulong_arg) arg_sign = 1;
-            break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-          case '2':
-            ulong_long_arg = va_arg(ap, unsigned long long int);
-            if (ulong_long_arg) arg_sign = 1;
-            break;
-#endif
-          }
-        }
-        str_arg = tmp; str_arg_l = 0;
-     /* NOTE:
-      *   For d, i, u, o, x, and X conversions, if precision is specified,
-      *   the '0' flag should be ignored. This is so with Solaris 2.6,
-      *   Digital UNIX 4.0, HPUX 10, Linux, FreeBSD, NetBSD; but not with Perl.
-      */
-#ifndef PERL_COMPATIBLE
-        if (precision_specified) zero_padding = 0;
-#endif
-        if (fmt_spec == 'd') {
-          if (force_sign && arg_sign >= 0)
-            tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
-         /* leave negative numbers for sprintf to handle,
-            to avoid handling tricky cases like (short int)(-32768) */
-#ifdef LINUX_COMPATIBLE
-        } else if (fmt_spec == 'p' && force_sign && arg_sign > 0) {
-          tmp[str_arg_l++] = space_for_positive ? ' ' : '+';
-#endif
-        } else if (alternate_form) {
-          if (arg_sign != 0 && (fmt_spec == 'x' || fmt_spec == 'X') )
-            { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = fmt_spec; }
-         /* alternate form should have no effect for p conversion, but ... */
-#ifdef HPUX_COMPATIBLE
-          else if (fmt_spec == 'p'
-         /* HPUX 10: for an alternate form of p conversion,
-          *          a nonzero result is prefixed by 0x. */
-#ifndef HPUX_BUG_COMPATIBLE
-         /* Actually it uses 0x prefix even for a zero value. */
-                   && arg_sign != 0
-#endif
-                  ) { tmp[str_arg_l++] = '0'; tmp[str_arg_l++] = 'x'; }
-#endif
-        }
-        zero_padding_insertion_ind = str_arg_l;
-        if (!precision_specified) precision = 1;   /* default precision is 1 */
-        if (precision == 0 && arg_sign == 0
-#if defined(HPUX_BUG_COMPATIBLE) || defined(LINUX_COMPATIBLE)
-            && fmt_spec != 'p'
-         /* HPUX 10 man page claims: With conversion character p the result of
-          * converting a zero value with a precision of zero is a null string.
-          * Actually HP returns all zeroes, and Linux returns "(nil)". */
-#endif
-        ) {
-         /* converted to null string */
-         /* When zero value is formatted with an explicit precision 0,
-            the resulting formatted string is empty (d, i, u, o, x, X, p).   */
-        } else {
-          char f[5]; int f_l = 0;
-          f[f_l++] = '%';    /* construct a simple format string for sprintf */
-          if (!length_modifier) { }
-          else if (length_modifier=='2') { f[f_l++] = 'l'; f[f_l++] = 'l'; }
-          else f[f_l++] = length_modifier;
-          f[f_l++] = fmt_spec; f[f_l++] = '\0';
-          if (fmt_spec == 'p') str_arg_l += sprintf(tmp+str_arg_l, f, ptr_arg);
-          else if (fmt_spec == 'd') {  /* signed */
-            switch (length_modifier) {
-            case '\0':
-            case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, int_arg);  break;
-            case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, long_arg); break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-            case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,long_long_arg); break;
-#endif
-            }
-          } else {  /* unsigned */
-            switch (length_modifier) {
-            case '\0':
-            case 'h': str_arg_l+=sprintf(tmp+str_arg_l, f, uint_arg);  break;
-            case 'l': str_arg_l+=sprintf(tmp+str_arg_l, f, ulong_arg); break;
-#ifdef SNPRINTF_LONGLONG_SUPPORT
-            case '2': str_arg_l+=sprintf(tmp+str_arg_l,f,ulong_long_arg);break;
-#endif
-            }
-          }
-         /* include the optional minus sign and possible "0x"
-            in the region before the zero padding insertion point */
-          if (zero_padding_insertion_ind < str_arg_l &&
-              tmp[zero_padding_insertion_ind] == '-') {
-            zero_padding_insertion_ind++;
-          }
-          if (zero_padding_insertion_ind+1 < str_arg_l &&
-              tmp[zero_padding_insertion_ind]   == '0' &&
-             (tmp[zero_padding_insertion_ind+1] == 'x' ||
-              tmp[zero_padding_insertion_ind+1] == 'X') ) {
-            zero_padding_insertion_ind += 2;
-          }
-        }
-        { size_t num_of_digits = str_arg_l - zero_padding_insertion_ind;
-          if (alternate_form && fmt_spec == 'o'
-#ifdef HPUX_COMPATIBLE                                  /* ("%#.o",0) -> ""  */
-              && (str_arg_l > 0)
-#endif
-#ifdef DIGITAL_UNIX_BUG_COMPATIBLE                      /* ("%#o",0) -> "00" */
-#else
-              /* unless zero is already the first character */
-              && !(zero_padding_insertion_ind < str_arg_l
-                   && tmp[zero_padding_insertion_ind] == '0')
-#endif
-          ) {        /* assure leading zero for alternate-form octal numbers */
-            if (!precision_specified || precision < num_of_digits+1) {
-             /* precision is increased to force the first character to be zero,
-                except if a zero value is formatted with an explicit precision
-                of zero */
-              precision = num_of_digits+1; precision_specified = 1;
-            }
-          }
-       /* zero padding to specified precision? */
-          if (num_of_digits < precision) 
-            number_of_zeros_to_pad = precision - num_of_digits;
-        }
-     /* zero padding to specified minimal field width? */
-        if (!justify_left && zero_padding) {
-          int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-          if (n > 0) number_of_zeros_to_pad += n;
-        }
-        break;
-      }
-      default: /* unrecognized conversion specifier, keep format string as-is*/
-        zero_padding = 0;  /* turn zero padding off for non-numeric convers. */
-#ifndef DIGITAL_UNIX_COMPATIBLE
-        justify_left = 1; min_field_width = 0;                /* reset flags */
-#endif
-#if defined(PERL_COMPATIBLE) || defined(LINUX_COMPATIBLE)
-     /* keep the entire format string unchanged */
-        str_arg = starting_p; str_arg_l = p - starting_p;
-     /* well, not exactly so for Linux, which does something inbetween,
-      * and I don't feel an urge to imitate it: "%+++++hy" -> "%+y"  */
-#else
-     /* discard the unrecognized conversion, just keep *
-      * the unrecognized conversion character          */
-        str_arg = p; str_arg_l = 0;
-#endif
-        if (*p) str_arg_l++;  /* include invalid conversion specifier unchanged
-                                 if not at end-of-string */
-        break;
-      }
-      if (*p) p++;      /* step over the just processed conversion specifier */
-   /* insert padding to the left as requested by min_field_width;
-      this does not include the zero padding in case of numerical conversions*/
-      if (!justify_left) {                /* left padding with blank or zero */
-        int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, (zero_padding?'0':' '), (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* zero padding as requested by the precision or by the minimal field width
-    * for numeric conversions required? */
-      if (number_of_zeros_to_pad <= 0) {
-     /* will not copy first part of numeric right now, *
-      * force it to be copied later in its entirety    */
-        zero_padding_insertion_ind = 0;
-      } else {
-     /* insert first part of numerics (sign or '0x') before zero padding */
-        int n = zero_padding_insertion_ind;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memcpy(str+str_l, str_arg, (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-     /* insert zero padding as requested by the precision or min field width */
-        n = number_of_zeros_to_pad;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, '0', (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* insert formatted string
-    * (or as-is conversion specifier for unknown conversions) */
-      { int n = str_arg_l - zero_padding_insertion_ind;
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memcpy(str+str_l, str_arg+zero_padding_insertion_ind,
-                        (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-   /* insert right padding */
-      if (justify_left) {          /* right blank padding to the field width */
-        int n = min_field_width - (str_arg_l+number_of_zeros_to_pad);
-        if (n > 0) {
-          if (str_l < str_m) {
-            size_t avail = str_m-str_l;
-            fast_memset(str+str_l, ' ', (n>avail?avail:n));
-          }
-          str_l += n;
-        }
-      }
-    }
-  }
-#if defined(NEED_SNPRINTF_ONLY)
-  va_end(ap);
-#endif
-  if (str_m > 0) { /* make sure the string is null-terminated
-                      even at the expense of overwriting the last character
-                      (shouldn't happen, but just in case) */
-    str[str_l <= str_m-1 ? str_l : str_m-1] = '\0';
-  }
-  /* Return the number of characters formatted (excluding trailing null
-   * character), that is, the number of characters that would have been
-   * written to the buffer if it were large enough.
-   *
-   * The value of str_l should be returned, but str_l is of unsigned type
-   * size_t, and snprintf is int, possibly leading to an undetected
-   * integer overflow, resulting in a negative return value, which is illegal.
-   * Both XSH5 and ISO C99 (at least the draft) are silent on this issue.
-   * Should errno be set to EOVERFLOW and EOF returned in this case???
-   */
-  return (int) str_l;
-}
-#endif
-#endif /* __OS2__ */
 /*
   Local Variables:
   tab-width: 3
index 4e0b264..2638be9 100644 (file)
@@ -1,6 +1,6 @@
-#ifndef MISCUTIL_H_INCLUDED
-#define MISCUTIL_H_INCLUDED
-#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.19 2002/03/24 13:25:43 swa Exp $"
+#ifndef _MISCUTIL_H
+#define _MISCUTIL_H
+#define MISCUTIL_H_VERSION "$Id: miscutil.h,v 1.7 2001/06/05 22:32:01 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/miscutil.h,v $
@@ -11,7 +11,7 @@
  *                really fit in any other file.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: miscutil.h,v $
- *    Revision 1.19  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.18  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.17  2002/03/04 18:28:32  oes
- *    Deleted deletePidFile, played syleguide police
- *
- *    Revision 1.16  2002/01/21 00:53:36  jongfoster
- *    Adding string_join()
- *
- *    Revision 1.15  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.14  2001/11/05 21:43:48  steudten
- *    Add global var 'basedir' for unix os.
- *
- *    Revision 1.13  2001/10/29 03:48:10  david__schmidt
- *    OS/2 native needed a snprintf() routine.  Added one to miscutil, brackedted
- *    by and __OS2__ ifdef.
- *
- *    Revision 1.12  2001/10/23 21:27:50  jongfoster
- *    Standardising error codes in string_append
- *    make_path() no longer adds '\\' if the dir already ends in '\\' (this
- *    is just copying a UNIX-specific fix to the Windows-specific part)
- *
- *    Revision 1.11  2001/10/14 22:02:57  jongfoster
- *    New function string_append() which is like strsav(), but running
- *    out of memory isn't automatically FATAL.
- *
- *    Revision 1.10  2001/09/20 13:34:09  steudten
- *
- *    change long to int for prototype hash_string()
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/06/29 13:32:14  oes
- *    Removed logentry from cancelled commit
- *
  *    Revision 1.7  2001/06/05 22:32:01  jongfoster
  *    New function make_path() to splice directory and file names together.
  *
  *********************************************************************/
 \f
 
-#include "project.h"
-
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
-extern const char *basedir;
-extern void *zalloc(size_t size);
+extern void *zalloc(int size);
 
-#if defined(unix)
-extern void write_pid_file(void);
-#endif /* unix */
-
-extern unsigned int hash_string(const char* s);
+extern unsigned long hash_string(const char* s);
 
 extern char *safe_strerror(int err);
 
@@ -155,13 +101,11 @@ extern int strcmpic(const char *s1, const char *s2);
 extern int strncmpic(const char *s1, const char *s2, size_t n);
 
 extern char *strsav(char *old, const char *text_to_append);
-extern jb_err string_append(char **target_string, const char *text_to_append);
-extern jb_err string_join  (char **target_string,       char *text_to_append);
 
 extern char *chomp(char *string);
 extern int simplematch(char *pattern, char *text);
 
-extern char *bindup(const char *string, size_t len);
+extern char *bindup(const char *string, int n);
 
 extern char *make_path(const char * dir, const char * file);
 
@@ -169,10 +113,6 @@ extern char *make_path(const char * dir, const char * file);
 extern char *strdup(const char *s);
 #endif /* def __MINGW32__ */
 
-#ifdef __OS2__
-extern int snprintf(char *, size_t, const char *, /*args*/ ...);
-#endif /* def __OS2__ */
-
 /* Revision control strings from this header and associated .c file */
 extern const char miscutil_rcs[];
 extern const char miscutil_h_rcs[];
@@ -181,7 +121,7 @@ extern const char miscutil_h_rcs[];
 }
 #endif
 
-#endif /* ndef MISCUTIL_H_INCLUDED */
+#endif /* ndef _MISCUTIL_H */
 
 /*
   Local Variables:
index 6129e0e..2b2043c 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -1,4 +1,4 @@
-const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.16 2001/06/29 13:32:42 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.c,v $
@@ -10,17 +10,18 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *                   `client_uagent', `client_x_forwarded',
  *                   `client_x_forwarded_adder', `client_xtra_adder',
  *                   `content_type', `crumble', `destroy_list', `enlist',
- *                   `flush_socket', ``get_header', `sed',
+ *                   `flush_socket', `free_http_request', `get_header',
+ *                   `list_to_text', `parse_http_request', `sed',
  *                   and `server_set_cookie'.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
@@ -40,189 +41,6 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *
  * Revisions   :
  *    $Log: parsers.c,v $
- *    Revision 1.52  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.51  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.50  2002/03/12 01:45:35  oes
- *    More verbose logging
- *
- *    Revision 1.49  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.48  2002/03/07 03:46:53  oes
- *    Fixed compiler warnings etc
- *
- *    Revision 1.47  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.46  2002/01/17 21:03:47  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.45  2002/01/09 14:33:03  oes
- *    Added support for localtime_r.
- *
- *    Revision 1.44  2001/12/14 01:22:54  steudten
- *    Remove 'user:pass@' from 'proto://user:pass@host' for the
- *    new added header 'Host: ..'. (See Req ID 491818)
- *
- *    Revision 1.43  2001/11/23 00:26:38  jongfoster
- *    Fixing two really stupid errors in my previous commit
- *
- *    Revision 1.42  2001/11/22 21:59:30  jongfoster
- *    Adding code to handle +no-cookies-keep
- *
- *    Revision 1.41  2001/11/05 23:43:05  steudten
- *    Add time+date to log files.
- *
- *    Revision 1.40  2001/10/26 20:13:09  jongfoster
- *    ctype.h is needed in Windows, too.
- *
- *    Revision 1.39  2001/10/26 17:40:04  oes
- *    Introduced get_header_value()
- *    Removed http->user_agent, csp->referrer and csp->accept_types
- *    Removed client_accept()
- *
- *    Revision 1.38  2001/10/25 03:40:48  david__schmidt
- *    Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
- *    threads to call select() simultaneously.  So, it's time to do a real, live,
- *    native OS/2 port.  See defines for __EMX__ (the porting layer) vs. __OS2__
- *    (native). Both versions will work, but using __OS2__ offers multi-threading.
- *
- *    Revision 1.37  2001/10/23 21:36:02  jongfoster
- *    Documenting sed()'s error behaviou (doc change only)
- *
- *    Revision 1.36  2001/10/13 12:51:51  joergs
- *    Removed client_host, (was only required for the old 2.0.2-11 http://noijb.
- *    force-load), instead crumble Host: and add it (again) in client_host_adder
- *    (in case we get a HTTP/1.0 request without Host: header and forward it to
- *    a HTTP/1.1 server/proxy).
- *
- *    Revision 1.35  2001/10/09 22:39:21  jongfoster
- *    assert.h is also required under Win32, so moving out of #ifndef _WIN32
- *    block.
- *
- *    Revision 1.34  2001/10/07 18:50:55  oes
- *    Added server_content_encoding, renamed server_transfer_encoding
- *
- *    Revision 1.33  2001/10/07 18:04:49  oes
- *    Changed server_http11 to server_http and its pattern to "HTTP".
- *      Additional functionality: it now saves the HTTP status into
- *      csp->http->status and sets CT_TABOO for Status 206 (partial range)
- *
- *    Revision 1.32  2001/10/07 15:43:28  oes
- *    Removed FEATURE_DENY_GZIP and replaced it with client_accept_encoding,
- *       client_te and client_accept_encoding_adder, triggered by the new
- *       +no-compression action. For HTTP/1.1 the Accept-Encoding header is
- *       changed to allow only identity and chunked, and the TE header is
- *       crunched. For HTTP/1.0, Accept-Encoding is crunched.
- *
- *    parse_http_request no longer does anything than parsing. The rewriting
- *      of http->cmd and version mangling are gone. It now also recognizes
- *      the put and delete methods and saves the url in http->url. Removed
- *      unused variable.
- *
- *    renamed content_type and content_length to have the server_ prefix
- *
- *    server_content_type now only works if csp->content_type != CT_TABOO
- *
- *    added server_transfer_encoding, which
- *      - Sets CT_TABOO to prohibit filtering if encoding compresses
- *      - Raises the CSP_FLAG_CHUNKED flag if Encoding is "chunked"
- *      - Change from "chunked" to "identity" if body was chunked
- *        but has been de-chunked for filtering.
- *
- *    added server_content_md5 which crunches any Content-MD5 headers
- *      if the body was modified.
- *
- *    made server_http11 conditional on +downgrade action
- *
- *    Replaced 6 boolean members of csp with one bitmap (csp->flags)
- *
- *    Revision 1.31  2001/10/05 14:25:02  oes
- *    Crumble Keep-Alive from Server
- *
- *    Revision 1.30  2001/09/29 12:56:03  joergs
- *    IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers.
- *
- *    Revision 1.29  2001/09/24 21:09:24  jongfoster
- *    Fixing 2 memory leaks that Guy spotted, where the paramater to
- *    enlist() was not being free()d.
- *
- *    Revision 1.28  2001/09/22 16:32:28  jongfoster
- *    Removing unused #includes.
- *
- *    Revision 1.27  2001/09/20 15:45:25  steudten
- *
- *    add casting from size_t to int for printf()
- *    remove local variable shadow s2
- *
- *    Revision 1.26  2001/09/16 17:05:14  jongfoster
- *    Removing unused #include showarg.h
- *
- *    Revision 1.25  2001/09/16 13:21:27  jongfoster
- *    Changes to use new list functions.
- *
- *    Revision 1.24  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.23  2001/09/12 18:08:19  steudten
- *
- *    In parse_http_request() header rewriting miss the host value, so
- *    from http://www.mydomain.com the result was just " / " not
- *    http://www.mydomain.com/ in case we forward.
- *
- *    Revision 1.22  2001/09/10 10:58:53  oes
- *    Silenced compiler warnings
- *
- *    Revision 1.21  2001/07/31 14:46:00  oes
- *     - Persistant connections now suppressed
- *     - sed() no longer appends empty header to csp->headers
- *
- *    Revision 1.20  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.19  2001/07/25 17:21:54  oes
- *    client_uagent now saves copy of User-Agent: header value
- *
- *    Revision 1.18  2001/07/13 14:02:46  oes
- *     - Included fix to repair broken HTTP requests that
- *       don't contain a path, not even '/'.
- *     - Removed all #ifdef PCRS
- *     - content_type now always inspected and classified as
- *       text, gif or other.
- *     - formatting / comments
- *
- *    Revision 1.17  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.16  2001/06/29 13:32:42  oes
  *    - Fixed a comment
  *    - Adapted free_http_request
@@ -245,7 +63,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
  *    CRLF -> LF
  *
  *    Revision 1.11  2001/05/29 20:11:19  joergs
- *    '/ * inside comment' warning removed.
+ *    '/* inside comment' warning removed.
  *
  *    Revision 1.10  2001/05/29 09:50:24  jongfoster
  *    Unified blocklist/imagelist/permissionslist.
@@ -371,17 +189,13 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
 
 #include "config.h"
 
-#ifndef _WIN32
 #include <stdio.h>
 #include <sys/types.h>
-#endif
-
 #include <stdlib.h>
 #include <ctype.h>
-#include <assert.h>
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#ifndef _WIN32
 #include <unistd.h>
 #endif
 
@@ -389,11 +203,15 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.52 2002/03/24 13:25:43 swa Exp $"
 #include "list.h"
 #include "parsers.h"
 #include "encode.h"
+#include "filters.h"
+#include "loaders.h"
+#include "showargs.h"
+#include "jcc.h"
 #include "ssplit.h"
 #include "errlog.h"
 #include "jbsockets.h"
 #include "miscutil.h"
-#include "list.h"
+#include "cgi.h"
 
 const char parsers_h_rcs[] = PARSERS_H_VERSION;
 
@@ -403,8 +221,8 @@ const char parsers_h_rcs[] = PARSERS_H_VERSION;
  * as an array index.  Therefore we need to make sure that high-bit
  * characters generate +ve values, and ideally we also want to make
  * the argument match the declared parameter type of "int".
- *
- * Why did they write a character function that can't take a simple
+ * 
+ * Why did they write a character function that can't take a simple 
  * "char" argument?  Doh!
  */
 #define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
@@ -418,44 +236,43 @@ const struct parsers client_patterns[] = {
    { "from:",                    5,    client_from },
    { "cookie:",                  7,    client_send_cookie },
    { "x-forwarded-for:",         16,   client_x_forwarded },
-   { "Accept-Encoding:",         16,   client_accept_encoding },
-   { "TE:",                      3,    client_te },
-   { "Host:",                     5,   crumble },
-/* { "if-modified-since:",       18,   crumble }, */
-   { "Keep-Alive:",              11,   crumble },
-   { "connection:",              11,   crumble },
    { "proxy-connection:",        17,   crumble },
+#ifdef DENY_GZIP
+   { "Accept-Encoding: gzip",    21,   crumble },
+#endif /* def DENY_GZIP */
+#if defined(DETECT_MSIE_IMAGES)
+   { "Accept:",                   7,   client_accept },
+#endif /* defined(DETECT_MSIE_IMAGES) */
+#ifdef FORCE_LOAD
+   { "Host:",                     5,   client_host },
+#endif /* def FORCE_LOAD */
+/* { "if-modified-since:",       18,   crumble }, */
    { NULL,                       0,    NULL }
 };
 
 
 const struct parsers server_patterns[] = {
-   { "HTTP",                4, server_http },
    { "set-cookie:",        11, server_set_cookie },
    { "connection:",        11, crumble },
-   { "Content-Type:",      13, server_content_type },
-   { "Content-Length:",    15, server_content_length },
-   { "Content-MD5:",       12, server_content_md5 },
-   { "Content-Encoding:",  17, server_content_encoding },
-   { "Transfer-Encoding:", 18, server_transfer_coding },
-   { "Keep-Alive:",        11, crumble },
+#if defined(PCRS) || defined(KILLPOPUPS)
+   { "Content-Type:",      13, content_type },
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+#ifdef PCRS
+   { "Content-Length:",    15, content_length },
+#endif /* def PCRS */
    { NULL, 0, NULL }
 };
 
 
-const add_header_func_ptr add_client_headers[] = {
-   client_host_adder,
+void (* const add_client_headers[])(struct client_state *) = {
    client_cookie_adder,
    client_x_forwarded_adder,
    client_xtra_adder,
-   client_accept_encoding_adder,
-   connection_close_adder,
    NULL
 };
 
 
-const add_header_func_ptr add_server_headers[] = {
-   connection_close_adder,
+void (* const add_server_headers[])(struct client_state *) = {
    NULL
 };
 
@@ -478,22 +295,19 @@ const add_header_func_ptr add_server_headers[] = {
  *                file, the results are not portable.
  *
  *********************************************************************/
-int flush_socket(jb_socket fd, struct client_state *csp)
+int flush_socket(int fd, struct client_state *csp)
 {
    struct iob *iob = csp->iob;
-   int len = iob->eod - iob->cur;
+   int n = iob->eod - iob->cur;
 
-   if (len <= 0)
+   if (n <= 0)
    {
       return(0);
    }
 
-   if (write_socket(fd, iob->cur, (size_t)len))
-   {
-      return(-1);
-   }
+   n = write_socket(fd, iob->cur, n);
    iob->eod = iob->cur = iob->buf;
-   return(len);
+   return(n);
 
 }
 
@@ -509,27 +323,28 @@ int flush_socket(jb_socket fd, struct client_state *csp)
  *          2  :  buf = holds the content to be added to the page
  *          3  :  n = number of bytes to be added
  *
- * Returns     :  None
+ * Returns     :  Number of bytes in the content buffer.
  *
  *********************************************************************/
-void add_to_iob(struct client_state *csp, char *buf, int n)
+int add_to_iob(struct client_state *csp, char *buf, int n)
 {
    struct iob *iob = csp->iob;
-   size_t have, need;
+   int have, need;
    char *p;
 
    have = iob->eod - iob->cur;
 
    if (n <= 0)
    {
-      return;
+      return(have);
    }
 
    need = have + n;
 
    if ((p = (char *)malloc(need + 1)) == NULL)
    {
-      log_error(LOG_LEVEL_FATAL, "malloc() iob failed: %E");
+      log_error(LOG_LEVEL_ERROR, "malloc() iob failed: %E");
+      return(-1);
    }
 
    if (have)
@@ -552,7 +367,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n)
    }
 
    /* copy the new data into the iob buffer */
-   memcpy(p, buf, (size_t)n);
+   memcpy(p, buf, n);
 
    /* point to the end of the data */
    p += n;
@@ -564,7 +379,7 @@ void add_to_iob(struct client_state *csp, char *buf, int n)
    iob->cur = iob->buf;
    iob->eod = p;
 
-   return;
+   return(need);
 
 }
 
@@ -601,15 +416,10 @@ char *get_header(struct client_state *csp)
    *p = '\0';
 
    ret = strdup(iob->cur);
-   if (ret == NULL)
-   {
-      /* FIXME No way to handle error properly */
-      log_error(LOG_LEVEL_FATAL, "Out of memory in get_header()");
-   }
 
    iob->cur = p+1;
 
-   if ((q = strchr(ret, '\r')) != NULL) *q = '\0';
+   if ((q = strchr(ret, '\r'))) *q = '\0';
 
    /* is this a blank linke (i.e. the end of the header) ? */
    if (*ret == '\0')
@@ -623,56 +433,6 @@ char *get_header(struct client_state *csp)
 }
 
 
-/*********************************************************************
- *
- * Function    :  get_header_value
- *
- * Description :  Get the value of a given header from a chained list
- *                of header lines or return NULL if no such header is
- *                present in the list.
- *
- * Parameters  :
- *          1  :  header_list = pointer to list
- *          2  :  header_name = string with name of header to look for.
- *                              Trailing colon required, capitalization
- *                              doesn't matter.
- *
- * Returns     :  NULL if not found, else value of header
- *
- *********************************************************************/
-char *get_header_value(const struct list *header_list, const char *header_name)
-{
-   struct list_entry *cur_entry;
-   char *ret = NULL;
-   size_t length = 0;
-
-   assert(header_list);
-   assert(header_name);
-   length = strlen(header_name);
-
-   for (cur_entry = header_list->first; cur_entry ; cur_entry = cur_entry->next)
-   {
-      if (cur_entry->str)
-      {
-         if (!strncmpic(cur_entry->str, header_name, length))
-         {
-            /*
-             * Found: return pointer to start of value
-             */
-            ret = (char *) (cur_entry->str + length);
-            while (*ret && ijb_isspace(*ret)) ret++;
-            return(ret);
-         }
-      }
-   }
-
-   /* 
-    * Not found
-    */
-   return NULL;
-
-}
-
 /*********************************************************************
  *
  * Function    :  sed
@@ -691,22 +451,19 @@ char *get_header_value(const struct list *header_list, const char *header_name)
  *                headers (client or server)
  *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  Single pointer to a fully formed header, or NULL
- *                on out-of-memory error.
+ * Returns     :  Single pointer to a fully formed header.
  *
  *********************************************************************/
-char *sed(const struct parsers pats[],
-          const add_header_func_ptr more_headers[],
-          struct client_state *csp)
+char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp)
 {
-   struct list_entry *p;
+   struct list *p;
    const struct parsers *v;
-   const add_header_func_ptr *f;
-   jb_err err = JB_ERR_OK;
+   char *hdr;
+   void (* const *f)();
 
-   for (v = pats; (err == JB_ERR_OK) && (v->str != NULL) ; v++)
+   for (v = pats; v->str ; v++)
    {
-      for (p = csp->headers->first; (err == JB_ERR_OK) && (p != NULL) ; p = p->next)
+      for (p = csp->headers->next; p ; p = p->next)
       {
          /* Header crunch()ed in previous run? -> ignore */
          if (p->str == NULL) continue;
@@ -715,312 +472,295 @@ char *sed(const struct parsers pats[],
 
          if (strncmpic(p->str, v->str, v->len) == 0)
          {
-            err = v->parser(csp, (char **)&(p->str));
+            hdr = v->parser(v, p->str, csp);
+            freez(p->str);
+            p->str = hdr;
          }
       }
    }
 
    /* place any additional headers on the csp->headers list */
-   for (f = more_headers; (err == JB_ERR_OK) && (*f) ; f++)
+   for (f = more_headers; *f ; f++)
    {
-      err = (*f)(csp);
+      (*f)(csp);
    }
 
-   if (err != JB_ERR_OK)
+   /* add the blank line at the end of the header, if necessary */
+   if ( (csp->headers->last == NULL)
+     || (csp->headers->last->str == NULL)
+     || (*csp->headers->last->str != '\0') )
    {
-      return NULL;
+      enlist(csp->headers, "");
    }
 
-   return list_to_text(csp->headers);
-}
+   hdr = list_to_text(csp->headers);
 
+   return(hdr);
 
-/* here begins the family of parser functions that reformat header lines */
+}
 
 
 /*********************************************************************
  *
- * Function    :  crumble
+ * Function    :  free_http_request
  *
- * Description :  This is called if a header matches a pattern to "crunch"
+ * Description :  Freez a http_request structure
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  http = points to a http_request structure to free
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err crumble(struct client_state *csp, char **header)
+void free_http_request(struct http_request *http)
 {
-   log_error(LOG_LEVEL_HEADER, "crunch!");
-   freez(*header);
-   return JB_ERR_OK;
+   freez(http->cmd);
+   freez(http->gpc);
+   freez(http->host);
+   freez(http->hostport);
+   freez(http->path);
+   freez(http->ver);
+   freez(http->host_ip_addr_str);
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  server_content_type
+ * Function    :  parse_http_request
  *
- * Description :  Set the content-type for filterable types (text/.*,
- *                javascript and image/gif) unless filtering has been
- *                forbidden (CT_TABOO) while parsing earlier headers.
+ * Description :  Parse out the host and port from the URL.  Find the
+ *                hostname & path, port (if ':'), and/or password (if '@')
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  req = URL (or is it URI?) to break down
+ *          2  :  http = pointer to the http structure to hold elements
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err server_content_type(struct client_state *csp, char **header)
+void parse_http_request(char *req, struct http_request *http, struct client_state *csp)
 {
-   if (csp->content_type != CT_TABOO)
-   {
-      if (strstr(*header, " text/")
-       || strstr(*header, "application/x-javascript"))
-         csp->content_type = CT_TEXT;
-      else if (strstr(*header, " image/gif"))
-         csp->content_type = CT_GIF;
-      else
-         csp->content_type = 0;
-   }
+   char *buf, *v[10], *url, *p;
+   int n;
 
-   return JB_ERR_OK;
-}
+   memset(http, '\0', sizeof(*http));
 
+   http->cmd = strdup(req);
 
-/*********************************************************************
- *
- * Function    :  server_transfer_coding
- *
- * Description :  - Prohibit filtering (CT_TABOO) if transfer coding compresses
- *                - Raise the CSP_FLAG_CHUNKED flag if coding is "chunked"
- *                - Change from "chunked" to "identity" if body was chunked
- *                  but has been de-chunked for filtering.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_transfer_coding(struct client_state *csp, char **header)
-{
-   /*
-    * Turn off pcrs and gif filtering if body compressed
-    */
-   if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate"))
-   {
-      csp->content_type = CT_TABOO;
-   }
+   buf = strdup(req);
 
-   /*
-    * Raise flag if body chunked
-    */
-   if (strstr(*header, "chunked"))
+   n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
+
+   if (n == 3)
    {
-      csp->flags |= CSP_FLAG_CHUNKED;
+      /* this could be a CONNECT request */
+      if (strcmpic(v[0], "connect") == 0)
+      {
+         http->ssl      = 1;
+         http->gpc      = strdup(v[0]);
+         http->hostport = strdup(v[1]);
+         http->ver      = strdup(v[2]);
+      }
 
-      /*
-       * If the body was modified, it has been
-       * de-chunked first, so adjust the header:
-       */
-      if (csp->flags & CSP_FLAG_MODIFIED)
+#ifdef WEBDAV
+
+/* This next line is a little ugly, but it simplifies the if statement below. */
+/* Basically if using webDAV, we want the OR condition to use these too.      */
+
+/*
+ * by haroon
+ * These are the headers as defined in RFC2518 to add webDAV support
+ */
+
+#define OR_WEBDAV || \
+         (0 == strcmpic(v[0], "propfind")) || \
+         (0 == strcmpic(v[0], "proppatch")) || \
+         (0 == strcmpic(v[0], "move")) || \
+         (0 == strcmpic(v[0], "copy")) || \
+         (0 == strcmpic(v[0], "mkcol")) || \
+         (0 == strcmpic(v[0], "lock")) || \
+         (0 == strcmpic(v[0], "unlock"))
+
+#else /* No webDAV support is enabled.  Provide an empty OR_WEBDAV macro. */
+
+#define OR_WEBDAV
+
+#endif
+
+      /* or it could be a GET or a POST (possibly webDAV too) */
+      if ((strcmpic(v[0], "get")  == 0) ||
+          (strcmpic(v[0], "head") == 0) OR_WEBDAV ||
+          (strcmpic(v[0], "post") == 0))
       {
-         freez(*header);
-         *header = strdup("Transfer-Encoding: identity");
-         return (header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+         http->ssl      = 0;
+         http->gpc      = strdup(v[0]);
+         url            = v[1];
+         http->ver      = strdup(v[2]);
+
+         if (strncmpic(url, "http://",  7) == 0)
+         {
+            url += 7;
+         }
+         else if (strncmpic(url, "https://", 8) == 0)
+         {
+            url += 8;
+         }
+         else
+         {
+            url = NULL;
+         }
+
+         if (url && (p = strchr(url, '/')))
+         {
+            http->path = strdup(p);
+            *p = '\0';
+            http->hostport = strdup(url);
+         }
       }
    }
 
-   return JB_ERR_OK;
-}
+   freez(buf);
 
 
-/*********************************************************************
- *
- * Function    :  server_content_encoding
- *
- * Description :  Prohibit filtering (CT_TABOO) if content encoding compresses
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_content_encoding(struct client_state *csp, char **header)
-{
-   /*
-    * Turn off pcrs and gif filtering if body compressed
-    */
-   if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate"))
+   if (http->hostport == NULL)
    {
-      csp->content_type = CT_TABOO;
+      free_http_request(http);
+      return;
    }
 
-   return JB_ERR_OK;
+   buf = strdup(http->hostport);
 
-}
 
+   /* check if url contains password */
+   n = ssplit(buf, "@", v, SZ(v), 1, 1);
+   if (n == 2)
+   {
+      char * newbuf = NULL;
+      newbuf = strdup(v[1]);
+      freez(buf);
+      buf = newbuf;
+   }
+
+   n = ssplit(buf, ":", v, SZ(v), 1, 1);
 
-/*********************************************************************
- *
- * Function    :  server_content_length
- *
- * Description :  Adjust Content-Length header if we modified
- *                the body.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err server_content_length(struct client_state *csp, char **header)
-{
-   if (csp->content_length != 0) /* Content length has been modified */
+   if (n == 1)
    {
-      freez(*header);
-      *header = (char *) zalloc(100);
-      if (*header == NULL)
-      {
-         return JB_ERR_MEMORY;
-      }
+      http->host = strdup(v[0]);
+      http->port = 80;
+   }
+
+   if (n == 2)
+   {
+      http->host = strdup(v[0]);
+      http->port = atoi(v[1]);
+   }
+
+   freez(buf);
 
-      sprintf(*header, "Content-Length: %d", (int) csp->content_length);
+   if (http->host == NULL)
+   {
+      free_http_request(http);
+   }
 
-      log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", (int) csp->content_length);
+   if (http->path == NULL)
+   {
+      http->path = strdup("");
    }
 
-   return JB_ERR_OK;
 }
 
 
+/* here begins the family of parser functions that reformat header lines */
+
+
 /*********************************************************************
  *
- * Function    :  server_content_md5
+ * Function    :  crumble
  *
- * Description :  Crumble any Content-MD5 headers if the document was
- *                modified. FIXME: Should we re-compute instead?
+ * Description :  This is called if a header matches a pattern to "crunch"
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = Pointer to parsers structure, which basically holds
+ *                headers (client or server) that we want to "crunch"
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err server_content_md5(struct client_state *csp, char **header)
+char *crumble(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if (csp->flags & CSP_FLAG_MODIFIED)
-   {
-      log_error(LOG_LEVEL_HEADER, "Crunching Content-MD5");
-      freez(*header);
-   }
+   log_error(LOG_LEVEL_HEADER, "crunch!");
+   return(NULL);
 
-   return JB_ERR_OK;
 }
 
 
+#if defined(PCRS) || defined(KILLPOPUPS)
+
 /*********************************************************************
  *
- * Function    :  client_accept_encoding
+ * Function    :  content_type
  *
- * Description :  Rewrite the client's Accept-Encoding header so that
- *                if doesn't allow compression, if the action applies.
- *                Note: For HTTP/1.0 the absence of the header is enough.
+ * Description :  Is this a text/.* or javascript MIME Type?
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header string we are "considering"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A duplicate string pointer to this header (ie. pass thru)
  *
  *********************************************************************/
-jb_err client_accept_encoding(struct client_state *csp, char **header)
+char *content_type(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
-   {
-      log_error(LOG_LEVEL_HEADER, "Supressed offer to compress content");
+   if (strstr (s, " text/") || strstr (s, "application/x-javascript"))
+      csp->is_text = 1;
+   else
+      csp->is_text = 0;
 
-      freez(*header);
-      if (!strcmpic(csp->http->ver, "HTTP/1.1"))
-      {
-         *header = strdup("Accept-Encoding: identity;q=1.0, *;q=0");
-         if (*header == NULL)
-         {
-            return JB_ERR_MEMORY;
-         }
-      }
-   }
+   return(strdup(s));
 
-   return JB_ERR_OK;
 }
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
 
 
+#ifdef PCRS
 /*********************************************************************
  *
- * Function    :  client_te
+ * Function    :  content_length
  *
- * Description :  Rewrite the client's TE header so that
- *                if doesn't allow compression, if the action applies.
+ * Description :  Adjust Content-Length header if we have 
+ *                filtered this page through PCRS.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header string we are "considering"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A duplicate string pointer to this header (ie. pass thru)
  *
  *********************************************************************/
-jb_err client_te(struct client_state *csp, char **header)
+char *content_length(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
+   if (csp->content_length != 0) /* Content has been modified */
    {
-      freez(*header);
-      log_error(LOG_LEVEL_HEADER, "Supressed offer to compress transfer");
+      s = (char *) zalloc(100);
+      sprintf(s, "Content-Length: %d", csp->content_length);
+       log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
+      return(s);
+   }
+   else
+   {
+      return(strdup(s));
    }
-
-   return JB_ERR_OK;
 }
 
+#endif /* def PCRS */
+
+
 /*********************************************************************
  *
  * Function    :  client_referrer
@@ -1029,81 +769,96 @@ jb_err client_te(struct client_state *csp, char **header)
  *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string with the original
+ *                or modified header
  *
  *********************************************************************/
-jb_err client_referrer(struct client_state *csp, char **header)
+char *client_referrer(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
-
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
    /* Since the referrer can include the prefix even
     * even if the request itself is non-forced, we must
-    * clean it unconditionally
+    * clean it unconditionally 
     */
-   strclean(*header, FORCE_PREFIX);
-#endif /* def FEATURE_FORCE_LOAD */
+   strclean(s, FORCE_PREFIX);
+#endif /* def FORCE_LOAD */
+
+#ifdef TRUST_FILES
+   csp->referrer = strdup(s);
+#endif /* def TRUST_FILES */
 
    /*
     * Are we sending referer?
     */
    if ((csp->action->flags & ACTION_HIDE_REFERER) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
-   freez(*header);
-
    newval = csp->action->string[ACTION_STRING_REFERER];
 
+   /*
+    * Are we blocking referer?
+    */
    if ((newval == NULL) || (0 == strcmpic(newval, "block")) )
    {
-      /*
-       * Blocking referer
-       */
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      return JB_ERR_OK;
+      return(NULL);
    }
-   else if (0 == strncmpic(newval, "http://", 7))
+
+   /*
+    * Are we forging referer?
+    */
+   if (0 == strcmpic(newval, "forge"))
    {
       /*
-       * We have a specific (fixed) referer we want to send.
+       * Forge a referer as http://[hostname:port of REQUEST]/
+       * to fool stupid checks for in-site links
        */
-      log_error(LOG_LEVEL_HEADER, "modified");
-
-      *header = strdup("Referer: ");
-      string_append(header, newval);
-
-      return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+      log_error(LOG_LEVEL_HEADER, "crunch+forge!");
+      s = strsav(NULL, "Referer: ");
+      s = strsav(s, "http://");
+      s = strsav(s, csp->http->hostport);
+      s = strsav(s, "/");
+      return(s);
    }
-   else
+
+   /*
+    * Have we got a fixed referer?
+    */
+   if (0 == strncmpic(newval, "http://", 7))
    {
       /*
-       * Forge a referer as http://[hostname:port of REQUEST]/
-       * to fool stupid checks for in-site links
+       * We have a specific (fixed) referer we want to send.
        */
-      if (0 != strcmpic(newval, "forge"))
-      {
-         /*
-          * Invalid choice - but forge is probably the best default.
-          */
-         log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval);
-      }
 
-      *header = strdup("Referer: http://");
-      string_append(header, csp->http->hostport);
-      string_append(header, "/");
-      log_error(LOG_LEVEL_HEADER, "crunch+forge to %s", *header);
-      
-      return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
+      log_error(LOG_LEVEL_HEADER, "modified");
+
+      s = strsav( NULL, "Referer: " );
+      s = strsav( s, newval );
+      return(s);
    }
+
+   /* Should never get here! */
+   log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval);
+
+   /*
+    * Forge is probably the best default.
+    *
+    * Forge a referer as http://[hostname:port of REQUEST]/
+    * to fool stupid checks for in-site links
+    */
+   log_error(LOG_LEVEL_HEADER, "crunch+forge!");
+   s = strsav(NULL, "Referer: ");
+   s = strsav(s, "http://");
+   s = strsav(s, csp->http->hostport);
+   s = strsav(s, "/");
+   return(s);
 }
 
 
@@ -1111,43 +866,49 @@ jb_err client_referrer(struct client_state *csp, char **header)
  *
  * Function    :  client_uagent
  *
- * Description :  Handle the "user-agent" config setting properly
- *                and remember its original value to enable browser
- *                bug workarounds. Called from `sed'.
+ * Description :  Handle the "user-agent" config setting properly.
+ *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A malloc'ed pointer to the default agent, or
+ *                a malloc'ed string pointer to this header (ie. pass thru).
  *
  *********************************************************************/
-jb_err client_uagent(struct client_state *csp, char **header)
+char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
 
+#ifdef DETECT_MSIE_IMAGES
+   if (strstr (s, "MSIE "))
+   {
+      /* This is Microsoft Internet Explorer.
+       * Enable auto-detect.
+       */
+      csp->accept_types |= ACCEPT_TYPE_IS_MSIE;
+   }
+#endif /* def DETECT_MSIE_IMAGES */
+
    if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
    newval = csp->action->string[ACTION_STRING_USER_AGENT];
    if (newval == NULL)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
    log_error(LOG_LEVEL_HEADER, "modified");
 
-   freez(*header);
-   *header = strdup("User-Agent: ");
-   string_append(header, newval);
+   s = strsav( NULL, "User-Agent: " );
+   s = strsav( s, newval );
+   return(s);
 
-   return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
 }
 
 
@@ -1158,25 +919,24 @@ jb_err client_uagent(struct client_state *csp, char **header)
  * Description :  Handle "ua-" headers properly.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string to original header
  *
  *********************************************************************/
-jb_err client_ua(struct client_state *csp, char **header)
+char *client_ua(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0)
+   if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
+   {
+      return(strdup(s));
+   }
+   else
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      freez(*header);
+      return(NULL);
    }
-
-   return JB_ERR_OK;
 }
 
 
@@ -1188,44 +948,40 @@ jb_err client_ua(struct client_state *csp, char **header)
  *                Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  NULL if crunched, or a malloc'ed string to
+ *                modified/original header.
  *
  *********************************************************************/
-jb_err client_from(struct client_state *csp, char **header)
+char *client_from(const struct parsers *v, char *s, struct client_state *csp)
 {
    const char * newval;
 
    if ((csp->action->flags & ACTION_HIDE_FROM) == 0)
    {
-      return JB_ERR_OK;
+      return(strdup(s));
    }
 
-   freez(*header);
-
    newval = csp->action->string[ACTION_STRING_FROM];
 
    /*
-    * Are we blocking the e-mail address?
+    * Are we blocking referer?
     */
    if ((newval == NULL) || (0 == strcmpic(newval, "block")) )
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
-      return JB_ERR_OK;
+      return(NULL);
    }
 
    log_error(LOG_LEVEL_HEADER, " modified");
 
-   *header = strdup("From: ");
-   string_append(header, newval);
+   s = strsav( NULL, "From: " );
+   s = strsav( s, newval );
+   return(s);
 
-   return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK;
 }
 
 
@@ -1238,24 +994,18 @@ jb_err client_from(struct client_state *csp, char **header)
  *                else we crunch it.  Mmmmmmmmmmm ... cookie ......
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = pattern of cookie `sed' found matching
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err client_send_cookie(struct client_state *csp, char **header)
+char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
-   jb_err result = JB_ERR_OK;
-
    if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0)
    {
-      /* strlen("cookie: ") == 8 */
-      result = enlist(csp->cookie_list, *header + 8);
+      enlist(csp->cookie_list, s + v->len + 1);
    }
    else
    {
@@ -1263,12 +1013,11 @@ jb_err client_send_cookie(struct client_state *csp, char **header)
    }
 
    /*
-    * Always remove the cookie here.  The cookie header
+    * Always return NULL here.  The cookie header
     * will be sent at the end of the header.
     */
-   freez(*header);
+   return(NULL);
 
-   return result;
 }
 
 
@@ -1280,91 +1029,72 @@ jb_err client_send_cookie(struct client_state *csp, char **header)
  *                also used in the add_client_headers list.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to "crunch"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Always NULL.
  *
  *********************************************************************/
-jb_err client_x_forwarded(struct client_state *csp, char **header)
+char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp)
 {
    if ((csp->action->flags & ACTION_HIDE_FORWARDED) == 0)
    {
       /* Save it so we can re-add it later */
-      freez(csp->x_forwarded);
-      csp->x_forwarded = *header;
-
-      /*
-       * Always set *header = NULL, since this information
-       * will be sent at the end of the header.
-       */
-      *header = NULL;
-   }
-   else
-   {
-      freez(*header);
-      log_error(LOG_LEVEL_HEADER, " crunch!");
+      csp->x_forwarded = strdup(s);
    }
 
-   return JB_ERR_OK;
-}
+   /*
+    * Always return NULL, since this information
+    * will be sent at the end of the header.
+    */
 
-/* the following functions add headers directly to the header list */
+   return(NULL);
 
+}
+
+#if defined(DETECT_MSIE_IMAGES)
 /*********************************************************************
  *
- * Function    :  client_host_adder
+ * Function    :  client_accept
  *
- * Description :  (re)adds the host header. Called from `sed'.
+ * Description :  Detect whether the client wants HTML or an image.
+ *                Clients do not always make this information available
+ *                in a sane way.  Always passes the header through
+ *                the proxy unchanged.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          1  :  v = Ignored.
+ *          2  :  s = Header string.  Null terminated.
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  Duplicate of argument s.
  *
  *********************************************************************/
-jb_err client_host_adder(struct client_state *csp)
+char *client_accept(const struct parsers *v, char *s, struct client_state *csp)
 {
-   char *p;
-   char *pos;
-   jb_err err;
-
-   if ( !csp->http->hostport || !*(csp->http->hostport))
-   {
-      return JB_ERR_OK;
-   }
-
-   p = strdup("Host: ");
-   /*
-   ** remove 'user:pass@' from 'proto://user:pass@host'
-   */
-   if ( (pos = strchr( csp->http->hostport, '@')) != NULL )
+#ifdef DETECT_MSIE_IMAGES
+   if (strstr (s, "image/gif"))
    {
-       string_append(&p, pos+1);
+      /* Client will accept HTML.  If this seems counterintuitive,
+       * blame Microsoft. 
+       */
+      csp->accept_types |= ACCEPT_TYPE_MSIE_HTML;
    }
    else
    {
-      string_append(&p, csp->http->hostport);
+      csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE;
    }
+#endif /* def DETECT_MSIE_IMAGES */
 
-   if (p == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
+   return(strdup(s));
 
-   log_error(LOG_LEVEL_HEADER, "addh: %s", p);
+}
+#endif /* defined(DETECT_MSIE_IMAGES) */
 
-   err = enlist(csp->headers, p);
 
-   freez(p);
 
-   return err;
-}
+/* the following functions add headers directly to the header list */
 
 
 /*********************************************************************
@@ -1376,90 +1106,50 @@ jb_err client_host_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_cookie_adder(struct client_state *csp)
+void client_cookie_adder(struct client_state *csp)
 {
-   struct list_entry *lst;
-   char *tmp;
-   struct list_entry *list1 = csp->cookie_list->first;
-   struct list_entry *list2 = csp->action->multi[ACTION_MULTI_WAFER]->first;
-   int first_cookie = 1;
-   jb_err err;
-
-   if ((list1 == NULL) && (list2 == NULL))
-   {
-      /* Nothing to do */
-      return JB_ERR_OK;
-   }
+   struct list *lst;
+   char *tmp = NULL;
+   char *e;
 
-   tmp = strdup("Cookie: ");
-
-   for (lst = list1; lst ; lst = lst->next)
+   for (lst = csp->cookie_list->next; lst ; lst = lst->next)
    {
-      if (first_cookie)
-      {
-         first_cookie = 0;
-      }
-      else
+      if (tmp)
       {
-         string_append(&tmp, "; ");
+         tmp = strsav(tmp, "; ");
       }
-      string_append(&tmp, lst->str);
+      tmp = strsav(tmp, lst->str);
    }
 
-   for (lst = list2;  lst ; lst = lst->next)
+   for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next;  lst ; lst = lst->next)
    {
-      if (first_cookie)
+      if (tmp)
       {
-         first_cookie = 0;
+         tmp = strsav(tmp, "; ");
       }
-      else
+
+      if ((e = cookie_encode(lst->str)))
       {
-         string_append(&tmp, "; ");
+         tmp = strsav(tmp, e);
+         freez(e);
       }
-      string_join(&tmp, cookie_encode(lst->str));
    }
 
-   if (tmp == NULL)
+   if (tmp)
    {
-      return JB_ERR_MEMORY;
-   }
-
-   log_error(LOG_LEVEL_HEADER, "addh: %s", tmp);
-   err = enlist(csp->headers, tmp);
-   free(tmp);
-   return err;
-}
-
+      char *ret;
 
-/*********************************************************************
- *
- * Function    :  client_accept_encoding_adder
- *
- * Description :  Add an Accept-Encoding header to the client's request
- *                that disables compression if the action applies, and
- *                the header is not already there. Called from `sed'.
- *                Note: For HTTP/1.0, the absence of the header is enough.
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err client_accept_encoding_adder(struct client_state *csp)
-{
-   if (   ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
-       && (!strcmpic(csp->http->ver, "HTTP/1.1")) )
-   {
-      return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16);
+      ret = strdup("Cookie: ");
+      ret = strsav(ret, tmp);
+      log_error(LOG_LEVEL_HEADER, "addh: %s", ret);
+      enlist(csp->headers, ret);
+      freez(tmp);
+      freez(ret);
    }
 
-   return JB_ERR_OK;
 }
 
 
@@ -1472,28 +1162,19 @@ jb_err client_accept_encoding_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_xtra_adder(struct client_state *csp)
+void client_xtra_adder(struct client_state *csp)
 {
-   struct list_entry *lst;
-   jb_err err;
+   struct list *lst = csp->action->multi[ACTION_MULTI_ADD_HEADER];
 
-   for (lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]->first;
-        lst ; lst = lst->next)
+   for (lst = lst->next; lst ; lst = lst->next)
    {
       log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str);
-      err = enlist(csp->headers, lst->str);
-      if (err)
-      {
-         return err;
-      }
-
+      enlist(csp->headers, lst->str);
    }
 
-   return JB_ERR_OK;
 }
 
 
@@ -1506,234 +1187,105 @@ jb_err client_xtra_adder(struct client_state *csp)
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  N/A
  *
  *********************************************************************/
-jb_err client_x_forwarded_adder(struct client_state *csp)
+void client_x_forwarded_adder(struct client_state *csp)
 {
    char *p = NULL;
-   jb_err err;
 
    if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0)
    {
-      return JB_ERR_OK;
+      return;
    }
 
    if (csp->x_forwarded)
    {
-      p = strdup(csp->x_forwarded);
-      string_append(&p, ", ");
+      p = strsav(p, csp->x_forwarded);
+      p = strsav(p, ", ");
+      p = strsav(p, csp->ip_addr_str);
    }
    else
    {
-      p = strdup("X-Forwarded-For: ");
-   }
-   string_append(&p, csp->ip_addr_str);
-
-   if (p == NULL)
-   {
-      return JB_ERR_MEMORY;
+      p = strsav(p, "X-Forwarded-For: ");
+      p = strsav(p, csp->ip_addr_str);
    }
 
    log_error(LOG_LEVEL_HEADER, "addh: %s", p);
-   err = enlist(csp->headers, p);
-   free(p);
+   enlist(csp->headers, p);
 
-   return err;
-}
-
-
-/*********************************************************************
- *
- * Function    :  connection_close_adder
- *
- * Description :  Adds a "Connection: close" header to csp->headers
- *                as a temporary fix for the needed but missing HTTP/1.1
- *                support. Called from `sed'.
- *                FIXME: This whole function shouldn't be neccessary!
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err connection_close_adder(struct client_state *csp)
-{
-   return enlist(csp->headers, "Connection: close");
 }
 
 
 /*********************************************************************
  *
- * Function    :  server_http
+ * Function    :  server_set_cookie
  *
- * Description :  - Save the HTTP Status into csp->http->status
- *                - Set CT_TABOO to prevent filtering if the answer
- *                  is a partial range (HTTP status 206)
- *                - Rewrite HTTP/1.1 answers to HTTP/1.0 if +downgrade
- *                  action applies.
+ * Description :  Handle the server "cookie" header properly.
+ *                Log cookie to the jar file.  Then "crunch" it,
+ *                or accept it.  Called from `sed'.
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = parser pattern that matched this header
+ *          2  :  s = header that matched this pattern
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  `crumble' or a newly malloc'ed string.
  *
  *********************************************************************/
-jb_err server_http(struct client_state *csp, char **header)
+char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
-   sscanf(*header, "HTTP/%*d.%*d %d", &(csp->http->status));
-   if (csp->http->status == 206)
+#ifdef JAR_FILES
+   if (csp->config->jar)
    {
-      csp->content_type = CT_TABOO;
+      fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
    }
+#endif /* def JAR_FILES */
 
-   if ((csp->action->flags & ACTION_DOWNGRADE) != 0)
+   if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
    {
-      (*header)[7] = '0';
-      log_error(LOG_LEVEL_HEADER, "Downgraded answer to HTTP/1.0");
+      return(crumble(v, s, csp));
    }
 
-   return JB_ERR_OK;
+   return(strdup(s));
+
 }
 
 
+#ifdef FORCE_LOAD
 /*********************************************************************
  *
- * Function    :  server_set_cookie
+ * Function    :  client_host
  *
- * Description :  Handle the server "cookie" header properly.
- *                Log cookie to the jar file.  Then "crunch" it,
- *                or accept it.  Called from `sed'.
+ * Description :  Clean the FORCE_PREFIX out of the 'host' http
+ *                header, if we use force
  *
  * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  header = On input, pointer to header to modify.
- *                On output, pointer to the modified header, or NULL
- *                to remove the header.  This function frees the
- *                original string if necessary.
+ *          1  :  v = ignored
+ *          2  :  s = header (from sed) to clean
+ *          3  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  JB_ERR_OK on success, or
- *                JB_ERR_MEMORY on out-of-memory error.
+ * Returns     :  A malloc'ed pointer to the cleaned host header 
  *
  *********************************************************************/
-jb_err server_set_cookie(struct client_state *csp, char **header)
+char *client_host(const struct parsers *v, char *s, struct client_state *csp)
 {
-#ifdef FEATURE_COOKIE_JAR
-   if (csp->config->jar)
-   {
-      /*
-       * Write timestamp into outbuf.
-       *
-       * Complex because not all OSs have tm_gmtoff or
-       * the %z field in strftime()
-       */
-      char tempbuf[ BUFFER_SIZE ];
-      time_t now; 
-      struct tm tm_now; 
-      time (&now); 
-#ifdef HAVE_LOCALTIME_R
-      tm_now = *localtime_r(&now, &tm_now);
-#else
-      tm_now = *localtime (&now); 
-#endif
-      strftime(tempbuf, BUFFER_SIZE-6, "%b %d %H:%M:%S ", &tm_now); 
-
-      /* strlen("set-cookie: ") = 12 */
-      fprintf(csp->config->jar, "%s %s\t%s\n", tempbuf, csp->http->host, *header + 12);
-   }
-#endif /* def FEATURE_COOKIE_JAR */
-
-   if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
-   {
-      return crumble(csp, header);
-   }
-   else if ((csp->action->flags & ACTION_NO_COOKIE_KEEP) != 0)
-   {
-      /* Flag whether or not to log a message */
-      int changed = 0;
-
-      /* A variable to store the tag we're working on */
-      char * cur_tag;
-
-      /* Skip "Set-Cookie:" (11 characters) in header */
-      cur_tag = *header + 11;
-
-      /* skip whitespace between "Set-Cookie:" and value */
-      while (*cur_tag && ijb_isspace(*cur_tag))
-      {
-         cur_tag++;
-      }
-
-      /* Loop through each tag in the cookie */
-      while (*cur_tag)
-      {
-         /* Find next tag */
-         char * next_tag = strchr(cur_tag, ';');
-         if (next_tag != NULL)
-         {
-            /* Skip the ';' character itself */
-            next_tag++;
-
-            /* skip whitespace ";" and start of tag */
-            while (*next_tag && ijb_isspace(*next_tag))
-            {
-               next_tag++;
-            }
-         }
-         else
-         {
-            /* "Next tag" is the end of the string */
-            next_tag = cur_tag + strlen(cur_tag);
-         }
-
-         /* Is this the "Expires" tag? */
-         if (strncmpic(cur_tag, "expires=", 8) == 0)
-         {
-            /* Delete the tag by copying the rest of the string over it.
-             * (Note that we cannot just use "strcpy(cur_tag, next_tag)",
-             * since the behaviour of strcpy is undefined for overlapping
-             * strings.)
-             */
-            memmove(cur_tag, next_tag, strlen(next_tag) + 1);
-
-            /* That changed the header, need to issue a log message */
-            changed = 1;
-
-            /* Note that the next tag has now been moved to *cur_tag,
-             * so we do not need to update the cur_tag pointer.
-             */
-         }
-         else
-         {
-            /* Move on to next cookie tag */
-            cur_tag = next_tag;
-         }
-      }
-
-      if (changed)
-      {
-         log_error(LOG_LEVEL_HEADER, "Changed cookie to a temporary one.");
-      }
-   }
-
-   return JB_ERR_OK;
+   char *cleanhost = strdup(s);
+   if(csp->force)
+      strclean(cleanhost, FORCE_PREFIX);
+   return(cleanhost);
 }
-
-
-#ifdef FEATURE_FORCE_LOAD
+#endif /* def FORCE_LOAD */
+#ifdef FORCE_LOAD 
 /*********************************************************************
  *
  * Function    :  strclean
  *
- * Description :  In-Situ-Eliminate all occurances of substring in
+ * Description :  In-Situ-Eliminate all occurances of substring in 
  *                string
  *
  * Parameters  :
@@ -1748,12 +1300,12 @@ int strclean(const char *string, const char *substring)
    int hits = 0, len = strlen(substring);
    char *pos, *p;
 
-   while((pos = strstr(string, substring)) != NULL)
+   while((pos = strstr(string, substring)))
    {
       p = pos + len;
       do
       {
-         *(p - len) = *p;
+         *(p - len) = *p; 
       }
       while (*p++ != '\0');
 
@@ -1762,7 +1314,7 @@ int strclean(const char *string, const char *substring)
 
    return(hits);
 }
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
 
 
 /*
index d7e104b..1ae901b 100644 (file)
--- a/parsers.h
+++ b/parsers.h
@@ -1,6 +1,6 @@
-#ifndef PARSERS_H_INCLUDED
-#define PARSERS_H_INCLUDED
-#define PARSERS_H_VERSION "$Id: parsers.h,v 1.24 2002/03/24 13:25:43 swa Exp $"
+#ifndef _PARSERS_H
+#define _PARSERS_H
+#define PARSERS_H_VERSION "$Id: parsers.h,v 1.6 2001/06/03 19:12:38 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/parsers.h,v $
@@ -17,7 +17,7 @@
  *                   and `server_set_cookie'.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: parsers.h,v $
- *    Revision 1.24  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.23  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.22  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.21  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.20  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.19  2002/01/17 21:03:47  jongfoster
- *    Moving all our URL and URL pattern parsing code to urlmatch.c.
- *
- *    Revision 1.18  2001/10/26 17:40:23  oes
- *    Introduced get_header_value()
- *    Removed client_accept()
- *
- *    Revision 1.17  2001/10/13 12:47:32  joergs
- *    Removed client_host, added client_host_adder
- *
- *    Revision 1.16  2001/10/07 18:50:16  oes
- *    Added server_content_encoding, renamed server_transfer_encoding
- *
- *    Revision 1.15  2001/10/07 18:01:55  oes
- *    Changed server_http11 to server_http
- *
- *    Revision 1.14  2001/10/07 15:45:48  oes
- *    added client_accept_encoding, client_te, client_accept_encoding_adder
- *
- *    renamed content_type and content_length
- *
- *    fixed client_host and strclean prototypes
- *
- *    Revision 1.13  2001/09/29 12:56:03  joergs
- *    IJB now changes HTTP/1.1 to HTTP/1.0 in requests and answers.
- *
- *    Revision 1.12  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.11  2001/07/31 14:46:53  oes
- *    Added prototype for connection_close_adder
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/07/13 14:01:54  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.7  2001/06/29 13:32:14  oes
- *    Removed logentry from cancelled commit
- *
  *    Revision 1.6  2001/06/03 19:12:38  oes
  *    deleted const struct interceptors
  *
@@ -172,44 +87,47 @@ extern "C" {
 extern const struct parsers client_patterns[];
 extern const struct parsers server_patterns[];
 
-extern const add_header_func_ptr add_client_headers[];
-extern const add_header_func_ptr add_server_headers[];
+extern void (* const add_client_headers[])(struct client_state *);
+extern void (* const add_server_headers[])(struct client_state *);
 
-extern int flush_socket(jb_socket fd, struct client_state *csp);
-extern void add_to_iob(struct client_state *csp, char *buf, int n);
+extern int flush_socket(int fd, struct client_state *csp);
+extern int add_to_iob(struct client_state *csp, char *buf, int n);
 extern char *get_header(struct client_state *csp);
-extern char *get_header_value(const struct list *header_list, const char *header_name);
-extern char *sed(const struct parsers pats[], const add_header_func_ptr more_headers[], struct client_state *csp);
-
-extern jb_err crumble                (struct client_state *csp, char **header);
-extern jb_err client_referrer        (struct client_state *csp, char **header);
-extern jb_err client_uagent          (struct client_state *csp, char **header);
-extern jb_err client_ua              (struct client_state *csp, char **header);
-extern jb_err client_from            (struct client_state *csp, char **header);
-extern jb_err client_send_cookie     (struct client_state *csp, char **header);
-extern jb_err client_x_forwarded     (struct client_state *csp, char **header);
-extern jb_err client_accept_encoding (struct client_state *csp, char **header);
-extern jb_err client_te              (struct client_state *csp, char **header);
-
-extern jb_err client_host_adder           (struct client_state *csp);
-extern jb_err client_cookie_adder         (struct client_state *csp);
-extern jb_err client_xtra_adder           (struct client_state *csp);
-extern jb_err client_accept_encoding_adder(struct client_state *csp);
-extern jb_err client_x_forwarded_adder    (struct client_state *csp);
-
-extern jb_err connection_close_adder      (struct client_state *csp); 
-
-extern jb_err server_set_cookie      (struct client_state *csp, char **header);
-extern jb_err server_content_type    (struct client_state *csp, char **header);
-extern jb_err server_content_length  (struct client_state *csp, char **header);
-extern jb_err server_content_md5     (struct client_state *csp, char **header);
-extern jb_err server_content_encoding(struct client_state *csp, char **header);
-extern jb_err server_transfer_coding (struct client_state *csp, char **header);
-extern jb_err server_http            (struct client_state *csp, char **header);
-
-#ifdef FEATURE_FORCE_LOAD
-extern int strclean(const char *string, const char *substring);
-#endif /* def FEATURE_FORCE_LOAD */
+
+extern char *sed(const struct parsers pats[], void (* const more_headers[])(struct client_state *), struct client_state *csp);
+
+extern void free_http_request(struct http_request *http);
+extern void parse_http_request(char *req, struct http_request *http, struct client_state *csp);
+
+extern char *crumble(const struct parsers *v, char *s, struct client_state *csp);
+
+extern char *client_referrer(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_uagent(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_ua(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_from(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp);
+extern char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp);
+extern void client_cookie_adder(struct client_state *csp);
+extern void client_xtra_adder(struct client_state *csp);
+extern void client_x_forwarded_adder(struct client_state *csp);
+extern char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp);
+
+#if defined(PCRS) || defined(KILLPOPUPS)
+extern char *content_type(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+
+#ifdef PCRS
+extern char *content_length(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* def PCRS */
+
+#ifdef FORCE_LOAD
+char *client_host(const struct parsers *v, char *s, struct client_state *csp);
+int strclean(const char *string, const char *substring);
+#endif /* def FORCE_LOAD */
+
+#if defined(DETECT_MSIE_IMAGES)
+extern char *client_accept(const struct parsers *v, char *s, struct client_state *csp);
+#endif /* defined(DETECT_MSIE_IMAGES) */
 
 /* Revision control strings from this header and associated .c file */
 extern const char parsers_rcs[];
@@ -219,7 +137,7 @@ extern const char parsers_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef PARSERS_H_INCLUDED */
+#endif /* ndef _PARSERS_H */
 
 /*
   Local Variables:
diff --git a/pcre/.gitignore b/pcre/.gitignore
deleted file mode 100644 (file)
index e68facf..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-chartables.c
-dftables
diff --git a/pcre/Makefile.in b/pcre/Makefile.in
deleted file mode 100644 (file)
index 94edf49..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-
-# Makefile.in for PCRE (Perl-Compatible Regular Expression) library.
-
-#---------------------------------------------------------------------------#
-# To build mingw32 DLL uncomment the next two lines. This addition for      #
-# mingw32 was contributed by <Paul.Sokolovsky@technologist.com>. I (Philip  #
-# Hazel) don't know anything about it! There are some additional targets at #
-# the bottom of this Makefile.                                              #
-#---------------------------------------------------------------------------#
-#
-# include dll.mk
-# DLL_LDFLAGS=-s
-
-
-#---------------------------------------------------------------------------#
-# The next few lines are modified by "configure" to insert data that it is  #
-# given in its arguments, or which it finds out for itself.                 #
-#---------------------------------------------------------------------------#
-
-# BINDIR is the directory in which the pcregrep command is installed.
-# INCDIR is the directory in which the public header file pcre.h is installed.
-# LIBDIR is the directory in which the libraries are installed.
-# MANDIR is the directory in which the man pages are installed.
-# The pcretest program, as it is a test program, does not get installed
-# anywhere.
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-BINDIR = @bindir@
-LIBDIR = @libdir@
-INCDIR = @includedir@
-MANDIR = @mandir@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-RANLIB = @RANLIB@
-UTF8   = @UTF8@
-
-# LIBTOOL defaults to "./libtool", which enables the building of shared
-# libraries. If "configure" is called with --disable-shared-libraries, LIBTOOL
-# is set to "", which stops shared libraries from being built, and LIBSUFFIX
-# is set to "a" instead of "la", which causes the shared libraries not to be
-# installed.
-
-LIBTOOL = @LIBTOOL@
-LIBSUFFIX = @LIBSUFFIX@
-
-# These are the version numbers for the shared libraries
-
-PCRELIBVERSION = @PCRE_LIB_VERSION@
-PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@
-
-
-#---------------------------------------------------------------------------#
-# A copy of install-sh is in this distribution and is used by default.      #
-#---------------------------------------------------------------------------#
-
-INSTALL = ./install-sh -c
-INSTALL_DATA = ${INSTALL} -m 644
-
-
-#---------------------------------------------------------------------------#
-# For almost all systems, the command to create a library is "ar cq", but   #
-# there is at least one where it is different, so this command must be      #
-# configurable. However, I haven't got round to learning how to make        #
-# "configure" find this out for itself. It is necessary to use a command    #
-# such as "make AR='ar -rc'" if you need to vary this. The setting of AR is #
-# *not* passed over to ./ltconfig, because it does its own setting up.      #
-#---------------------------------------------------------------------------#
-
-AR = ar cq
-
-
-##############################################################################
-
-
-OBJ = maketables.o get.o study.o pcre.o
-LOBJ = maketables.lo get.lo study.lo pcre.lo
-
-all:            libtool libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest pcregrep
-
-libtool:        config.guess config.sub ltconfig ltmain.sh
-               @if test "$(LIBTOOL)" = "./libtool"; then \
-                 echo '--- Building libtool ---'; \
-                 CC=$(CC) CFLAGS='$(CFLAGS)' RANLIB='$(RANLIB)' ./ltconfig ./ltmain.sh; \
-                 echo '--- Built libtool ---'; fi
-
-pcregrep:       libpcre.$(LIBSUFFIX) pcregrep.o
-                 @echo ' '
-                 @echo '--- Building pcregrep utility'
-                 @echo ' '
-               $(LIBTOOL) $(CC) $(CFLAGS) -o pcregrep pcregrep.o libpcre.$(LIBSUFFIX)
-
-pcretest:       libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX) pcretest.o
-                 @echo ' '
-                 @echo '--- Building pcretest testing program'
-                 @echo ' '
-               $(LIBTOOL) $(PURIFY) $(CC) $(CFLAGS) -o pcretest pcretest.o \
-                 libpcre.$(LIBSUFFIX) libpcreposix.$(LIBSUFFIX)
-
-libpcre.a:      $(OBJ)
-               @echo ' '
-               @echo '--- Building static library: libpcre'
-               @echo ' '
-               -rm -f libpcre.a
-               $(AR) libpcre.a $(OBJ)
-               $(RANLIB) libpcre.a
-
-libpcre.la:     $(OBJ)
-               @echo ' '
-               @echo '--- Building shared library: libpcre'
-               @echo ' '
-               -rm -f libpcre.la
-               ./libtool $(CC) -version-info '$(PCRELIBVERSION)' -o libpcre.la -rpath $(LIBDIR) $(LOBJ)
-
-libpcreposix.a: pcreposix.o
-               @echo ' '
-               @echo '--- Building static library: libpcreposix'
-               @echo ' '
-               -rm -f libpcreposix.a
-               $(AR) libpcreposix.a pcreposix.o
-               $(RANLIB) libpcreposix.a
-
-libpcreposix.la: pcreposix.o
-               @echo ' '
-               @echo '--- Building shared library: libpcreposix'
-               @echo ' '
-               -rm -f libpcreposix.la
-               ./libtool $(CC) -version-info '$(PCREPOSIXLIBVERSION)' -o libpcreposix.la -rpath $(LIBDIR) pcreposix.lo
-
-pcre.o:         chartables.c pcre.c pcre.h internal.h config.h Makefile
-               $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) pcre.c
-
-pcreposix.o:    pcreposix.c pcreposix.h internal.h pcre.h config.h Makefile
-               $(LIBTOOL) $(CC) -c $(CFLAGS) pcreposix.c
-
-maketables.o:   maketables.c pcre.h internal.h config.h Makefile
-               $(LIBTOOL) $(CC) -c $(CFLAGS) maketables.c
-
-get.o:          get.c pcre.h internal.h config.h Makefile
-               $(LIBTOOL) $(CC) -c $(CFLAGS) get.c
-
-study.o:        study.c pcre.h internal.h config.h Makefile
-               $(LIBTOOL) $(CC) -c $(CFLAGS) $(UTF8) study.c
-
-pcretest.o:     pcretest.c pcre.h config.h Makefile
-               $(CC) -c $(CFLAGS) $(UTF8) pcretest.c
-
-pcregrep.o:     pcregrep.c pcre.h Makefile config.h
-               $(CC) -c $(CFLAGS) $(UTF8) pcregrep.c
-
-# An auxiliary program makes the default character table source
-
-chartables.c:   dftables
-               ./dftables >chartables.c
-
-dftables:       dftables.c maketables.c pcre.h internal.h config.h Makefile
-               $(CC) -o dftables $(CFLAGS) dftables.c
-
-install:        all
-               $(LIBTOOL) $(INSTALL_DATA) libpcre.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcre.$(LIBSUFFIX)
-               $(LIBTOOL) $(INSTALL_DATA) libpcreposix.$(LIBSUFFIX) $(DESTDIR)/$(LIBDIR)/libpcreposix.$(LIBSUFFIX)
-               $(INSTALL_DATA) pcre.h $(DESTDIR)/$(INCDIR)/pcre.h
-               $(INSTALL_DATA) pcreposix.h $(DESTDIR)/$(INCDIR)/pcreposix.h
-               $(INSTALL_DATA) doc/pcre.3 $(DESTDIR)/$(MANDIR)/man3/pcre.3
-               $(INSTALL_DATA) doc/pcreposix.3 $(DESTDIR)/$(MANDIR)/man3/pcreposix.3
-               $(INSTALL_DATA) doc/pcregrep.1 $(DESTDIR)/$(MANDIR)/man1/pcregrep.1
-               @if test "$(LIBTOOL)" = "./libtool"; then \
-                 echo ' '; \
-                 echo '--- Rebuilding pcregrep to use installed shared library ---'; \
-                 echo $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \
-                 $(CC) $(CFLAGS) -o pcregrep pcregrep.o -L$(DESTDIR)/$(LIBDIR) -lpcre; \
-                 echo '--- Rebuilding pcretest to use installed shared library ---'; \
-                 echo $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \
-                 $(CC) $(CFLAGS) -o pcretest pcretest.o -L$(DESTDIR)/$(LIBDIR) -lpcre -lpcreposix; \
-               fi
-               $(INSTALL)      pcregrep $(DESTDIR)/$(BINDIR)/pcregrep
-               $(INSTALL)      pcre-config $(DESTDIR)/$(BINDIR)/pcre-config
-
-# We deliberately omit dftables and chartables.c from 'make clean'; once made
-# chartables.c shouldn't change, and if people have edited the tables by hand,
-# you don't want to throw them away.
-
-clean:;         -rm -rf *.o *.lo *.a *.la .libs pcretest pcregrep testtry
-
-# But "make distclean" should get back to a virgin distribution
-
-distclean:      clean
-               -rm -f chartables.c libtool pcre-config pcre.h \
-               Makefile config.h config.status config.log config.cache
-
-check:          runtest
-
-test:           runtest
-
-runtest:        all
-               ./RunTest
-
-######## MINGW32 ############### MINGW32 ############### MINGW32 #############
-
-# This addition for mingw32 was contributed by  Paul Sokolovsky
-# <Paul.Sokolovsky@technologist.com>. I (PH) don't know anything about it!
-
-dll:            _dll libpcre.dll.a pcregrep_d pcretest_d
-
-_dll:
-               $(MAKE) CFLAGS=-DSTATIC pcre.dll
-
-pcre.dll:       $(OBJ) pcreposix.o pcre.def
-libpcre.dll.a:  pcre.def
-
-pcregrep_d:     libpcre.dll.a pcregrep.o
-               $(CC) $(CFLAGS) -L. -o pcregrep pcregrep.o -lpcre.dll
-
-pcretest_d:     libpcre.dll.a pcretest.o
-               $(PURIFY) $(CC) $(CFLAGS) -L. -o pcretest pcretest.o -lpcre.dll
-
-# End
diff --git a/pcre/RunTest.in b/pcre/RunTest.in
deleted file mode 100644 (file)
index 6e4eb08..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#! /bin/sh
-
-# This file is generated by configure from RunTest.in. Make any changes
-# to that file.
-
-# Run PCRE tests
-
-cf=diff
-
-# Select which tests to run; if no selection, run all
-
-do1=no
-do2=no
-do3=no
-do4=no
-do5=no
-do6=no
-
-while [ $# -gt 0 ] ; do
-  case $1 in
-    1) do1=yes;;
-    2) do2=yes;;
-    3) do3=yes;;
-    4) do4=yes;;
-    5) do5=yes;; 
-    6) do6=yes;; 
-    *) echo "Unknown test number $1"; exit 1;;
-  esac
-  shift
-done
-
-if [ "@UTF8@" = "" ] ; then
-  if [ $do5 = yes ] ; then
-    echo "Can't run test 5 because UFT8 support is not configured"
-    exit 1
-  fi   
-  if [ $do6 = yes ] ; then
-    echo "Can't run test 6 because UFT8 support is not configured"
-    exit 1
-  fi   
-fi    
-
-if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a\
-     $do5 = no -a $do6 = no ] ; then
-  do1=yes
-  do2=yes
-  do3=yes
-  do4=yes
-  if [ "@UTF8@" != "" ] ; then do5=yes; fi
-  if [ "@UTF8@" != "" ] ; then do6=yes; fi
-fi
-
-# Primary test, Perl-compatible
-
-if [ $do1 = yes ] ; then
-  echo "Testing main functionality (Perl compatible)"
-  ./pcretest testdata/testinput1 testtry
-  if [ $? = 0 ] ; then
-    $cf testtry testdata/testoutput1
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
-  fi
-fi
-
-# PCRE tests that are not Perl-compatible - API & error tests, mostly
-
-if [ $do2 = yes ] ; then
-  echo "Testing API and error handling (not Perl compatible)"
-  ./pcretest -i testdata/testinput2 testtry
-  if [ $? = 0 ] ; then
-    $cf testtry testdata/testoutput2
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
-  fi
-fi
-
-# Additional Perl-compatible tests for Perl 5.005's new features
-
-if [ $do3 = yes ] ; then
-  echo "Testing Perl 5.005 features (Perl 5.005 compatible)"
-  ./pcretest testdata/testinput3 testtry
-  if [ $? = 0 ] ; then
-    $cf testtry testdata/testoutput3
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
-  fi
-fi
-
-if [ $do1 = yes -a $do2 = yes -a $do3 = yes ] ; then
-  echo " " 
-  echo "The three main tests all ran OK"
-  echo " " 
-fi
-
-# Locale-specific tests, provided the "fr" locale is available
-
-if [ $do4 = yes ] ; then
-  locale -a | grep '^fr$' >/dev/null
-  if [ $? -eq 0 ] ; then
-    echo "Testing locale-specific features (using 'fr' locale)"
-    ./pcretest testdata/testinput4 testtry
-    if [ $? = 0 ] ; then
-      $cf testtry testdata/testoutput4
-      if [ $? != 0 ] ; then 
-        echo " "
-        echo "Locale test did not run entirely successfully."
-        echo "This usually means that there is a problem with the locale"
-        echo "settings rather than a bug in PCRE."    
-      else
-      echo "Locale test ran OK" 
-      fi 
-      echo " " 
-    else exit 1
-    fi
-  else
-    echo "Cannot test locale-specific features - 'fr' locale not found,"
-    echo "or the \"locale\" command is not available to check for it."
-    echo " " 
-  fi
-fi
-
-# Additional tests for UTF8 support
-
-if [ $do5 = yes ] ; then
-  echo "Testing experimental, incomplete UTF8 support (Perl compatible)"
-  ./pcretest testdata/testinput5 testtry 
-  if [ $? = 0 ] ; then
-    $cf testtry testdata/testoutput5
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
-  fi
-  echo "UTF8 test ran OK"
-  echo " "
-fi
-
-if [ $do6 = yes ] ; then
-  echo "Testing API and internals for UTF8 support (not Perl compatible)"
-  ./pcretest testdata/testinput6 testtry 
-  if [ $? = 0 ] ; then
-    $cf testtry testdata/testoutput6
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
-  fi
-  echo "UTF8 internals test ran OK"
-  echo " "
-fi
-
-# End
diff --git a/pcre/config.guess b/pcre/config.guess
deleted file mode 100644 (file)
index e1b5871..0000000
+++ /dev/null
@@ -1,1121 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
-#   Free Software Foundation, Inc.
-#
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Written by Per Bothner <bothner@cygnus.com>.
-# The master version of this file is at the FSF in /home/gd/gnu/lib.
-# Please send patches to <autoconf-patches@gnu.org>.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit system type (host/target name).
-#
-# Only a few systems have been added to this list; please add others
-# (but try to keep the structure clean).
-#
-
-# Use $HOST_CC if defined. $CC may point to a cross-compiler
-if test x"$CC_FOR_BUILD" = x; then
-  if test x"$HOST_CC" != x; then
-    CC_FOR_BUILD="$HOST_CC"
-  else
-    if test x"$CC" != x; then
-      CC_FOR_BUILD="$CC"
-    else
-      CC_FOR_BUILD=cc
-    fi
-  fi
-fi
-
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 8/24/94.)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-       PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    alpha:OSF1:*:*)
-       if test $UNAME_RELEASE = "V4.0"; then
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-       fi
-       # A Vn.n version is a released version.
-       # A Tn.n version is a released field test version.
-       # A Xn.n version is an unreleased experimental baselevel.
-       # 1.2 uses "1.2" for uname -r.
-       cat <<EOF >$dummy.s
-       .globl main
-       .ent main
-main:
-       .frame \$30,0,\$26,0
-       .prologue 0
-       .long 0x47e03d80 # implver $0
-       lda \$2,259
-       .long 0x47e20c21 # amask $2,$1
-       srl \$1,8,\$2
-       sll \$2,2,\$2
-       sll \$0,3,\$0
-       addl \$1,\$0,\$0
-       addl \$2,\$0,\$0
-       ret \$31,(\$26),1
-       .end main
-EOF
-       $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
-       if test "$?" = 0 ; then
-               ./$dummy
-               case "$?" in
-                       7)
-                               UNAME_MACHINE="alpha"
-                               ;;
-                       15)
-                               UNAME_MACHINE="alphaev5"
-                               ;;
-                       14)
-                               UNAME_MACHINE="alphaev56"
-                               ;;
-                       10)
-                               UNAME_MACHINE="alphapca56"
-                               ;;
-                       16)
-                               UNAME_MACHINE="alphaev6"
-                               ;;
-               esac
-       fi
-       rm -f $dummy.s $dummy
-       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-       exit 0 ;;
-    Alpha\ *:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # Should we change UNAME_MACHINE based on the output of uname instead
-       # of the specific Alpha model?
-       echo alpha-pc-interix
-       exit 0 ;;
-    21064:Windows_NT:50:3)
-       echo alpha-dec-winnt3.5
-       exit 0 ;;
-    Amiga*:UNIX_System_V:4.0:*)
-       echo m68k-cbm-sysv4
-       exit 0;;
-    amiga:NetBSD:*:*)
-      echo m68k-cbm-netbsd${UNAME_RELEASE}
-      exit 0 ;;
-    amiga:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-       echo ${UNAME_MACHINE}-unknown-amigaos
-       exit 0 ;;
-    arc64:OpenBSD:*:*)
-       echo mips64el-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    arc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    hkmips:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    pmax:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    sgi:OpenBSD:*:*)
-       echo mips-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-       echo mipsel-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    *:OS/390:*:*)
-       echo i370-ibm-openedition
-       exit 0 ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-       echo arm-acorn-riscix${UNAME_RELEASE}
-       exit 0;;
-    arm32:NetBSD:*:*)
-       echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       exit 0 ;;
-    SR2?01:HI-UX/MPP:*:*)
-       echo hppa1.1-hitachi-hiuxmpp
-       exit 0;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-       if test "`(/bin/universe) 2>/dev/null`" = att ; then
-               echo pyramid-pyramid-sysv3
-       else
-               echo pyramid-pyramid-bsd
-       fi
-       exit 0 ;;
-    NILE*:*:*:dcosx)
-       echo pyramid-pyramid-svr4
-       exit 0 ;;
-    sun4H:SunOS:5.*:*)
-       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    i86pc:SunOS:5.*:*)
-       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:6*:*)
-       # According to config.sub, this is the proper way to canonicalize
-       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-       # it's likely to be more like Solaris than SunOS4.
-       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    sun4*:SunOS:*:*)
-       case "`/usr/bin/arch -k`" in
-           Series*|S4*)
-               UNAME_RELEASE=`uname -v`
-               ;;
-       esac
-       # Japanese Language versions have a version number like `4.1.3-JL'.
-       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-       exit 0 ;;
-    sun3*:SunOS:*:*)
-       echo m68k-sun-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    sun*:*:4.2BSD:*)
-       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-       case "`/bin/arch`" in
-           sun3)
-               echo m68k-sun-sunos${UNAME_RELEASE}
-               ;;
-           sun4)
-               echo sparc-sun-sunos${UNAME_RELEASE}
-               ;;
-       esac
-       exit 0 ;;
-    aushp:SunOS:*:*)
-       echo sparc-auspex-sunos${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:NetBSD:*:*)
-       echo m68k-atari-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor 
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-       exit 0 ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
-    sun3*:NetBSD:*:*)
-       echo m68k-sun-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    sun3*:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mac68k:NetBSD:*:*)
-       echo m68k-apple-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mac68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme68k:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    mvme88k:OpenBSD:*:*)
-       echo m88k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    powerpc:machten:*:*)
-       echo powerpc-apple-machten${UNAME_RELEASE}
-       exit 0 ;;
-    macppc:NetBSD:*:*)
-        echo powerpc-apple-netbsd${UNAME_RELEASE}
-        exit 0 ;;
-    RISC*:Mach:*:*)
-       echo mips-dec-mach_bsd4.3
-       exit 0 ;;
-    RISC*:ULTRIX:*:*)
-       echo mips-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    VAX*:ULTRIX*:*:*)
-       echo vax-dec-ultrix${UNAME_RELEASE}
-       exit 0 ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-       echo clipper-intergraph-clix${UNAME_RELEASE}
-       exit 0 ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-       sed 's/^        //' << EOF >$dummy.c
-#ifdef __cplusplus
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-       #if defined (host_mips) && defined (MIPSEB)
-       #if defined (SYSTYPE_SYSV)
-         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_SVR4)
-         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-       #endif
-       #endif
-         exit (-1);
-       }
-EOF
-       $CC_FOR_BUILD $dummy.c -o $dummy \
-         && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-         && rm $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo mips-mips-riscos${UNAME_RELEASE}
-       exit 0 ;;
-    Night_Hawk:Power_UNIX:*:*)
-       echo powerpc-harris-powerunix
-       exit 0 ;;
-    m88k:CX/UX:7*:*)
-       echo m88k-harris-cxux7
-       exit 0 ;;
-    m88k:*:4*:R4*)
-       echo m88k-motorola-sysv4
-       exit 0 ;;
-    m88k:*:3*:R3*)
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110]
-       then
-           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-              [ ${TARGET_BINARY_INTERFACE}x = x ]
-           then
-               echo m88k-dg-dgux${UNAME_RELEASE}
-           else
-               echo m88k-dg-dguxbcs${UNAME_RELEASE}
-           fi
-       else
-           echo i586-dg-dgux${UNAME_RELEASE}
-       fi
-       exit 0 ;;
-    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
-       echo m88k-dolphin-sysv3
-       exit 0 ;;
-    M88*:*:R3*:*)
-       # Delta 88k system running SVR3
-       echo m88k-motorola-sysv3
-       exit 0 ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-       echo m88k-tektronix-sysv3
-       exit 0 ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-       echo m68k-tektronix-bsd
-       exit 0 ;;
-    *:IRIX*:*:*)
-       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-       exit 0 ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
-    i?86:AIX:*:*)
-       echo i386-ibm-aix
-       exit 0 ;;
-    *:AIX:2:3)
-       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               sed 's/^                //' << EOF >$dummy.c
-               #include <sys/systemcfg.h>
-
-               main()
-                       {
-                       if (!__power_pc())
-                               exit(1);
-                       puts("powerpc-ibm-aix3.2.5");
-                       exit(0);
-                       }
-EOF
-               $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
-               rm -f $dummy.c $dummy
-               echo rs6000-ibm-aix3.2.5
-       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-               echo rs6000-ibm-aix3.2.4
-       else
-               echo rs6000-ibm-aix3.2
-       fi
-       exit 0 ;;
-    *:AIX:*:4)
-       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
-       if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
-               IBM_ARCH=rs6000
-       else
-               IBM_ARCH=powerpc
-       fi
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=4.${UNAME_RELEASE}
-       fi
-       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-       exit 0 ;;
-    *:AIX:*:*)
-       echo rs6000-ibm-aix
-       exit 0 ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-       echo romp-ibm-bsd4.4
-       exit 0 ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
-       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-       exit 0 ;;                           # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-       echo rs6000-bull-bosx
-       exit 0 ;;
-    DPX/2?00:B.O.S.:*:*)
-       echo m68k-bull-sysv3
-       exit 0 ;;
-    9000/[34]??:4.3bsd:1.*:*)
-       echo m68k-hp-bsd
-       exit 0 ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-       echo m68k-hp-bsd4.4
-       exit 0 ;;
-    9000/[34678]??:HP-UX:*:*)
-       case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
-           9000/[678][0-9][0-9])
-              sed 's/^              //' << EOF >$dummy.c
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-               {
-               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-               case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-                   switch (bits)
-                       {
-                       case 64: puts ("hppa2.0w"); break;
-                       case 32: puts ("hppa2.0n"); break;
-                       default: puts ("hppa2.0"); break;
-                       } break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-                   puts ("hppa2.0"); break;
-              #endif
-               default: puts ("hppa1.0"); break;
-               }
-                  exit (0);
-              }
-EOF
-       (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
-       rm -f $dummy.c $dummy
-       esac
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-       exit 0 ;;
-    3050*:HI-UX:*:*)
-       sed 's/^        //' << EOF >$dummy.c
-       #include <unistd.h>
-       int
-       main ()
-       {
-         long cpu = sysconf (_SC_CPU_VERSION);
-         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-            results, however.  */
-         if (CPU_IS_PA_RISC (cpu))
-           {
-             switch (cpu)
-               {
-                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-                 default: puts ("hppa-hitachi-hiuxwe2"); break;
-               }
-           }
-         else if (CPU_IS_HP_MC68K (cpu))
-           puts ("m68k-hitachi-hiuxwe2");
-         else puts ("unknown-hitachi-hiuxwe2");
-         exit (0);
-       }
-EOF
-       $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
-       rm -f $dummy.c $dummy
-       echo unknown-hitachi-hiuxwe2
-       exit 0 ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-       echo hppa1.1-hp-bsd
-       exit 0 ;;
-    9000/8??:4.3bsd:*:*)
-       echo hppa1.0-hp-bsd
-       exit 0 ;;
-    *9??*:MPE/iX:*:*)
-       echo hppa1.0-hp-mpeix
-       exit 0 ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-       echo hppa1.1-hp-osf
-       exit 0 ;;
-    hp8??:OSF1:*:*)
-       echo hppa1.0-hp-osf
-       exit 0 ;;
-    i?86:OSF1:*:*)
-       if [ -x /usr/sbin/sysversion ] ; then
-           echo ${UNAME_MACHINE}-unknown-osf1mk
-       else
-           echo ${UNAME_MACHINE}-unknown-osf1
-       fi
-       exit 0 ;;
-    parisc*:Lites*:*:*)
-       echo hppa1.1-hp-lites
-       exit 0 ;;
-    hppa*:OpenBSD:*:*)
-       echo hppa-unknown-openbsd
-       exit 0 ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-       echo c1-convex-bsd
-        exit 0 ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-        exit 0 ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-       echo c34-convex-bsd
-        exit 0 ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-       echo c38-convex-bsd
-        exit 0 ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-       echo c4-convex-bsd
-        exit 0 ;;
-    CRAY*X-MP:*:*:*)
-       echo xmp-cray-unicos
-        exit 0 ;;
-    CRAY*Y-MP:*:*:*)
-       echo ymp-cray-unicos${UNAME_RELEASE}
-       exit 0 ;;
-    CRAY*[A-Z]90:*:*:*)
-       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
-       exit 0 ;;
-    CRAY*TS:*:*:*)
-       echo t90-cray-unicos${UNAME_RELEASE}
-       exit 0 ;;
-    CRAY*T3E:*:*:*)
-       echo alpha-cray-unicosmk${UNAME_RELEASE}
-       exit 0 ;;
-    CRAY-2:*:*:*)
-       echo cray2-cray-unicos
-        exit 0 ;;
-    F300:UNIX_System_V:*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit 0 ;;
-    F301:UNIX_System_V:*:*)
-       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
-       exit 0 ;;
-    hp3[0-9][05]:NetBSD:*:*)
-       echo m68k-hp-netbsd${UNAME_RELEASE}
-       exit 0 ;;
-    hp300:OpenBSD:*:*)
-       echo m68k-unknown-openbsd${UNAME_RELEASE}
-       exit 0 ;;
-    i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
-       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    sparc*:BSD/OS:*:*)
-       echo sparc-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:BSD/OS:*:*)
-       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-       exit 0 ;;
-    *:FreeBSD:*:*)
-       if test -x /usr/bin/objformat; then
-           if test "elf" = "`/usr/bin/objformat`"; then
-               echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
-               exit 0
-           fi
-       fi
-       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-       exit 0 ;;
-    *:NetBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
-       exit 0 ;;
-    *:OpenBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       exit 0 ;;
-    i*:CYGWIN*:*)
-       echo ${UNAME_MACHINE}-pc-cygwin
-       exit 0 ;;
-    i*:MINGW*:*)
-       echo ${UNAME_MACHINE}-pc-mingw32
-       exit 0 ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-       # UNAME_MACHINE based on the output of uname instead of i386?
-       echo i386-pc-interix
-       exit 0 ;;
-    i*:UWIN*:*)
-       echo ${UNAME_MACHINE}-pc-uwin
-       exit 0 ;;
-    p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin
-       exit 0 ;;
-    prep*:SunOS:5.*:*)
-       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit 0 ;;
-    *:GNU:*:*)
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-       exit 0 ;;
-    *:Linux:*:*)
-
-       # The BFD linker knows what the default object file format is, so
-       # first see if it will tell us. cd to the root directory to prevent
-       # problems with other programs or directories called `ld' in the path.
-       ld_help_string=`cd /; ld --help 2>&1`
-       ld_supported_emulations=`echo $ld_help_string \
-                        | sed -ne '/supported emulations:/!d
-                                   s/[         ][      ]*/ /g
-                                   s/.*supported emulations: *//
-                                   s/ .*//
-                                   p'`
-        case "$ld_supported_emulations" in
-         *ia64)
-               echo "${UNAME_MACHINE}-unknown-linux"
-               exit 0
-               ;;
-         i?86linux)
-               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-               exit 0
-               ;;
-         i?86coff)
-               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-               exit 0
-               ;;
-         sparclinux)
-               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-               exit 0
-               ;;
-         armlinux)
-               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-               exit 0
-               ;;
-         elf32arm*)
-               echo "${UNAME_MACHINE}-unknown-linux-gnu"
-               exit 0
-               ;;
-         armelf_linux*)
-               echo "${UNAME_MACHINE}-unknown-linux-gnu"
-               exit 0
-               ;;
-         m68klinux)
-               echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
-               exit 0
-               ;;
-         elf32ppc)
-               # Determine Lib Version
-               cat >$dummy.c <<EOF
-#include <features.h>
-#if defined(__GLIBC__)
-extern char __libc_version[];
-extern char __libc_release[];
-#endif
-main(argc, argv)
-     int argc;
-     char *argv[];
-{
-#if defined(__GLIBC__)
-  printf("%s %s\n", __libc_version, __libc_release);
-#else
-  printf("unkown\n");
-#endif
-  return 0;
-}
-EOF
-               LIBC=""
-               $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
-               if test "$?" = 0 ; then
-                       ./$dummy | grep 1\.99 > /dev/null
-                       if test "$?" = 0 ; then
-                               LIBC="libc1"
-                       fi
-               fi      
-               rm -f $dummy.c $dummy
-               echo powerpc-unknown-linux-gnu${LIBC}
-               exit 0
-               ;;
-       esac
-
-       if test "${UNAME_MACHINE}" = "alpha" ; then
-               sed 's/^        //'  <<EOF >$dummy.s
-               .globl main
-               .ent main
-       main:
-               .frame \$30,0,\$26,0
-               .prologue 0
-               .long 0x47e03d80 # implver $0
-               lda \$2,259
-               .long 0x47e20c21 # amask $2,$1
-               srl \$1,8,\$2
-               sll \$2,2,\$2
-               sll \$0,3,\$0
-               addl \$1,\$0,\$0
-               addl \$2,\$0,\$0
-               ret \$31,(\$26),1
-               .end main
-EOF
-               LIBC=""
-               $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
-               if test "$?" = 0 ; then
-                       ./$dummy
-                       case "$?" in
-                       7)
-                               UNAME_MACHINE="alpha"
-                               ;;
-                       15)
-                               UNAME_MACHINE="alphaev5"
-                               ;;
-                       14)
-                               UNAME_MACHINE="alphaev56"
-                               ;;
-                       10)
-                               UNAME_MACHINE="alphapca56"
-                               ;;
-                       16)
-                               UNAME_MACHINE="alphaev6"
-                               ;;
-                       esac
-
-                       objdump --private-headers $dummy | \
-                         grep ld.so.1 > /dev/null
-                       if test "$?" = 0 ; then
-                               LIBC="libc1"
-                       fi
-               fi
-               rm -f $dummy.s $dummy
-               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
-       elif test "${UNAME_MACHINE}" = "mips" ; then
-         cat >$dummy.c <<EOF
-#ifdef __cplusplus
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __MIPSEB__
-  printf ("%s-unknown-linux-gnu\n", argv[1]);
-#endif
-#ifdef __MIPSEL__
-  printf ("%sel-unknown-linux-gnu\n", argv[1]);
-#endif
-  return 0;
-}
-EOF
-         $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
-         rm -f $dummy.c $dummy
-       else
-         # Either a pre-BFD a.out linker (linux-gnuoldld)
-         # or one that does not give us useful --help.
-         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
-         # If ld does not provide *any* "supported emulations:"
-         # that means it is gnuoldld.
-         echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
-         test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
-
-         case "${UNAME_MACHINE}" in
-         i?86)
-           VENDOR=pc;
-           ;;
-         *)
-           VENDOR=unknown;
-           ;;
-         esac
-         # Determine whether the default compiler is a.out or elf
-         cat >$dummy.c <<EOF
-#include <features.h>
-#ifdef __cplusplus
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __ELF__
-# ifdef __GLIBC__
-#  if __GLIBC__ >= 2
-    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
-#  else
-    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
-#  endif
-# else
-   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
-# endif
-#else
-  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
-#endif
-  return 0;
-}
-EOF
-         $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
-         rm -f $dummy.c $dummy
-       fi ;;
-# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
-# are messed up and put the nodename in both sysname and nodename.
-    i?86:DYNIX/ptx:4*:*)
-       echo i386-sequent-sysv4
-       exit 0 ;;
-    i?86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-       # I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-       exit 0 ;;
-    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
-       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-       else
-               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-       fi
-       exit 0 ;;
-    i?86:*:5:7*)
-        # Fixed at (any) Pentium or better
-        UNAME_MACHINE=i586
-        if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
-           echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
-       else
-           echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
-       fi
-       exit 0 ;;
-    i?86:*:3.2:*)
-       if test -f /usr/options/cb.name; then
-               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-       elif /bin/uname -X 2>/dev/null >/dev/null ; then
-               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
-               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
-               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
-                       && UNAME_MACHINE=i586
-               (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-       else
-               echo ${UNAME_MACHINE}-pc-sysv32
-       fi
-       exit 0 ;;
-    pc:*:*:*)
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-       echo i386-pc-msdosdjgpp
-        exit 0 ;;
-    Intel:Mach:3*:*)
-       echo i386-pc-mach3
-       exit 0 ;;
-    paragon:*:*:*)
-       echo i860-intel-osf1
-       exit 0 ;;
-    i860:*:4.*:*) # i860-SVR4
-       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-       else # Add other i860-SVR4 vendors below as they are discovered.
-         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-       fi
-       exit 0 ;;
-    mini*:CTIX:SYS*5:*)
-       # "miniframe"
-       echo m68010-convergent-sysv
-       exit 0 ;;
-    M68*:*:R3V[567]*:*)
-       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
-       OS_REL=''
-       test -r /etc/.relid \
-       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
-       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && echo i486-ncr-sysv4 && exit 0 ;;
-    m68*:LynxOS:2.*:*)
-       echo m68k-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    mc68030:UNIX_System_V:4.*:*)
-       echo m68k-atari-sysv4
-       exit 0 ;;
-    i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
-       echo i386-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    TSUNAMI:LynxOS:2.*:*)
-       echo sparc-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
-       echo rs6000-unknown-lynxos${UNAME_RELEASE}
-       exit 0 ;;
-    SM[BE]S:UNIX_SV:*:*)
-       echo mips-dde-sysv${UNAME_RELEASE}
-       exit 0 ;;
-    RM*:ReliantUNIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    RM*:SINIX-*:*:*)
-       echo mips-sni-sysv4
-       exit 0 ;;
-    *:SINIX-*:*:*)
-       if uname -p 2>/dev/null >/dev/null ; then
-               UNAME_MACHINE=`(uname -p) 2>/dev/null`
-               echo ${UNAME_MACHINE}-sni-sysv4
-       else
-               echo ns32k-sni-sysv
-       fi
-       exit 0 ;;
-    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                           # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit 0 ;;
-    *:UNIX_System_V:4*:FTX*)
-       # From Gerald Hewes <hewes@openmarket.com>.
-       # How about differentiating between stratus architectures? -djm
-       echo hppa1.1-stratus-sysv4
-       exit 0 ;;
-    *:*:*:FTX*)
-       # From seanf@swdc.stratus.com.
-       echo i860-stratus-sysv4
-       exit 0 ;;
-    mc68*:A/UX:*:*)
-       echo m68k-apple-aux${UNAME_RELEASE}
-       exit 0 ;;
-    news*:NEWS-OS:*:6*)
-       echo mips-sony-newsos6
-       exit 0 ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-       if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
-       else
-               echo mips-unknown-sysv${UNAME_RELEASE}
-       fi
-        exit 0 ;;
-    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
-       echo powerpc-be-beos
-       exit 0 ;;
-    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
-       echo powerpc-apple-beos
-       exit 0 ;;
-    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
-       echo i586-pc-beos
-       exit 0 ;;
-    SX-4:SUPER-UX:*:*)
-       echo sx4-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    SX-5:SUPER-UX:*:*)
-       echo sx5-nec-superux${UNAME_RELEASE}
-       exit 0 ;;
-    Power*:Rhapsody:*:*)
-       echo powerpc-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:Rhapsody:*:*)
-       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-       exit 0 ;;
-    *:QNX:*:4*)
-       echo i386-qnx-qnx${UNAME_VERSION}
-       exit 0 ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-         ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-       printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-       printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-  printf ("vax-dec-bsd\n"); exit (0);
-#else
-  printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
-rm -f $dummy.c $dummy
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-       echo c1-convex-bsd
-       exit 0 ;;
-    c2*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit 0 ;;
-    c34*)
-       echo c34-convex-bsd
-       exit 0 ;;
-    c38*)
-       echo c38-convex-bsd
-       exit 0 ;;
-    c4*)
-       echo c4-convex-bsd
-       exit 0 ;;
-    esac
-fi
-
-#echo '(Unable to guess system type)' 1>&2
-
-exit 1
diff --git a/pcre/config.h b/pcre/config.h
deleted file mode 100644 (file)
index c767cbb..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-/* For Privoxy, we just use Privoxy's config.h */
-
-#include "../config.h"
-
diff --git a/pcre/config.in b/pcre/config.in
deleted file mode 100644 (file)
index 02f4259..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/* On Unix systems config.in is converted by configure into config.h. PCRE is
-written in Standard C, but there are a few non-standard things it can cope
-with, allowing it to run on SunOS4 and other "close to standard" systems.
-
-On a non-Unix system you should just copy this file into config.h and change
-the definitions of HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because
-of the way autoconf works, these cannot be made the defaults. If your system
-has bcopy() and not memmove(), change the definition of HAVE_BCOPY instead of
-HAVE_MEMMOVE. If your system has neither bcopy() nor memmove(), leave them both
-as 0; an emulation function will be used. */
-
-/* Define to empty if the keyword does not work. */
-
-#undef const
-
-/* Define to `unsigned' if <stddef.h> doesn't define size_t. */
-
-#undef size_t
-
-/* The following two definitions are mainly for the benefit of SunOS4, which
-doesn't have the strerror() or memmove() functions that should be present in
-all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should
-normally be defined with the value 1 for other systems, but unfortunately we
-can't make this the default because "configure" files generated by autoconf
-will only change 0 to 1; they won't change 1 to 0 if the functions are not
-found. If HAVE_MEMMOVE is set to 1, the value of HAVE_BCOPY is not relevant. */
-
-#define HAVE_STRERROR 0
-#define HAVE_MEMMOVE  0
-#define HAVE_BCOPY    0
-
-/* End */
diff --git a/pcre/config.sub b/pcre/config.sub
deleted file mode 100644 (file)
index 28426bb..0000000
+++ /dev/null
@@ -1,1232 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script, version 1.1.
-#   Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-if [ x$1 = x ]
-then
-       echo Configuration name missing. 1>&2
-       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
-       echo "or     $0 ALIAS" 1>&2
-       echo where ALIAS is a recognized configuration type. 1>&2
-       exit 1
-fi
-
-# First pass through any local machine types.
-case $1 in
-       *local*)
-               echo $1
-               exit 0
-               ;;
-       *)
-       ;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  linux-gnu*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-       -sun*os*)
-               # Prevent following clause from handling this invalid input.
-               ;;
-       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple)
-               os=
-               basic_machine=$1
-               ;;
-       -sim | -cisco | -oki | -wec | -winbond)
-               os=
-               basic_machine=$1
-               ;;
-       -scout)
-               ;;
-       -wrs)
-               os=-vxworks
-               basic_machine=$1
-               ;;
-       -hiux*)
-               os=-hiuxwe2
-               ;;
-       -sco5)
-               os=-sco3.2v5
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco4)
-               os=-sco3.2v4
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2.[4-9]*)
-               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2v[4-9]*)
-               # Don't forget version if it is 3.2v4 or newer.
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco*)
-               os=-sco3.2v2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -udk*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -isc)
-               os=-isc2.2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -clix*)
-               basic_machine=clipper-intergraph
-               ;;
-       -isc*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -lynx*)
-               os=-lynxos
-               ;;
-       -ptx*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-               ;;
-       -windowsnt*)
-               os=`echo $os | sed -e 's/windowsnt/winnt/'`
-               ;;
-       -psos*)
-               os=-psos
-               ;;
-       -mint | -mint[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-       # Recognize the basic CPU types without company name.
-       # Some are omitted here because they have special meanings below.
-       tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
-               | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
-               | 580 | i960 | h8300 \
-               | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
-               | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
-               | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
-               | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
-               | mips64orion | mips64orionel | mipstx39 | mipstx39el \
-               | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
-               | mips64vr5000 | miprs64vr5000el | mcore \
-               | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
-               | thumb | d10v | fr30)
-               basic_machine=$basic_machine-unknown
-               ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
-               ;;
-
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
-       i[34567]86)
-         basic_machine=$basic_machine-pc
-         ;;
-       # Object if more than one company name word.
-       *-*-*)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-       # Recognize the basic CPU types with company name.
-       # FIXME: clean up the formatting here.
-       vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
-             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
-             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
-             | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
-             | xmp-* | ymp-* \
-             | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
-             | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
-             | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
-             | clipper-* | orion-* \
-             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
-             | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
-             | mips64el-* | mips64orion-* | mips64orionel-* \
-             | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
-             | mipstx39-* | mipstx39el-* | mcore-* \
-             | f301-* | armv*-* | t3e-* \
-             | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
-             | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* )
-               ;;
-       # Recognize the various machine names and aliases which stand
-       # for a CPU type and a company and sometimes even an OS.
-       386bsd)
-               basic_machine=i386-unknown
-               os=-bsd
-               ;;
-       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-               basic_machine=m68000-att
-               ;;
-       3b*)
-               basic_machine=we32k-att
-               ;;
-       a29khif)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       adobe68k)
-               basic_machine=m68010-adobe
-               os=-scout
-               ;;
-       alliant | fx80)
-               basic_machine=fx80-alliant
-               ;;
-       altos | altos3068)
-               basic_machine=m68k-altos
-               ;;
-       am29k)
-               basic_machine=a29k-none
-               os=-bsd
-               ;;
-       amdahl)
-               basic_machine=580-amdahl
-               os=-sysv
-               ;;
-       amiga | amiga-*)
-               basic_machine=m68k-cbm
-               ;;
-       amigaos | amigados)
-               basic_machine=m68k-cbm
-               os=-amigaos
-               ;;
-       amigaunix | amix)
-               basic_machine=m68k-cbm
-               os=-sysv4
-               ;;
-       apollo68)
-               basic_machine=m68k-apollo
-               os=-sysv
-               ;;
-       apollo68bsd)
-               basic_machine=m68k-apollo
-               os=-bsd
-               ;;
-       aux)
-               basic_machine=m68k-apple
-               os=-aux
-               ;;
-       balance)
-               basic_machine=ns32k-sequent
-               os=-dynix
-               ;;
-       convex-c1)
-               basic_machine=c1-convex
-               os=-bsd
-               ;;
-       convex-c2)
-               basic_machine=c2-convex
-               os=-bsd
-               ;;
-       convex-c32)
-               basic_machine=c32-convex
-               os=-bsd
-               ;;
-       convex-c34)
-               basic_machine=c34-convex
-               os=-bsd
-               ;;
-       convex-c38)
-               basic_machine=c38-convex
-               os=-bsd
-               ;;
-       cray | ymp)
-               basic_machine=ymp-cray
-               os=-unicos
-               ;;
-       cray2)
-               basic_machine=cray2-cray
-               os=-unicos
-               ;;
-       [ctj]90-cray)
-               basic_machine=c90-cray
-               os=-unicos
-               ;;
-       crds | unos)
-               basic_machine=m68k-crds
-               ;;
-       da30 | da30-*)
-               basic_machine=m68k-da30
-               ;;
-       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-               basic_machine=mips-dec
-               ;;
-       delta | 3300 | motorola-3300 | motorola-delta \
-             | 3300-motorola | delta-motorola)
-               basic_machine=m68k-motorola
-               ;;
-       delta88)
-               basic_machine=m88k-motorola
-               os=-sysv3
-               ;;
-       dpx20 | dpx20-*)
-               basic_machine=rs6000-bull
-               os=-bosx
-               ;;
-       dpx2* | dpx2*-bull)
-               basic_machine=m68k-bull
-               os=-sysv3
-               ;;
-       ebmon29k)
-               basic_machine=a29k-amd
-               os=-ebmon
-               ;;
-       elxsi)
-               basic_machine=elxsi-elxsi
-               os=-bsd
-               ;;
-       encore | umax | mmax)
-               basic_machine=ns32k-encore
-               ;;
-       es1800 | OSE68k | ose68k | ose | OSE)
-               basic_machine=m68k-ericsson
-               os=-ose
-               ;;
-       fx2800)
-               basic_machine=i860-alliant
-               ;;
-       genix)
-               basic_machine=ns32k-ns
-               ;;
-       gmicro)
-               basic_machine=tron-gmicro
-               os=-sysv
-               ;;
-       h3050r* | hiux*)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       h8300hms)
-               basic_machine=h8300-hitachi
-               os=-hms
-               ;;
-       h8300xray)
-               basic_machine=h8300-hitachi
-               os=-xray
-               ;;
-       h8500hms)
-               basic_machine=h8500-hitachi
-               os=-hms
-               ;;
-       harris)
-               basic_machine=m88k-harris
-               os=-sysv3
-               ;;
-       hp300-*)
-               basic_machine=m68k-hp
-               ;;
-       hp300bsd)
-               basic_machine=m68k-hp
-               os=-bsd
-               ;;
-       hp300hpux)
-               basic_machine=m68k-hp
-               os=-hpux
-               ;;
-       hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k2[0-9][0-9] | hp9k31[0-9])
-               basic_machine=m68000-hp
-               ;;
-       hp9k3[2-9][0-9])
-               basic_machine=m68k-hp
-               ;;
-       hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k78[0-9] | hp78[0-9])
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][13679] | hp8[0-9][13679])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hppa-next)
-               os=-nextstep3
-               ;;
-       hppaosf)
-               basic_machine=hppa1.1-hp
-               os=-osf
-               ;;
-       hppro)
-               basic_machine=hppa1.1-hp
-               os=-proelf
-               ;;
-       i370-ibm* | ibm*)
-               basic_machine=i370-ibm
-               ;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-       i[34567]86v32)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
-               ;;
-       i[34567]86v4*)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
-               ;;
-       i[34567]86v)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv
-               ;;
-       i[34567]86sol2)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-       i386mach)
-               basic_machine=i386-mach
-               os=-mach
-               ;;
-       i386-vsta | vsta)
-               basic_machine=i386-unknown
-               os=-vsta
-               ;;
-       i386-go32 | go32)
-               basic_machine=i386-unknown
-               os=-go32
-               ;;
-       i386-mingw32 | mingw32)
-               basic_machine=i386-unknown
-               os=-mingw32
-               ;;
-       i386-qnx | qnx)
-               basic_machine=i386-qnx
-               ;;
-       iris | iris4d)
-               basic_machine=mips-sgi
-               case $os in
-                   -irix*)
-                       ;;
-                   *)
-                       os=-irix4
-                       ;;
-               esac
-               ;;
-       isi68 | isi)
-               basic_machine=m68k-isi
-               os=-sysv
-               ;;
-       m88k-omron*)
-               basic_machine=m88k-omron
-               ;;
-       magnum | m3230)
-               basic_machine=mips-mips
-               os=-sysv
-               ;;
-       merlin)
-               basic_machine=ns32k-utek
-               os=-sysv
-               ;;
-       miniframe)
-               basic_machine=m68000-convergent
-               ;;
-       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-       mipsel*-linux*)
-               basic_machine=mipsel-unknown
-               os=-linux-gnu
-               ;;
-       mips*-linux*)
-               basic_machine=mips-unknown
-               os=-linux-gnu
-               ;;
-       mips3*-*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-               ;;
-       mips3*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-               ;;
-       monitor)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       msdos)
-               basic_machine=i386-unknown
-               os=-msdos
-               ;;
-       mvs)
-               basic_machine=i370-ibm
-               os=-mvs
-               ;;
-       ncr3000)
-               basic_machine=i486-ncr
-               os=-sysv4
-               ;;
-       netbsd386)
-               basic_machine=i386-unknown
-               os=-netbsd
-               ;;
-       netwinder)
-               basic_machine=armv4l-rebel
-               os=-linux
-               ;;
-       news | news700 | news800 | news900)
-               basic_machine=m68k-sony
-               os=-newsos
-               ;;
-       news1000)
-               basic_machine=m68030-sony
-               os=-newsos
-               ;;
-       news-3600 | risc-news)
-               basic_machine=mips-sony
-               os=-newsos
-               ;;
-       necv70)
-               basic_machine=v70-nec
-               os=-sysv
-               ;;
-       next | m*-next )
-               basic_machine=m68k-next
-               case $os in
-                   -nextstep* )
-                       ;;
-                   -ns2*)
-                     os=-nextstep2
-                       ;;
-                   *)
-                     os=-nextstep3
-                       ;;
-               esac
-               ;;
-       nh3000)
-               basic_machine=m68k-harris
-               os=-cxux
-               ;;
-       nh[45]000)
-               basic_machine=m88k-harris
-               os=-cxux
-               ;;
-       nindy960)
-               basic_machine=i960-intel
-               os=-nindy
-               ;;
-       mon960)
-               basic_machine=i960-intel
-               os=-mon960
-               ;;
-       np1)
-               basic_machine=np1-gould
-               ;;
-       op50n-* | op60c-*)
-               basic_machine=hppa1.1-oki
-               os=-proelf
-               ;;
-       OSE68000 | ose68000)
-               basic_machine=m68000-ericsson
-               os=-ose
-               ;;
-       os68k)
-               basic_machine=m68k-none
-               os=-os68k
-               ;;
-       pa-hitachi)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       paragon)
-               basic_machine=i860-intel
-               os=-osf
-               ;;
-       pbd)
-               basic_machine=sparc-tti
-               ;;
-       pbb)
-               basic_machine=m68k-tti
-               ;;
-        pc532 | pc532-*)
-               basic_machine=ns32k-pc532
-               ;;
-       pentium | p5 | k5 | k6 | nexen)
-               basic_machine=i586-pc
-               ;;
-       pentiumpro | p6 | 6x86)
-               basic_machine=i686-pc
-               ;;
-       pentiumii | pentium2)
-               basic_machine=i786-pc
-               ;;
-       pentium-* | p5-* | k5-* | k6-* | nexen-*)
-               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumpro-* | p6-* | 6x86-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumii-* | pentium2-*)
-               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pn)
-               basic_machine=pn-gould
-               ;;
-       power)  basic_machine=rs6000-ibm
-               ;;
-       ppc)    basic_machine=powerpc-unknown
-               ;;
-       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppcle | powerpclittle | ppc-le | powerpc-little)
-               basic_machine=powerpcle-unknown
-               ;;
-       ppcle-* | powerpclittle-*)
-               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ps2)
-               basic_machine=i386-ibm
-               ;;
-       rom68k)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       rm[46]00)
-               basic_machine=mips-siemens
-               ;;
-       rtpc | rtpc-*)
-               basic_machine=romp-ibm
-               ;;
-       sa29200)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       sequent)
-               basic_machine=i386-sequent
-               ;;
-       sh)
-               basic_machine=sh-hitachi
-               os=-hms
-               ;;
-       sparclite-wrs)
-               basic_machine=sparclite-wrs
-               os=-vxworks
-               ;;
-       sps7)
-               basic_machine=m68k-bull
-               os=-sysv2
-               ;;
-       spur)
-               basic_machine=spur-unknown
-               ;;
-       st2000)
-               basic_machine=m68k-tandem
-               ;;
-       stratus)
-               basic_machine=i860-stratus
-               os=-sysv4
-               ;;
-       sun2)
-               basic_machine=m68000-sun
-               ;;
-       sun2os3)
-               basic_machine=m68000-sun
-               os=-sunos3
-               ;;
-       sun2os4)
-               basic_machine=m68000-sun
-               os=-sunos4
-               ;;
-       sun3os3)
-               basic_machine=m68k-sun
-               os=-sunos3
-               ;;
-       sun3os4)
-               basic_machine=m68k-sun
-               os=-sunos4
-               ;;
-       sun4os3)
-               basic_machine=sparc-sun
-               os=-sunos3
-               ;;
-       sun4os4)
-               basic_machine=sparc-sun
-               os=-sunos4
-               ;;
-       sun4sol2)
-               basic_machine=sparc-sun
-               os=-solaris2
-               ;;
-       sun3 | sun3-*)
-               basic_machine=m68k-sun
-               ;;
-       sun4)
-               basic_machine=sparc-sun
-               ;;
-       sun386 | sun386i | roadrunner)
-               basic_machine=i386-sun
-               ;;
-       symmetry)
-               basic_machine=i386-sequent
-               os=-dynix
-               ;;
-       t3e)
-               basic_machine=t3e-cray
-               os=-unicos
-               ;;
-       tx39)
-               basic_machine=mipstx39-unknown
-               ;;
-       tx39el)
-               basic_machine=mipstx39el-unknown
-               ;;
-       tower | tower-32)
-               basic_machine=m68k-ncr
-               ;;
-       udi29k)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       ultra3)
-               basic_machine=a29k-nyu
-               os=-sym1
-               ;;
-       v810 | necv810)
-               basic_machine=v810-nec
-               os=-none
-               ;;
-       vaxv)
-               basic_machine=vax-dec
-               os=-sysv
-               ;;
-       vms)
-               basic_machine=vax-dec
-               os=-vms
-               ;;
-       vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
-               ;;
-       vxworks960)
-               basic_machine=i960-wrs
-               os=-vxworks
-               ;;
-       vxworks68)
-               basic_machine=m68k-wrs
-               os=-vxworks
-               ;;
-       vxworks29k)
-               basic_machine=a29k-wrs
-               os=-vxworks
-               ;;
-       w65*)
-               basic_machine=w65-wdc
-               os=-none
-               ;;
-       w89k-*)
-               basic_machine=hppa1.1-winbond
-               os=-proelf
-               ;;
-       xmp)
-               basic_machine=xmp-cray
-               os=-unicos
-               ;;
-        xps | xps100)
-               basic_machine=xps100-honeywell
-               ;;
-       z8k-*-coff)
-               basic_machine=z8k-unknown
-               os=-sim
-               ;;
-       none)
-               basic_machine=none-none
-               os=-none
-               ;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-       w89k)
-               basic_machine=hppa1.1-winbond
-               ;;
-       op50n)
-               basic_machine=hppa1.1-oki
-               ;;
-       op60c)
-               basic_machine=hppa1.1-oki
-               ;;
-       mips)
-               if [ x$os = x-linux-gnu ]; then
-                       basic_machine=mips-unknown
-               else
-                       basic_machine=mips-mips
-               fi
-               ;;
-       romp)
-               basic_machine=romp-ibm
-               ;;
-       rs6000)
-               basic_machine=rs6000-ibm
-               ;;
-       vax)
-               basic_machine=vax-dec
-               ;;
-       pdp11)
-               basic_machine=pdp11-dec
-               ;;
-       we32k)
-               basic_machine=we32k-att
-               ;;
-       sparc | sparcv9)
-               basic_machine=sparc-sun
-               ;;
-        cydra)
-               basic_machine=cydra-cydrome
-               ;;
-       orion)
-               basic_machine=orion-highlevel
-               ;;
-       orion105)
-               basic_machine=clipper-highlevel
-               ;;
-       mac | mpw | mac-mpw)
-               basic_machine=m68k-apple
-               ;;
-       pmac | pmac-mpw)
-               basic_machine=powerpc-apple
-               ;;
-       c4x*)
-               basic_machine=c4x-none
-               os=-coff
-               ;;
-       *)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-       *-digital*)
-               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-               ;;
-       *-commodore*)
-               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-               ;;
-       *)
-               ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-       # -solaris* is a basic system type, with this one exception.
-       -solaris1 | -solaris1.*)
-               os=`echo $os | sed -e 's|solaris1|sunos4|'`
-               ;;
-       -solaris)
-               os=-solaris2
-               ;;
-       -svr4*)
-               os=-sysv4
-               ;;
-       -unixware*)
-               os=-sysv4.2uw
-               ;;
-       -gnu/linux*)
-               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-               ;;
-       # First accept the basic system types.
-       # The portable systems comes first.
-       # Each alternative MUST END IN A *, to match a version number.
-       # -sysv* is not here because it comes later, after sysvr4.
-       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* \
-             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
-             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
-             | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*)
-       # Remember, each alternative MUST END IN *, to match a version number.
-               ;;
-       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
-             | -macos* | -mpw* | -magic* | -mon960* | -lnews*)
-               ;;
-       -mac*)
-               os=`echo $os | sed -e 's|mac|macos|'`
-               ;;
-       -linux*)
-               os=`echo $os | sed -e 's|linux|linux-gnu|'`
-               ;;
-       -sunos5*)
-               os=`echo $os | sed -e 's|sunos5|solaris2|'`
-               ;;
-       -sunos6*)
-               os=`echo $os | sed -e 's|sunos6|solaris3|'`
-               ;;
-       -opened*)
-               os=-openedition
-               ;;
-       -osfrose*)
-               os=-osfrose
-               ;;
-       -osf*)
-               os=-osf
-               ;;
-       -utek*)
-               os=-bsd
-               ;;
-       -dynix*)
-               os=-bsd
-               ;;
-       -acis*)
-               os=-aos
-               ;;
-       -386bsd)
-               os=-bsd
-               ;;
-       -ctix* | -uts*)
-               os=-sysv
-               ;;
-       -ns2 )
-               os=-nextstep2
-               ;;
-       # Preserve the version number of sinix5.
-       -sinix5.*)
-               os=`echo $os | sed -e 's|sinix|sysv|'`
-               ;;
-       -sinix*)
-               os=-sysv4
-               ;;
-       -triton*)
-               os=-sysv3
-               ;;
-       -oss*)
-               os=-sysv3
-               ;;
-        -qnx)
-               os=-qnx4
-               ;;
-       -svr4)
-               os=-sysv4
-               ;;
-       -svr3)
-               os=-sysv3
-               ;;
-       -sysvr4)
-               os=-sysv4
-               ;;
-       # This must come after -sysvr4.
-       -sysv*)
-               ;;
-       -ose*)
-               os=-ose
-               ;;
-       -es1800*)
-               os=-ose
-               ;;
-       -xenix)
-               os=-xenix
-               ;;
-        -*mint | -*MiNT)
-               os=-mint
-               ;;
-       -none)
-               ;;
-       *)
-               # Get rid of the `-' at the beginning of $os.
-               os=`echo $os | sed 's/[^-]*-//'`
-               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-       *-acorn)
-               os=-riscix1.2
-               ;;
-       arm*-rebel)
-               os=-linux
-               ;;
-       arm*-semi)
-               os=-aout
-               ;;
-        pdp11-*)
-               os=-none
-               ;;
-       *-dec | vax-*)
-               os=-ultrix4.2
-               ;;
-       m68*-apollo)
-               os=-domain
-               ;;
-       i386-sun)
-               os=-sunos4.0.2
-               ;;
-       m68000-sun)
-               os=-sunos3
-               # This also exists in the configure program, but was not the
-               # default.
-               # os=-sunos4
-               ;;
-       m68*-cisco)
-               os=-aout
-               ;;
-       mips*-cisco)
-               os=-elf
-               ;;
-       mips*-*)
-               os=-elf
-               ;;
-       *-tti)  # must be before sparc entry or we get the wrong os.
-               os=-sysv3
-               ;;
-       sparc-* | *-sun)
-               os=-sunos4.1.1
-               ;;
-       *-be)
-               os=-beos
-               ;;
-       *-ibm)
-               os=-aix
-               ;;
-       *-wec)
-               os=-proelf
-               ;;
-       *-winbond)
-               os=-proelf
-               ;;
-       *-oki)
-               os=-proelf
-               ;;
-       *-hp)
-               os=-hpux
-               ;;
-       *-hitachi)
-               os=-hiux
-               ;;
-       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-               os=-sysv
-               ;;
-       *-cbm)
-               os=-amigaos
-               ;;
-       *-dg)
-               os=-dgux
-               ;;
-       *-dolphin)
-               os=-sysv3
-               ;;
-       m68k-ccur)
-               os=-rtu
-               ;;
-       m88k-omron*)
-               os=-luna
-               ;;
-       *-next )
-               os=-nextstep
-               ;;
-       *-sequent)
-               os=-ptx
-               ;;
-       *-crds)
-               os=-unos
-               ;;
-       *-ns)
-               os=-genix
-               ;;
-       i370-*)
-               os=-mvs
-               ;;
-       *-next)
-               os=-nextstep3
-               ;;
-        *-gould)
-               os=-sysv
-               ;;
-        *-highlevel)
-               os=-bsd
-               ;;
-       *-encore)
-               os=-bsd
-               ;;
-        *-sgi)
-               os=-irix
-               ;;
-        *-siemens)
-               os=-sysv4
-               ;;
-       *-masscomp)
-               os=-rtu
-               ;;
-       f301-fujitsu)
-               os=-uxpv
-               ;;
-       *-rom68k)
-               os=-coff
-               ;;
-       *-*bug)
-               os=-coff
-               ;;
-       *-apple)
-               os=-macos
-               ;;
-       *-atari*)
-               os=-mint
-               ;;
-       *)
-               os=-none
-               ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-       *-unknown)
-               case $os in
-                       -riscix*)
-                               vendor=acorn
-                               ;;
-                       -sunos*)
-                               vendor=sun
-                               ;;
-                       -aix*)
-                               vendor=ibm
-                               ;;
-                       -beos*)
-                               vendor=be
-                               ;;
-                       -hpux*)
-                               vendor=hp
-                               ;;
-                       -mpeix*)
-                               vendor=hp
-                               ;;
-                       -hiux*)
-                               vendor=hitachi
-                               ;;
-                       -unos*)
-                               vendor=crds
-                               ;;
-                       -dgux*)
-                               vendor=dg
-                               ;;
-                       -luna*)
-                               vendor=omron
-                               ;;
-                       -genix*)
-                               vendor=ns
-                               ;;
-                       -mvs* | -opened*)
-                               vendor=ibm
-                               ;;
-                       -ptx*)
-                               vendor=sequent
-                               ;;
-                       -vxsim* | -vxworks*)
-                               vendor=wrs
-                               ;;
-                       -aux*)
-                               vendor=apple
-                               ;;
-                       -hms*)
-                               vendor=hitachi
-                               ;;
-                       -mpw* | -macos*)
-                               vendor=apple
-                               ;;
-                       -*mint | -*MiNT)
-                               vendor=atari
-                               ;;
-               esac
-               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-               ;;
-esac
-
-echo $basic_machine$os
diff --git a/pcre/configure.in b/pcre/configure.in
deleted file mode 100644 (file)
index c98387d..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-
-dnl This is required at the start; the name is the name of a file
-dnl it should be seeing, to verify it is in the same directory.
-
-AC_INIT(dftables.c)
-
-dnl Arrange to build config.h from config.in. Note that pcre.h is
-dnl built differently, as it is just a "substitution" file.
-dnl Manual says this macro should come right after AC_INIT.
-AC_CONFIG_HEADER(config.h:config.in)
-
-dnl Provide the current PCRE version information. Do not use numbers
-dnl with leading zeros for the minor version, as they end up in a C
-dnl macro, and may be treated as octal constants. Stick to single
-dnl digits for minor numbers less than 10. There are unlikely to be
-dnl that many releases anyway.
-
-PCRE_MAJOR=3
-PCRE_MINOR=4
-PCRE_DATE=22-Aug-2000
-PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
-
-dnl Provide versioning information for libtool shared libraries that
-dnl are built by default on Unix systems.
-
-PCRE_LIB_VERSION=0:1:0
-PCRE_POSIXLIB_VERSION=0:0:0
-
-dnl Checks for programs.
-
-AC_PROG_CC
-AC_PROG_RANLIB
-
-dnl Checks for header files.
-
-AC_HEADER_STDC
-AC_CHECK_HEADERS(limits.h)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-dnl Checks for library functions.
-
-AC_CHECK_FUNCS(bcopy memmove strerror)
-
-dnl Handle --enable-shared-libraries
-
-LIBTOOL=./libtool
-LIBSUFFIX=la
-AC_ARG_ENABLE(shared,
-[  --disable-shared        build PCRE as a static library],
-if test "$enableval" = "no"; then
-  LIBTOOL=
-  LIBSUFFIX=a
-fi
-)
-
-dnl Handle --enable-utf8
-
-AC_ARG_ENABLE(utf8,
-[  --enable-utf8           enable UTF8 support (incomplete)],
-if test "$enableval" = "yes"; then
-  UTF8=-DSUPPORT_UTF8
-fi
-)
-
-dnl "Export" these variables
-
-AC_SUBST(HAVE_MEMMOVE)
-AC_SUBST(HAVE_STRERROR)
-AC_SUBST(LIBTOOL)
-AC_SUBST(LIBSUFFIX)
-AC_SUBST(UTF8)
-AC_SUBST(PCRE_MAJOR)
-AC_SUBST(PCRE_MINOR)
-AC_SUBST(PCRE_DATE)
-AC_SUBST(PCRE_VERSION)
-AC_SUBST(PCRE_LIB_VERSION)
-AC_SUBST(PCRE_POSIXLIB_VERSION)
-
-dnl This must be last; it determines what files are written
-AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in,[chmod a+x RunTest pcre-config])
diff --git a/pcre/dftables.c b/pcre/dftables.c
deleted file mode 100644 (file)
index d572dfd..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-
-See the file Tech.Notes for some information on the internals.
-*/
-
-
-/* This is a support program to generate the file chartables.c, containing
-character tables of various kinds. They are built according to the default C
-locale and used as the default tables by PCRE. Now that pcre_maketables is
-a function visible to the outside world, we make use of its code from here in
-order to be consistent. */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "internal.h"
-
-#define DFTABLES          /* maketables.c notices this */
-#include "maketables.c"
-
-
-int main(void)
-{
-int i;
-unsigned const char *tables = pcre_maketables();
-
-printf(
-  "/*************************************************\n"
-  "*      Perl-Compatible Regular Expressions       *\n"
-  "*************************************************/\n\n"
-  "/* This file is automatically written by the dftables auxiliary \n"
-  "program. If you edit it by hand, you might like to edit the Makefile to \n"
-  "prevent its ever being regenerated.\n\n"
-  "This file is #included in the compilation of pcre.c to build the default\n"
-  "character tables which are used when no tables are passed to the compile\n"
-  "function. */\n\n"
-  "static unsigned char pcre_default_tables[] = {\n\n"
-  "/* This table is a lower casing table. */\n\n");
-
-printf("  ");
-for (i = 0; i < 256; i++)
-  {
-  if ((i & 7) == 0 && i != 0) printf("\n  ");
-  printf("%3d", *tables++);
-  if (i != 255) printf(",");
-  }
-printf(",\n\n");
-
-printf("/* This table is a case flipping table. */\n\n");
-
-printf("  ");
-for (i = 0; i < 256; i++)
-  {
-  if ((i & 7) == 0 && i != 0) printf("\n  ");
-  printf("%3d", *tables++);
-  if (i != 255) printf(",");
-  }
-printf(",\n\n");
-
-printf(
-  "/* This table contains bit maps for various character classes.\n"
-  "Each map is 32 bytes long and the bits run from the least\n"
-  "significant end of each byte. The classes that have their own\n"
-  "maps are: space, xdigit, digit, upper, lower, word, graph\n"
-  "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
-
-printf("  ");
-for (i = 0; i < cbit_length; i++)
-  {
-  if ((i & 7) == 0 && i != 0)
-    {
-    if ((i & 31) == 0) printf("\n");
-    printf("\n  ");
-    }
-  printf("0x%02x", *tables++);
-  if (i != cbit_length - 1) printf(",");
-  }
-printf(",\n\n");
-
-printf(
-  "/* This table identifies various classes of character by individual bits:\n"
-  "  0x%02x   white space character\n"
-  "  0x%02x   letter\n"
-  "  0x%02x   decimal digit\n"
-  "  0x%02x   hexadecimal digit\n"
-  "  0x%02x   alphanumeric or '_'\n"
-  "  0x%02x   regular expression metacharacter or binary zero\n*/\n\n",
-  ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
-  ctype_meta);
-
-printf("  ");
-for (i = 0; i < 256; i++)
-  {
-  if ((i & 7) == 0 && i != 0)
-    {
-    printf(" /* ");
-    if (isprint(i-8)) printf(" %c -", i-8);
-      else printf("%3d-", i-8);
-    if (isprint(i-1)) printf(" %c ", i-1);
-      else printf("%3d", i-1);
-    printf(" */\n  ");
-    }
-  printf("0x%02x", *tables++);
-  if (i != 255) printf(",");
-  }
-
-printf("};/* ");
-if (isprint(i-8)) printf(" %c -", i-8);
-  else printf("%3d-", i-8);
-if (isprint(i-1)) printf(" %c ", i-1);
-  else printf("%3d", i-1);
-printf(" */\n\n/* End of chartables.c */\n");
-
-return 0;
-}
-
-/* End of dftables.c */
diff --git a/pcre/dll.mk b/pcre/dll.mk
deleted file mode 100644 (file)
index d8b728e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# dll.mk - auxilary Makefile to easy build dll's for mingw32 target
-# ver. 0.6 of 1999-03-25
-#
-# Homepage of this makefile - http://www.is.lg.ua/~paul/devel/
-# Homepage of original mingw32 project -
-#                    http://www.fu.is.saga-u.ac.jp/~colin/gcc.html
-#
-# How to use:
-# This makefile can:
-# 1. Create automatical .def file from list of objects
-# 2. Create .dll from objects and .def file, either automatical, or your
-#    hand-written (maybe) file, which must have same basename as dll
-# WARNING! There MUST be object, which name match dll's name. Make sux.
-# 3. Create import library from .def (as for .dll, only its name required,
-#    not dll itself)
-#    By convention implibs for dll have .dll.a suffix, e.g. libstuff.dll.a
-#    Why not just libstuff.a? 'Cos that's name for static lib, ok?
-# Process divided into 3 phases because:
-# 1. Pre-existent .def possible
-# 2. Generating implib is enough time-consuming
-#
-# Variables:
-#   DLL_LDLIBS  - libs for linking dll
-#   DLL_LDFLAGS - flags for linking dll
-#
-# By using $(DLL_SUFFIX) instead of 'dll', e.g. stuff.$(DLL_SUFFIX)
-# you may help porting makefiles to other platforms
-#
-# Put this file in your make's include path (e.g. main include dir, for
-# more information see include section in make doc). Put in the beginning
-# of your own Makefile line "include dll.mk". Specify dependences, e.g.:
-#
-# Do all stuff in one step
-# libstuff.dll.a: $(OBJECTS) stuff.def
-# stuff.def: $(OBJECTS)
-#
-# Steps separated, pre-provided .def, link with user32
-#
-# DLL_LDLIBS=-luser32
-# stuff.dll: $(OBJECTS)
-# libstuff.dll.a: $(OBJECTS)
-
-
-DLLWRAP=dllwrap
-DLLTOOL=dlltool
-
-DLL_SUFFIX=dll
-
-.SUFFIXES: .o .$(DLL_SUFFIX)
-
-_%.def: %.o
-      $(DLLTOOL) --export-all --output-def $@ $^
-
-%.$(DLL_SUFFIX): %.o
-      $(DLLWRAP) --dllname $(notdir $@) --driver-name $(CC) --def $*.def -o $@ $(filter %.o,$^) $(DLL_LDFLAGS) $(DLL_LDLIBS)
-
-lib%.$(DLL_SUFFIX).a:%.def
-      $(DLLTOOL) --dllname $(notdir $*.dll) --def $< --output-lib $@
-
-# End
diff --git a/pcre/doc/ChangeLog b/pcre/doc/ChangeLog
deleted file mode 100644 (file)
index 2133dd7..0000000
+++ /dev/null
@@ -1,655 +0,0 @@
-ChangeLog for PCRE
-------------------
-
-
-Version 3.4 22-Aug-00
----------------------
-
-1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.
-
-2. Diagnose condition (?(0) as an error instead of crashing on matching.
-
-
-Version 3.3 01-Aug-00
----------------------
-
-1. If an octal character was given, but the value was greater than \377, it
-was not getting masked to the least significant bits, as documented. This could
-lead to crashes in some systems.
-
-2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
-the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.
-
-3. Added the functions pcre_free_substring() and pcre_free_substring_list().
-These just pass their arguments on to (pcre_free)(), but they are provided
-because some uses of PCRE bind it to non-C systems that can call its functions,
-but cannot call free() or pcre_free() directly.
-
-4. Add "make test" as a synonym for "make check". Corrected some comments in
-the Makefile.
-
-5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
-Makefile.
-
-6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
-command called pgrep for grepping around the active processes.
-
-7. Added the beginnings of support for UTF-8 character strings.
-
-8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
-RANLIB to ./ltconfig so that they are used by libtool. I think these are all
-the relevant ones. (AR is not passed because ./ltconfig does its own figuring
-out for the ar command.)
-
-
-Version 3.2 12-May-00
----------------------
-
-This is purely a bug fixing release.
-
-1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
-of ZA. This was just one example of several cases that could provoke this bug,
-which was introduced by change 9 of version 2.00. The code for breaking
-infinite loops after an iteration that matches an empty string was't working
-correctly.
-
-2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
-when matched against abbab (for example). After matching an empty string, it
-wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
-caused it to match further down the string than it should.
-
-3. The code contained an inclusion of sys/types.h. It isn't clear why this
-was there because it doesn't seem to be needed, and it causes trouble on some
-systems, as it is not a Standard C header. It has been removed.
-
-4. Made 4 silly changes to the source to avoid stupid compiler warnings that
-were reported on the Macintosh. The changes were from
-
-  while ((c = *(++ptr)) != 0 && c != '\n');
-to
-  while ((c = *(++ptr)) != 0 && c != '\n') ;
-
-Totally extraordinary, but if that's what it takes...
-
-5. PCRE is being used in one environment where neither memmove() nor bcopy() is
-available. Added HAVE_BCOPY and an autoconf test for it; if neither
-HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
-assumes the way PCRE uses memmove() (always moving upwards).
-
-6. PCRE is being used in one environment where strchr() is not available. There
-was only one use in pcre.c, and writing it out to avoid strchr() probably gives
-faster code anyway.
-
-
-Version 3.1 09-Feb-00
----------------------
-
-The only change in this release is the fixing of some bugs in Makefile.in for
-the "install" target:
-
-(1) It was failing to install pcreposix.h.
-
-(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.
-
-
-Version 3.0 01-Feb-00
----------------------
-
-1. Add support for the /+ modifier to perltest (to output $` like it does in
-pcretest).
-
-2. Add support for the /g modifier to perltest.
-
-3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
-matches null strings.
-
-4. Fix perltest so that it doesn't do unwanted things when fed an empty
-pattern. Perl treats empty patterns specially - it reuses the most recent
-pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
-effect.
-
-5. The POSIX interface was broken in that it was just handing over the POSIX
-captured string vector to pcre_exec(), but (since release 2.00) PCRE has
-required a bigger vector, with some working space on the end. This means that
-the POSIX wrapper now has to get and free some memory, and copy the results.
-
-6. Added some simple autoconf support, placing the test data and the
-documentation in separate directories, re-organizing some of the
-information files, and making it build pcre-config (a GNU standard). Also added
-libtool support for building PCRE as a shared library, which is now the
-default.
-
-7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
-09 are not valid octal constants. Single digits will be used for minor values
-less than 10.
-
-8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
-existing programs that set these in the POSIX interface can use PCRE without
-modification.
-
-9. Added a new function, pcre_fullinfo() with an extensible interface. It can
-return all that pcre_info() returns, plus additional data. The pcre_info()
-function is retained for compatibility, but is considered to be obsolete.
-
-10. Added experimental recursion feature (?R) to handle one common case that
-Perl 5.6 will be able to do with (?p{...}).
-
-11. Added support for POSIX character classes like [:alpha:], which Perl is
-adopting.
-
-
-Version 2.08 31-Aug-99
-----------------------
-
-1. When startoffset was not zero and the pattern began with ".*", PCRE was not
-trying to match at the startoffset position, but instead was moving forward to
-the next newline as if a previous match had failed.
-
-2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
-and could get into a loop if a null string was matched other than at the start
-of the subject.
-
-3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
-be distinguished at compile time, and for completeness also added PCRE_DATE.
-
-5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
-in GnuWin32 environments.
-
-
-Version 2.07 29-Jul-99
-----------------------
-
-1. The documentation is now supplied in plain text form and HTML as well as in
-the form of man page sources.
-
-2. C++ compilers don't like assigning (void *) values to other pointer types.
-In particular this affects malloc(). Although there is no problem in Standard
-C, I've put in casts to keep C++ compilers happy.
-
-3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
-should be (const char *).
-
-4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
-be useful for non-Unix systems who don't want to bother with the POSIX stuff.
-However, I haven't made this a standard facility. The documentation doesn't
-mention it, and the Makefile doesn't support it.
-
-5. The Makefile now contains an "install" target, with editable destinations at
-the top of the file. The pcretest program is not installed.
-
-6. pgrep -V now gives the PCRE version number and date.
-
-7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
-causing the entire string to be ignored, instead of just the last character.
-
-8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
-non-matching string, it can take a very, very long time, even for strings of
-quite modest length, because of the nested recursion. PCRE now does better in
-some of these cases. It does this by remembering the last required literal
-character in the pattern, and pre-searching the subject to ensure it is present
-before running the real match. In other words, it applies a heuristic to detect
-some types of certain failure quickly, and in the above example, if presented
-with a string that has no trailing " it gives "no match" very quickly.
-
-9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
-other alternatives are tried instead.
-
-
-Version 2.06 09-Jun-99
-----------------------
-
-1. Change pcretest's output for amount of store used to show just the code
-space, because the remainder (the data block) varies in size between 32-bit and
-64-bit systems.
-
-2. Added an extra argument to pcre_exec() to supply an offset in the subject to
-start matching at. This allows lookbehinds to work when searching for multiple
-occurrences in a string.
-
-3. Added additional options to pcretest for testing multiple occurrences:
-
-   /+   outputs the rest of the string that follows a match
-   /g   loops for multiple occurrences, using the new startoffset argument
-   /G   loops for multiple occurrences by passing an incremented pointer
-
-4. PCRE wasn't doing the "first character" optimization for patterns starting
-with \b or \B, though it was doing it for other lookbehind assertions. That is,
-it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
-the letter 'x'. On long subject strings, this gives a significant speed-up.
-
-
-Version 2.05 21-Apr-99
-----------------------
-
-1. Changed the type of magic_number from int to long int so that it works
-properly on 16-bit systems.
-
-2. Fixed a bug which caused patterns starting with .* not to work correctly
-when the subject string contained newline characters. PCRE was assuming
-anchoring for such patterns in all cases, which is not correct because .* will
-not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
-DOTALL is set at top level; otherwise it knows that patterns starting with .*
-must be retried after every newline in the subject.
-
-
-Version 2.04 18-Feb-99
-----------------------
-
-1. For parenthesized subpatterns with repeats whose minimum was zero, the
-computation of the store needed to hold the pattern was incorrect (too large).
-If such patterns were nested a few deep, this could multiply and become a real
-problem.
-
-2. Added /M option to pcretest to show the memory requirement of a specific
-pattern. Made -m a synonym of -s (which does this globally) for compatibility.
-
-3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
-compiled in such a way that the backtracking after subsequent failure was
-pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
-((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.
-
-
-Version 2.03 02-Feb-99
-----------------------
-
-1. Fixed typo and small mistake in man page.
-
-2. Added 4th condition (GPL supersedes if conflict) and created separate
-LICENCE file containing the conditions.
-
-3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
-Perl, that is the internal \ allows the delimiter to be included in the
-pattern. Locked out the use of \ as a delimiter. If \ immediately follows
-the final delimiter, add \ to the end of the pattern (to test the error).
-
-4. Added the convenience functions for extracting substrings after a successful
-match. Updated pcretest to make it able to test these functions.
-
-
-Version 2.02 14-Jan-99
-----------------------
-
-1. Initialized the working variables associated with each extraction so that
-their saving and restoring doesn't refer to uninitialized store.
-
-2. Put dummy code into study.c in order to trick the optimizer of the IBM C
-compiler for OS/2 into generating correct code. Apparently IBM isn't going to
-fix the problem.
-
-3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
-calls, and wasn't printing the correct value for compiling calls. Increased the
-default value of LOOPREPEAT, and the number of significant figures in the
-times.
-
-4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.
-
-5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
-a building problem on Windows NT with a FAT file system.
-
-
-Version 2.01 21-Oct-98
-----------------------
-
-1. Changed the API for pcre_compile() to allow for the provision of a pointer
-to character tables built by pcre_maketables() in the current locale. If NULL
-is passed, the default tables are used.
-
-
-Version 2.00 24-Sep-98
-----------------------
-
-1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
-it any more.
-
-2. Allow quantification of (?>) groups, and make it work correctly.
-
-3. The first character computation wasn't working for (?>) groups.
-
-4. Correct the implementation of \Z (it is permitted to match on the \n at the
-end of the subject) and add 5.005's \z, which really does match only at the
-very end of the subject.
-
-5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.
-
-6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
-DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
-localized options. All options to pcre_study() were also removed.
-
-7. Add other new features from 5.005:
-
-   $(?<=           positive lookbehind
-   $(?<!           negative lookbehind
-   (?imsx-imsx)    added the unsetting capability
-                   such a setting is global if at outer level; local otherwise
-   (?imsx-imsx:)   non-capturing groups with option setting
-   (?(cond)re|re)  conditional pattern matching
-
-   A backreference to itself in a repeated group matches the previous
-   captured string.
-
-8. General tidying up of studying (both automatic and via "study")
-consequential on the addition of new assertions.
-
-9. As in 5.005, unlimited repeated groups that could match an empty substring
-are no longer faulted at compile time. Instead, the loop is forcibly broken at
-runtime if any iteration does actually match an empty substring.
-
-10. Include the RunTest script in the distribution.
-
-11. Added tests from the Perl 5.005_02 distribution. This showed up a few
-discrepancies, some of which were old and were also with respect to 5.004. They
-have now been fixed.
-
-
-Version 1.09 28-Apr-98
-----------------------
-
-1. A negated single character class followed by a quantifier with a minimum
-value of one (e.g.  [^x]{1,6}  ) was not compiled correctly. This could lead to
-program crashes, or just wrong answers. This did not apply to negated classes
-containing more than one character, or to minima other than one.
-
-
-Version 1.08 27-Mar-98
-----------------------
-
-1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.
-
-2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
-latter must appear before anything that relies on it in the pattern.
-
-
-Version 1.07 16-Feb-98
-----------------------
-
-1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
-repeat of a potentially empty string).
-
-
-Version 1.06 23-Jan-98
-----------------------
-
-1. Added Markus Oberhumer's little patches for C++.
-
-2. Literal strings longer than 255 characters were broken.
-
-
-Version 1.05 23-Dec-97
-----------------------
-
-1. Negated character classes containing more than one character were failing if
-PCRE_CASELESS was set at run time.
-
-
-Version 1.04 19-Dec-97
-----------------------
-
-1. Corrected the man page, where some "const" qualifiers had been omitted.
-
-2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
-input syntax.
-
-3. Fixed memory leak which occurred when a regex with back references was
-matched with an offsets vector that wasn't big enough. The temporary memory
-that is used in this case wasn't being freed if the match failed.
-
-4. Tidied pcretest to ensure it frees memory that it gets.
-
-5. Temporary memory was being obtained in the case where the passed offsets
-vector was exactly big enough.
-
-6. Corrected definition of offsetof() from change 5 below.
-
-7. I had screwed up change 6 below and broken the rules for the use of
-setjmp(). Now fixed.
-
-
-Version 1.03 18-Dec-97
-----------------------
-
-1. A erroneous regex with a missing opening parenthesis was correctly
-diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
-on some systems.
-
-2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
-it was reported that one broken compiler failed on the former because "code" is
-also an independent variable.
-
-3. The erroneous regex a[]b caused an array overrun reference.
-
-4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
-fail on data ending with that character. (It was going on too far, and checking
-the next character, typically a binary zero.) This was specific to the
-optimized code for single-character negative classes.
-
-5. Added a contributed patch from the TIN world which does the following:
-
-  + Add an undef for memmove, in case the the system defines a macro for it.
-
-  + Add a definition of offsetof(), in case there isn't one. (I don't know
-    the reason behind this - offsetof() is part of the ANSI standard - but
-    it does no harm).
-
-  + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
-    most of the places where whitespace preceded '#'. I have given up and
-    allowed the remaining 2 cases to be at the margin.
-
-  + Rename some variables in pcre to eliminate shadowing. This seems very
-    pedantic, but does no harm, of course.
-
-6. Moved the call to setjmp() into its own function, to get rid of warnings
-from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.
-
-7. Constructs such as \d{8,} were compiling into the equivalent of
-\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
-outcome, but in this particular case used more store than had been allocated,
-which caused the bug to be discovered because it threw up an internal error.
-
-8. The debugging code in both pcre and pcretest for outputting the compiled
-form of a regex was going wrong in the case of back references followed by
-curly-bracketed repeats.
-
-
-Version 1.02 12-Dec-97
-----------------------
-
-1. Typos in pcre.3 and comments in the source fixed.
-
-2. Applied a contributed patch to get rid of places where it used to remove
-'const' from variables, and fixed some signed/unsigned and uninitialized
-variable warnings.
-
-3. Added the "runtest" target to Makefile.
-
-4. Set default compiler flag to -O2 rather than just -O.
-
-
-Version 1.01 19-Nov-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
-like /([ab]*)*/, that is, for classes with more than one character in them.
-
-2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
-as /((?>a*))*/ (a PCRE_EXTRA facility).
-
-
-Version 1.00 18-Nov-97
-----------------------
-
-1. Added compile-time macros to support systems such as SunOS4 which don't have
-memmove() or strerror() but have other things that can be used instead.
-
-2. Arranged that "make clean" removes the executables.
-
-
-Version 0.99 27-Oct-97
-----------------------
-
-1. Fixed bug in code for optimizing classes with only one character. It was
-initializing a 32-byte map regardless, which could cause it to run off the end
-of the memory it had got.
-
-2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.
-
-
-Version 0.98 22-Oct-97
-----------------------
-
-1. Fixed bug in code for handling temporary memory usage when there are more
-back references than supplied space in the ovector. This could cause segfaults.
-
-
-Version 0.97 21-Oct-97
-----------------------
-
-1. Added the \X "cut" facility, conditional on PCRE_EXTRA.
-
-2. Optimized negated single characters not to use a bit map.
-
-3. Brought error texts together as macro definitions; clarified some of them;
-fixed one that was wrong - it said "range out of order" when it meant "invalid
-escape sequence".
-
-4. Changed some char * arguments to const char *.
-
-5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).
-
-6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
-pcretest.
-
-
-Version 0.96 16-Oct-97
-----------------------
-
-1. Added a simple "pgrep" utility to the distribution.
-
-2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
-unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
-where "ddd" means "one or more decimal digits".
-
-3. Fixed serious bug. If a pattern had a back reference, but the call to
-pcre_exec() didn't supply a large enough ovector to record the related
-identifying subpattern, the match always failed. PCRE now remembers the number
-of the largest back reference, and gets some temporary memory in which to save
-the offsets during matching if necessary, in order to ensure that
-backreferences always work.
-
-4. Increased the compatibility with Perl in a number of ways:
-
-  (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
-      to request this handling. The option can be set at compile or exec time.
-
-  (b) $ matches before a terminating newline by default; an option
-      PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
-      mode). The option can be set at compile or exec time.
-
-  (c) The handling of \ followed by a digit other than 0 is now supposed to be
-      the same as Perl's. If the decimal number it represents is less than 10
-      or there aren't that many previous left capturing parentheses, an octal
-      escape is read. Inside a character class, it's always an octal escape,
-      even if it is a single digit.
-
-  (d) An escaped but undefined alphabetic character is taken as a literal,
-      unless PCRE_EXTRA is set. Currently this just reserves the remaining
-      escapes.
-
-  (e) {0} is now permitted. (The previous item is removed from the compiled
-      pattern).
-
-5. Changed all the names of code files so that the basic parts are no longer
-than 10 characters, and abolished the teeny "globals.c" file.
-
-6. Changed the handling of character classes; they are now done with a 32-byte
-bit map always.
-
-7. Added the -d and /D options to pcretest to make it possible to look at the
-internals of compilation without having to recompile pcre.
-
-
-Version 0.95 23-Sep-97
-----------------------
-
-1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
-\x20 at the start of a run of normal characters. These were being treated as
-real characters, instead of the source characters being re-checked.
-
-
-Version 0.94 18-Sep-97
-----------------------
-
-1. The functions are now thread-safe, with the caveat that the global variables
-containing pointers to malloc() and free() or alternative functions are the
-same for all threads.
-
-2. Get pcre_study() to generate a bitmap of initial characters for non-
-anchored patterns when this is possible, and use it if passed to pcre_exec().
-
-
-Version 0.93 15-Sep-97
-----------------------
-
-1. /(b)|(:+)/ was computing an incorrect first character.
-
-2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
-but not actually doing anything yet.
-
-3. Treat "-" characters in classes that cannot be part of ranges as literals,
-as Perl does (e.g. [-az] or [az-]).
-
-4. Set the anchored flag if a branch starts with .* or .*? because that tests
-all possible positions.
-
-5. Split up into different modules to avoid including unneeded functions in a
-compiled binary. However, compile and exec are still in one module. The "study"
-function is split off.
-
-6. The character tables are now in a separate module whose source is generated
-by an auxiliary program - but can then be edited by hand if required. There are
-now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
-toupper() in the code.
-
-7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
-make them global. Abolish the function for setting them, as the caller can now
-set them directly.
-
-
-Version 0.92 11-Sep-97
-----------------------
-
-1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
-(e.g. /a{1,3}/) was broken (I mis-optimized it).
-
-2. Caseless matching was not working in character classes if the characters in
-the pattern were in upper case.
-
-3. Make ranges like [W-c] work in the same way as Perl for caseless matching.
-
-4. Make PCRE_ANCHORED public and accept as a compile option.
-
-5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
-PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
-pass them.
-
-6. Give an error if bad option bits passed at compile or run time.
-
-7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
-pcretest to cause it to pass that flag.
-
-8. Add pcre_info(), to get the number of identifying subpatterns, the stored
-options, and the first character, if set.
-
-9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.
-
-
-Version 0.91 10-Sep-97
-----------------------
-
-1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
-match the empty string as in /(a*)*/. It was looping and ultimately crashing.
-
-2. PCRE was looping on encountering an indefinitely repeated back reference to
-a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
-Perl does - treats the match as successful.
-
-****
diff --git a/pcre/doc/NON-UNIX-USE b/pcre/doc/NON-UNIX-USE
deleted file mode 100644 (file)
index 09a7432..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-Compiling PCRE on non-Unix systems
-----------------------------------
-
-If you want to compile PCRE for a non-Unix system, note that it consists
-entirely of code written in Standard C, and so should compile successfully
-on any machine with a Standard C compiler and library, using normal compiling
-commands to do the following:
-
-(1) Copy or rename the file config.in as config.h, and change the macros that
-define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0.
-Unfortunately, because of the way Unix autoconf works, the default setting has
-to be 0.
-
-(2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions
-for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in
-configure.in.
-
-(3) Compile dftables.c as a stand-alone program, and then run it with
-the standard output sent to chartables.c. This generates a set of standard
-character tables.
-
-(4) Compile maketables.c, get.c, study.c and pcre.c and link them all
-together into an object library in whichever form your system keeps such
-libraries. This is the pcre library (chartables.c gets included by means of an
-#include directive).
-
-(5) Similarly, compile pcreposix.c and link it as the pcreposix library.
-
-(6) Compile the test program pcretest.c. This needs the functions in the
-pcre and pcreposix libraries when linking.
-
-(7) Run pcretest on the testinput files in the testdata directory, and check
-that the output matches the corresponding testoutput files. You must use the
--i option when checking testinput2.
-
-If you have a system without "configure" but where you can use a Makefile, edit
-Makefile.in to create Makefile, substituting suitable values for the variables
-at the head of the file.
-
-Some help in building a Win32 DLL of PCRE in GnuWin32 environments was
-contributed by Paul.Sokolovsky@technologist.com. These environments are
-Mingw32 (http://www.xraylith.wisc.edu/~khan/software/gnu-win32/) and
-CygWin  (http://sourceware.cygnus.com/cygwin/). Paul comments:
-
-  For CygWin, set CFLAGS=-mno-cygwin, and do 'make dll'. You'll get
-  pcre.dll (containing pcreposix also), libpcre.dll.a, and dynamically
-  linked pgrep and pcretest. If you have /bin/sh, run RunTest (three
-  main test go ok, locale not supported).
-
-****
diff --git a/pcre/doc/Tech.Notes b/pcre/doc/Tech.Notes
deleted file mode 100644 (file)
index 7b96e5b..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-Technical Notes about PCRE
---------------------------
-
-Many years ago I implemented some regular expression functions to an algorithm
-suggested by Martin Richards. These were not Unix-like in form, and were quite
-restricted in what they could do by comparison with Perl. The interesting part
-about the algorithm was that the amount of space required to hold the compiled
-form of an expression was known in advance. The code to apply an expression did
-not operate by backtracking, as the Henry Spencer and Perl code does, but
-instead checked all possibilities simultaneously by keeping a list of current
-states and checking all of them as it advanced through the subject string. (In
-the terminology of Jeffrey Friedl's book, it was a "DFA algorithm".) When the
-pattern was all used up, all remaining states were possible matches, and the
-one matching the longest subset of the subject string was chosen. This did not
-necessarily maximize the individual wild portions of the pattern, as is
-expected in Unix and Perl-style regular expressions.
-
-By contrast, the code originally written by Henry Spencer and subsequently
-heavily modified for Perl actually compiles the expression twice: once in a
-dummy mode in order to find out how much store will be needed, and then for
-real. The execution function operates by backtracking and maximizing (or,
-optionally, minimizing in Perl) the amount of the subject that matches
-individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's
-terminology.
-
-For the set of functions that forms PCRE (which are unrelated to those
-mentioned above), I tried at first to invent an algorithm that used an amount
-of store bounded by a multiple of the number of characters in the pattern, to
-save on compiling time. However, because of the greater complexity in Perl
-regular expressions, I couldn't do this. In any case, a first pass through the
-pattern is needed, in order to find internal flag settings like (?i) at top
-level. So PCRE works by running a very degenerate first pass to calculate a
-maximum store size, and then a second pass to do the real compile - which may
-use a bit less than the predicted amount of store. The idea is that this is
-going to turn out faster because the first pass is degenerate and the second
-pass can just store stuff straight into the vector. It does make the compiling
-functions bigger, of course, but they have got quite big anyway to handle all
-the Perl stuff.
-
-The compiled form of a pattern is a vector of bytes, containing items of
-variable length. The first byte in an item is an opcode, and the length of the
-item is either implicit in the opcode or contained in the data bytes which
-follow it. A list of all the opcodes follows:
-
-Opcodes with no following data
-------------------------------
-
-These items are all just one byte long
-
-  OP_END                 end of pattern
-  OP_ANY                 match any character
-  OP_SOD                 match start of data: \A
-  OP_CIRC                ^ (start of data, or after \n in multiline)
-  OP_NOT_WORD_BOUNDARY   \W
-  OP_WORD_BOUNDARY       \w
-  OP_NOT_DIGIT           \D
-  OP_DIGIT               \d
-  OP_NOT_WHITESPACE      \S
-  OP_WHITESPACE          \s
-  OP_NOT_WORDCHAR        \W
-  OP_WORDCHAR            \w
-  OP_EODN                match end of data or \n at end: \Z
-  OP_EOD                 match end of data: \z
-  OP_DOLL                $ (end of data, or before \n in multiline)
-  OP_RECURSE             match the pattern recursively
-
-
-Repeating single characters
----------------------------
-
-The common repeats (*, +, ?) when applied to a single character appear as
-two-byte items using the following opcodes:
-
-  OP_STAR
-  OP_MINSTAR
-  OP_PLUS
-  OP_MINPLUS
-  OP_QUERY
-  OP_MINQUERY
-
-Those with "MIN" in their name are the minimizing versions. Each is followed by
-the character that is to be repeated. Other repeats make use of
-
-  OP_UPTO
-  OP_MINUPTO
-  OP_EXACT
-
-which are followed by a two-byte count (most significant first) and the
-repeated character. OP_UPTO matches from 0 to the given number. A repeat with a
-non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an
-OP_UPTO (or OP_MINUPTO).
-
-
-Repeating character types
--------------------------
-
-Repeats of things like \d are done exactly as for single characters, except
-that instead of a character, the opcode for the type is stored in the data
-byte. The opcodes are:
-
-  OP_TYPESTAR
-  OP_TYPEMINSTAR
-  OP_TYPEPLUS
-  OP_TYPEMINPLUS
-  OP_TYPEQUERY
-  OP_TYPEMINQUERY
-  OP_TYPEUPTO
-  OP_TYPEMINUPTO
-  OP_TYPEEXACT
-
-
-Matching a character string
----------------------------
-
-The OP_CHARS opcode is followed by a one-byte count and then that number of
-characters. If there are more than 255 characters in sequence, successive
-instances of OP_CHARS are used.
-
-
-Character classes
------------------
-
-OP_CLASS is used for a character class, provided there are at least two
-characters in the class. If there is only one character, OP_CHARS is used for a
-positive class, and OP_NOT for a negative one (that is, for something like
-[^a]). Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a
-repeated, negated, single-character class. The normal ones (OP_STAR etc.) are
-used for a repeated positive single-character class.
-
-OP_CLASS is followed by a 32-byte bit map containing a 1 bit for every
-character that is acceptable. The bits are counted from the least significant
-end of each byte.
-
-
-Back references
----------------
-
-OP_REF is followed by a single byte containing the reference number.
-
-
-Repeating character classes and back references
------------------------------------------------
-
-Single-character classes are handled specially (see above). This applies to
-OP_CLASS and OP_REF. In both cases, the repeat information follows the base
-item. The matching code looks at the following opcode to see if it is one of
-
-  OP_CRSTAR
-  OP_CRMINSTAR
-  OP_CRPLUS
-  OP_CRMINPLUS
-  OP_CRQUERY
-  OP_CRMINQUERY
-  OP_CRRANGE
-  OP_CRMINRANGE
-
-All but the last two are just single-byte items. The others are followed by
-four bytes of data, comprising the minimum and maximum repeat counts.
-
-
-Brackets and alternation
-------------------------
-
-A pair of non-capturing (round) brackets is wrapped round each expression at
-compile time, so alternation always happens in the context of brackets.
-Non-capturing brackets use the opcode OP_BRA, while capturing brackets use
-OP_BRA+1, OP_BRA+2, etc. [Note for North Americans: "bracket" to some English
-speakers, including myself, can be round, square, curly, or pointy. Hence this
-usage.]
-
-A bracket opcode is followed by two bytes which give the offset to the next
-alternative OP_ALT or, if there aren't any branches, to the matching KET
-opcode. Each OP_ALT is followed by two bytes giving the offset to the next one,
-or to the KET opcode.
-
-OP_KET is used for subpatterns that do not repeat indefinitely, while
-OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or
-maximally respectively. All three are followed by two bytes giving (as a
-positive number) the offset back to the matching BRA opcode.
-
-If a subpattern is quantified such that it is permitted to match zero times, it
-is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte
-opcodes which tell the matcher that skipping this subpattern entirely is a
-valid branch.
-
-A subpattern with an indefinite maximum repetition is replicated in the
-compiled data its minimum number of times (or once with a BRAZERO if the
-minimum is zero), with the final copy terminating with a KETRMIN or KETRMAX as
-appropriate.
-
-A subpattern with a bounded maximum repetition is replicated in a nested
-fashion up to the maximum number of times, with BRAZERO or BRAMINZERO before
-each replication after the minimum, so that, for example, (abc){2,5} is
-compiled as (abc)(abc)((abc)((abc)(abc)?)?)?. The 200-bracket limit does not
-apply to these internally generated brackets.
-
-
-Assertions
-----------
-
-Forward assertions are just like other subpatterns, but starting with one of
-the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes
-OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion
-is OP_REVERSE, followed by a two byte count of the number of characters to move
-back the pointer in the subject string. When operating in UTF-8 mode, the count
-is a character count rather than a byte count. A separate count is present in
-each alternative of a lookbehind assertion, allowing them to have different
-fixed lengths.
-
-
-Once-only subpatterns
----------------------
-
-These are also just like other subpatterns, but they start with the opcode
-OP_ONCE.
-
-
-Conditional subpatterns
------------------------
-
-These are like other subpatterns, but they start with the opcode OP_COND. If
-the condition is a back reference, this is stored at the start of the
-subpattern using the opcode OP_CREF followed by one byte containing the
-reference number. Otherwise, a conditional subpattern will always start with
-one of the assertions.
-
-
-Changing options
-----------------
-
-If any of the /i, /m, or /s options are changed within a parenthesized group,
-an OP_OPT opcode is compiled, followed by one byte containing the new settings
-of these flags. If there are several alternatives in a group, there is an
-occurrence of OP_OPT at the start of all those following the first options
-change, to set appropriate options for the start of the alternative.
-Immediately after the end of the group there is another such item to reset the
-flags to their previous values. Other changes of flag within the pattern can be
-handled entirely at compile time, and so do not cause anything to be put into
-the compiled data.
-
-
-Philip Hazel
-August 2000
diff --git a/pcre/doc/authors b/pcre/doc/authors
deleted file mode 100644 (file)
index bfe1b5d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
diff --git a/pcre/doc/copying b/pcre/doc/copying
deleted file mode 100644 (file)
index 34d20db..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-PCRE LICENCE
-------------
-
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
-
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission. In practice, this means that if you use
-   PCRE in software which you distribute to others, commercially or
-   otherwise, you must put a sentence like this
-
-     Regular expression support is provided by the PCRE library package,
-     which is open source software, written by Philip Hazel, and copyright
-     by the University of Cambridge, England.
-
-   somewhere reasonably visible in your documentation and in any relevant
-   files or online help data or similar. A reference to the ftp site for
-   the source, that is, to
-
-     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
-   should also be given in the documentation.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
-
-End
diff --git a/pcre/doc/news b/pcre/doc/news
deleted file mode 100644 (file)
index 56fccdf..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-News about PCRE releases
-------------------------
-
-Release 3.3 01-Aug-00
----------------------
-
-There is some support for UTF-8 character strings. This is incomplete and
-experimental. The documentation describes what is and what is not implemented.
-Otherwise, this is just a bug-fixing release.
-
-
-Release 3.0 01-Feb-00
----------------------
-
-1. A "configure" script is now used to configure PCRE for Unix systems. It
-builds a Makefile, a config.h file, and the pcre-config script.
-
-2. PCRE is built as a shared library by default.
-
-3. There is support for POSIX classes such as [:alpha:].
-
-5. There is an experimental recursion feature.
-
-----------------------------------------------------------------------------
-          IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00
-
-Please note that there has been a change in the API such that a larger
-ovector is required at matching time, to provide some additional workspace.
-The new man page has details. This change was necessary in order to support
-some of the new functionality in Perl 5.005.
-
-          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00
-
-Another (I hope this is the last!) change has been made to the API for the
-pcre_compile() function. An additional argument has been added to make it
-possible to pass over a pointer to character tables built in the current
-locale by pcre_maketables(). To use the default tables, this new arguement
-should be passed as NULL.
-
-          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05
-
-Yet another (and again I hope this really is the last) change has been made
-to the API for the pcre_exec() function. An additional argument has been
-added to make it possible to start the match other than at the start of the
-subject string. This is important if there are lookbehinds. The new man
-page has the details, but you just want to convert existing programs, all
-you need to do is to stick in a new fifth argument to pcre_exec(), with a
-value of zero. For example, change
-
-  pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
-to
-  pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)
-
-****
diff --git a/pcre/doc/pcre.3 b/pcre/doc/pcre.3
deleted file mode 100644 (file)
index bb812f4..0000000
+++ /dev/null
@@ -1,1810 +0,0 @@
-.TH PCRE 3\r
-.SH NAME\r
-pcre - Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B #include <pcre.h>\r
-.PP\r
-.SM\r
-.br\r
-.B pcre *pcre_compile(const char *\fIpattern\fR, int \fIoptions\fR,\r
-.ti +5n\r
-.B const char **\fIerrptr\fR, int *\fIerroffset\fR,\r
-.ti +5n\r
-.B const unsigned char *\fItableptr\fR);\r
-.PP\r
-.br\r
-.B pcre_extra *pcre_study(const pcre *\fIcode\fR, int \fIoptions\fR,\r
-.ti +5n\r
-.B const char **\fIerrptr\fR);\r
-.PP\r
-.br\r
-.B int pcre_exec(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR,"\r
-.ti +5n\r
-.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIstartoffset\fR,\r
-.ti +5n\r
-.B int \fIoptions\fR, int *\fIovector\fR, int \fIovecsize\fR);\r
-.PP\r
-.br\r
-.B int pcre_copy_substring(const char *\fIsubject\fR, int *\fIovector\fR,\r
-.ti +5n\r
-.B int \fIstringcount\fR, int \fIstringnumber\fR, char *\fIbuffer\fR,\r
-.ti +5n\r
-.B int \fIbuffersize\fR);\r
-.PP\r
-.br\r
-.B int pcre_get_substring(const char *\fIsubject\fR, int *\fIovector\fR,\r
-.ti +5n\r
-.B int \fIstringcount\fR, int \fIstringnumber\fR,\r
-.ti +5n\r
-.B const char **\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B int pcre_get_substring_list(const char *\fIsubject\fR,\r
-.ti +5n\r
-.B int *\fIovector\fR, int \fIstringcount\fR, "const char ***\fIlistptr\fR);"\r
-.PP\r
-.br\r
-.B void pcre_free_substring(const char *\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B void pcre_free_substring_list(const char **\fIstringptr\fR);\r
-.PP\r
-.br\r
-.B const unsigned char *pcre_maketables(void);\r
-.PP\r
-.br\r
-.B int pcre_fullinfo(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR,"\r
-.ti +5n\r
-.B int \fIwhat\fR, void *\fIwhere\fR);\r
-.PP\r
-.br\r
-.B int pcre_info(const pcre *\fIcode\fR, int *\fIoptptr\fR, int\r
-.B *\fIfirstcharptr\fR);\r
-.PP\r
-.br\r
-.B char *pcre_version(void);\r
-.PP\r
-.br\r
-.B void *(*pcre_malloc)(size_t);\r
-.PP\r
-.br\r
-.B void (*pcre_free)(void *);\r
-\r
-\r
-\r
-.SH DESCRIPTION\r
-The PCRE library is a set of functions that implement regular expression\r
-pattern matching using the same syntax and semantics as Perl 5, with just a few\r
-differences (see below). The current implementation corresponds to Perl 5.005,\r
-with some additional features from later versions. This includes some\r
-experimental, incomplete support for UTF-8 encoded strings. Details of exactly\r
-what is and what is not supported are given below.\r
-\r
-PCRE has its own native API, which is described in this document. There is also\r
-a set of wrapper functions that correspond to the POSIX regular expression API.\r
-These are described in the \fBpcreposix\fR documentation.\r
-\r
-The native API function prototypes are defined in the header file \fBpcre.h\fR,\r
-and on Unix systems the library itself is called \fBlibpcre.a\fR, so can be\r
-accessed by adding \fB-lpcre\fR to the command for linking an application which\r
-calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to\r
-contain the major and minor release numbers for the library. Applications can\r
-use these to include support for different releases.\r
-\r
-The functions \fBpcre_compile()\fR, \fBpcre_study()\fR, and \fBpcre_exec()\fR\r
-are used for compiling and matching regular expressions.\r
-\r
-The functions \fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and\r
-\fBpcre_get_substring_list()\fR are convenience functions for extracting\r
-captured substrings from a matched subject string; \fBpcre_free_substring()\fR\r
-and \fBpcre_free_substring_list()\fR are also provided, to free the memory used\r
-for extracted strings.\r
-\r
-The function \fBpcre_maketables()\fR is used (optionally) to build a set of\r
-character tables in the current locale for passing to \fBpcre_compile()\fR.\r
-\r
-The function \fBpcre_fullinfo()\fR is used to find out information about a\r
-compiled pattern; \fBpcre_info()\fR is an obsolete version which returns only\r
-some of the available information, but is retained for backwards compatibility.\r
-The function \fBpcre_version()\fR returns a pointer to a string containing the\r
-version of PCRE and its date of release.\r
-\r
-The global variables \fBpcre_malloc\fR and \fBpcre_free\fR initially contain\r
-the entry points of the standard \fBmalloc()\fR and \fBfree()\fR functions\r
-respectively. PCRE calls the memory management functions via these variables,\r
-so a calling program can replace them if it wishes to intercept the calls. This\r
-should be done before calling any PCRE functions.\r
-\r
-\r
-.SH MULTI-THREADING\r
-The PCRE functions can be used in multi-threading applications, with the\r
-proviso that the memory management functions pointed to by \fBpcre_malloc\fR\r
-and \fBpcre_free\fR are shared by all threads.\r
-\r
-The compiled form of a regular expression is not altered during matching, so\r
-the same compiled pattern can safely be used by several threads at once.\r
-\r
-\r
-.SH COMPILING A PATTERN\r
-The function \fBpcre_compile()\fR is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument \fIpattern\fR. A pointer to a single block of memory\r
-that is obtained via \fBpcre_malloc\fR is returned. This contains the\r
-compiled code and related data. The \fBpcre\fR type is defined for this for\r
-convenience, but in fact \fBpcre\fR is just a typedef for \fBvoid\fR, since the\r
-contents of the block are not externally defined. It is up to the caller to\r
-free the memory when it is no longer required.\r
-.PP\r
-The size of a compiled pattern is roughly proportional to the length of the\r
-pattern string, except that each character class (other than those containing\r
-just a single character, negated or not) requires 33 bytes, and repeat\r
-quantifiers with a minimum greater than one or a bounded maximum cause the\r
-relevant portions of the compiled pattern to be replicated.\r
-.PP\r
-The \fIoptions\fR argument contains independent bits that affect the\r
-compilation. It should be zero if no options are required. Some of the options,\r
-in particular, those that are compatible with Perl, can also be set and unset\r
-from within the pattern (see the detailed description of regular expressions\r
-below). For these options, the contents of the \fIoptions\fR argument specifies\r
-their initial settings at the start of compilation and execution. The\r
-PCRE_ANCHORED option can be set at the time of matching as well as at compile\r
-time.\r
-.PP\r
-If \fIerrptr\fR is NULL, \fBpcre_compile()\fR returns NULL immediately.\r
-Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fR returns\r
-NULL, and sets the variable pointed to by \fIerrptr\fR to point to a textual\r
-error message. The offset from the start of the pattern to the character where\r
-the error was discovered is placed in the variable pointed to by\r
-\fIerroffset\fR, which must not be NULL. If it is, an immediate error is given.\r
-.PP\r
-If the final argument, \fItableptr\fR, is NULL, PCRE uses a default set of\r
-character tables which are built when it is compiled, using the default C\r
-locale. Otherwise, \fItableptr\fR must be the result of a call to\r
-\fBpcre_maketables()\fR. See the section on locale support below.\r
-.PP\r
-The following option bits are defined in the header file:\r
-\r
-  PCRE_ANCHORED\r
-\r
-If this bit is set, the pattern is forced to be "anchored", that is, it is\r
-constrained to match only at the start of the string which is being searched\r
-(the "subject string"). This effect can also be achieved by appropriate\r
-constructs in the pattern itself, which is the only way to do it in Perl.\r
-\r
-  PCRE_CASELESS\r
-\r
-If this bit is set, letters in the pattern match both upper and lower case\r
-letters. It is equivalent to Perl's /i option.\r
-\r
-  PCRE_DOLLAR_ENDONLY\r
-\r
-If this bit is set, a dollar metacharacter in the pattern matches only at the\r
-end of the subject string. Without this option, a dollar also matches\r
-immediately before the final character if it is a newline (but not before any\r
-other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is\r
-set. There is no equivalent to this option in Perl.\r
-\r
-  PCRE_DOTALL\r
-\r
-If this bit is set, a dot metacharater in the pattern matches all characters,\r
-including newlines. Without it, newlines are excluded. This option is\r
-equivalent to Perl's /s option. A negative class such as [^a] always matches a\r
-newline character, independent of the setting of this option.\r
-\r
-  PCRE_EXTENDED\r
-\r
-If this bit is set, whitespace data characters in the pattern are totally\r
-ignored except when escaped or inside a character class, and characters between\r
-an unescaped # outside a character class and the next newline character,\r
-inclusive, are also ignored. This is equivalent to Perl's /x option, and makes\r
-it possible to include comments inside complicated patterns. Note, however,\r
-that this applies only to data characters. Whitespace characters may never\r
-appear within special character sequences in a pattern, for example within the\r
-sequence (?( which introduces a conditional subpattern.\r
-\r
-  PCRE_EXTRA\r
-\r
-This option was invented in order to turn on additional functionality of PCRE\r
-that is incompatible with Perl, but it is currently of very little use. When\r
-set, any backslash in a pattern that is followed by a letter that has no\r
-special meaning causes an error, thus reserving these combinations for future\r
-expansion. By default, as in Perl, a backslash followed by a letter with no\r
-special meaning is treated as a literal. There are at present no other features\r
-controlled by this option. It can also be set by a (?X) option setting within a\r
-pattern.\r
-\r
-  PCRE_MULTILINE\r
-\r
-By default, PCRE treats the subject string as consisting of a single "line" of\r
-characters (even if it actually contains several newlines). The "start of line"\r
-metacharacter (^) matches only at the start of the string, while the "end of\r
-line" metacharacter ($) matches only at the end of the string, or before a\r
-terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as\r
-Perl.\r
-\r
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs\r
-match immediately following or immediately before any newline in the subject\r
-string, respectively, as well as at the very start and end. This is equivalent\r
-to Perl's /m option. If there are no "\\n" characters in a subject string, or\r
-no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no\r
-effect.\r
-\r
-  PCRE_UNGREEDY\r
-\r
-This option inverts the "greediness" of the quantifiers so that they are not\r
-greedy by default, but become greedy if followed by "?". It is not compatible\r
-with Perl. It can also be set by a (?U) option setting within the pattern.\r
-\r
-  PCRE_UTF8\r
-\r
-This option causes PCRE to regard both the pattern and the subject as strings\r
-of UTF-8 characters instead of just byte strings. However, it is available only\r
-if PCRE has been built to include UTF-8 support. If not, the use of this option\r
-provokes an error. Support for UTF-8 is new, experimental, and incomplete.\r
-Details of exactly what it entails are given below.\r
-\r
-\r
-.SH STUDYING A PATTERN\r
-When a pattern is going to be used several times, it is worth spending more\r
-time analyzing it in order to speed up the time taken for matching. The\r
-function \fBpcre_study()\fR takes a pointer to a compiled pattern as its first\r
-argument, and returns a pointer to a \fBpcre_extra\fR block (another \fBvoid\fR\r
-typedef) containing additional information about the pattern; this can be\r
-passed to \fBpcre_exec()\fR. If no additional information is available, NULL\r
-is returned.\r
-\r
-The second argument contains option bits. At present, no options are defined\r
-for \fBpcre_study()\fR, and this argument should always be zero.\r
-\r
-The third argument for \fBpcre_study()\fR is a pointer to an error message. If\r
-studying succeeds (even if no data is returned), the variable it points to is\r
-set to NULL. Otherwise it points to a textual error message.\r
-\r
-At present, studying a pattern is useful only for non-anchored patterns that do\r
-not have a single fixed starting character. A bitmap of possible starting\r
-characters is created.\r
-\r
-\r
-.SH LOCALE SUPPORT\r
-PCRE handles caseless matching, and determines whether characters are letters,\r
-digits, or whatever, by reference to a set of tables. The library contains a\r
-default set of tables which is created in the default C locale when PCRE is\r
-compiled. This is used when the final argument of \fBpcre_compile()\fR is NULL,\r
-and is sufficient for many applications.\r
-\r
-An alternative set of tables can, however, be supplied. Such tables are built\r
-by calling the \fBpcre_maketables()\fR function, which has no arguments, in the\r
-relevant locale. The result can then be passed to \fBpcre_compile()\fR as often\r
-as necessary. For example, to build and use tables that are appropriate for the\r
-French locale (where accented characters with codes greater than 128 are\r
-treated as letters), the following code could be used:\r
-\r
-  setlocale(LC_CTYPE, "fr");\r
-  tables = pcre_maketables();\r
-  re = pcre_compile(..., tables);\r
-\r
-The tables are built in memory that is obtained via \fBpcre_malloc\fR. The\r
-pointer that is passed to \fBpcre_compile\fR is saved with the compiled\r
-pattern, and the same tables are used via this pointer by \fBpcre_study()\fR\r
-and \fBpcre_exec()\fR. Thus for any single pattern, compilation, studying and\r
-matching all happen in the same locale, but different patterns can be compiled\r
-in different locales. It is the caller's responsibility to ensure that the\r
-memory containing the tables remains available for as long as it is needed.\r
-\r
-\r
-.SH INFORMATION ABOUT A PATTERN\r
-The \fBpcre_fullinfo()\fR function returns information about a compiled\r
-pattern. It replaces the obsolete \fBpcre_info()\fR function, which is\r
-nevertheless retained for backwards compability (and is documented below).\r
-\r
-The first argument for \fBpcre_fullinfo()\fR is a pointer to the compiled\r
-pattern. The second argument is the result of \fBpcre_study()\fR, or NULL if\r
-the pattern was not studied. The third argument specifies which piece of\r
-information is required, while the fourth argument is a pointer to a variable\r
-to receive the data. The yield of the function is zero for success, or one of\r
-the following negative numbers:\r
-\r
-  PCRE_ERROR_NULL       the argument \fIcode\fR was NULL\r
-                        the argument \fIwhere\fR was NULL\r
-  PCRE_ERROR_BADMAGIC   the "magic number" was not found\r
-  PCRE_ERROR_BADOPTION  the value of \fIwhat\fR was invalid\r
-\r
-The possible values for the third argument are defined in \fBpcre.h\fR, and are\r
-as follows:\r
-\r
-  PCRE_INFO_OPTIONS\r
-\r
-Return a copy of the options with which the pattern was compiled. The fourth\r
-argument should point to au \fBunsigned long int\fR variable. These option bits\r
-are those specified in the call to \fBpcre_compile()\fR, modified by any\r
-top-level option settings within the pattern itself, and with the PCRE_ANCHORED\r
-bit forcibly set if the form of the pattern implies that it can match only at\r
-the start of a subject string.\r
-\r
-  PCRE_INFO_SIZE\r
-\r
-Return the size of the compiled pattern, that is, the value that was passed as\r
-the argument to \fBpcre_malloc()\fR when PCRE was getting memory in which to\r
-place the compiled data. The fourth argument should point to a \fBsize_t\fR\r
-variable.\r
-\r
-  PCRE_INFO_CAPTURECOUNT\r
-\r
-Return the number of capturing subpatterns in the pattern. The fourth argument\r
-should point to an \fbint\fR variable.\r
-\r
-  PCRE_INFO_BACKREFMAX\r
-\r
-Return the number of the highest back reference in the pattern. The fourth\r
-argument should point to an \fBint\fR variable. Zero is returned if there are\r
-no back references.\r
-\r
-  PCRE_INFO_FIRSTCHAR\r
-\r
-Return information about the first character of any matched string, for a\r
-non-anchored pattern. If there is a fixed first character, e.g. from a pattern\r
-such as (cat|cow|coyote), it is returned in the integer pointed to by\r
-\fIwhere\fR. Otherwise, if either\r
-\r
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\r
-starts with "^", or\r
-\r
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set\r
-(if it were set, the pattern would be anchored),\r
-\r
--1 is returned, indicating that the pattern matches only at the start of a\r
-subject string or after any "\\n" within the string. Otherwise -2 is returned.\r
-For anchored patterns, -2 is returned.\r
-\r
-  PCRE_INFO_FIRSTTABLE\r
-\r
-If the pattern was studied, and this resulted in the construction of a 256-bit\r
-table indicating a fixed set of characters for the first character in any\r
-matching string, a pointer to the table is returned. Otherwise NULL is\r
-returned. The fourth argument should point to an \fBunsigned char *\fR\r
-variable.\r
-\r
-  PCRE_INFO_LASTLITERAL\r
-\r
-For a non-anchored pattern, return the value of the rightmost literal character\r
-which must exist in any matched string, other than at its start. The fourth\r
-argument should point to an \fBint\fR variable. If there is no such character,\r
-or if the pattern is anchored, -1 is returned. For example, for the pattern\r
-/a\\d+z\\d+/ the returned value is 'z'.\r
-\r
-The \fBpcre_info()\fR function is now obsolete because its interface is too\r
-restrictive to return all the available data about a compiled pattern. New\r
-programs should use \fBpcre_fullinfo()\fR instead. The yield of\r
-\fBpcre_info()\fR is the number of capturing subpatterns, or one of the\r
-following negative numbers:\r
-\r
-  PCRE_ERROR_NULL       the argument \fIcode\fR was NULL\r
-  PCRE_ERROR_BADMAGIC   the "magic number" was not found\r
-\r
-If the \fIoptptr\fR argument is not NULL, a copy of the options with which the\r
-pattern was compiled is placed in the integer it points to (see\r
-PCRE_INFO_OPTIONS above).\r
-\r
-If the pattern is not anchored and the \fIfirstcharptr\fR argument is not NULL,\r
-it is used to pass back information about the first character of any matched\r
-string (see PCRE_INFO_FIRSTCHAR above).\r
-\r
-\r
-.SH MATCHING A PATTERN\r
-The function \fBpcre_exec()\fR is called to match a subject string against a\r
-pre-compiled pattern, which is passed in the \fIcode\fR argument. If the\r
-pattern has been studied, the result of the study should be passed in the\r
-\fIextra\fR argument. Otherwise this must be NULL.\r
-\r
-The PCRE_ANCHORED option can be passed in the \fIoptions\fR argument, whose\r
-unused bits must be zero. However, if a pattern was compiled with\r
-PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it\r
-cannot be made unachored at matching time.\r
-\r
-There are also three further options that can be set only at matching time:\r
-\r
-  PCRE_NOTBOL\r
-\r
-The first character of the string is not the beginning of a line, so the\r
-circumflex metacharacter should not match before it. Setting this without\r
-PCRE_MULTILINE (at compile time) causes circumflex never to match.\r
-\r
-  PCRE_NOTEOL\r
-\r
-The end of the string is not the end of a line, so the dollar metacharacter\r
-should not match it nor (except in multiline mode) a newline immediately before\r
-it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never\r
-to match.\r
-\r
-  PCRE_NOTEMPTY\r
-\r
-An empty string is not considered to be a valid match if this option is set. If\r
-there are alternatives in the pattern, they are tried. If all the alternatives\r
-match the empty string, the entire match fails. For example, if the pattern\r
-\r
-  a?b?\r
-\r
-is applied to a string not beginning with "a" or "b", it matches the empty\r
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not\r
-valid, so PCRE searches further into the string for occurrences of "a" or "b".\r
-\r
-Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case\r
-of a pattern match of the empty string within its \fBsplit()\fR function, and\r
-when using the /g modifier. It is possible to emulate Perl's behaviour after\r
-matching a null string by first trying the match again at the same offset with\r
-PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see\r
-below) and trying an ordinary match again.\r
-\r
-The subject string is passed as a pointer in \fIsubject\fR, a length in\r
-\fIlength\fR, and a starting offset in \fIstartoffset\fR. Unlike the pattern\r
-string, it may contain binary zero characters. When the starting offset is\r
-zero, the search for a match starts at the beginning of the subject, and this\r
-is by far the most common case.\r
-\r
-A non-zero starting offset is useful when searching for another match in the\r
-same subject by calling \fBpcre_exec()\fR again after a previous success.\r
-Setting \fIstartoffset\fR differs from just passing over a shortened string and\r
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of\r
-lookbehind. For example, consider the pattern\r
-\r
-  \\Biss\\B\r
-\r
-which finds occurrences of "iss" in the middle of words. (\\B matches only if\r
-the current position in the subject is not a word boundary.) When applied to\r
-the string "Mississipi" the first call to \fBpcre_exec()\fR finds the first\r
-occurrence. If \fBpcre_exec()\fR is called again with just the remainder of the\r
-subject, namely "issipi", it does not match, because \\B is always false at the\r
-start of the subject, which is deemed to be a word boundary. However, if\r
-\fBpcre_exec()\fR is passed the entire string again, but with \fIstartoffset\fR\r
-set to 4, it finds the second occurrence of "iss" because it is able to look\r
-behind the starting point to discover that it is preceded by a letter.\r
-\r
-If a non-zero starting offset is passed when the pattern is anchored, one\r
-attempt to match at the given offset is tried. This can only succeed if the\r
-pattern does not require the match to be at the start of the subject.\r
-\r
-In general, a pattern matches a certain portion of the subject, and in\r
-addition, further substrings from the subject may be picked out by parts of the\r
-pattern. Following the usage in Jeffrey Friedl's book, this is called\r
-"capturing" in what follows, and the phrase "capturing subpattern" is used for\r
-a fragment of a pattern that picks out a substring. PCRE supports several other\r
-kinds of parenthesized subpattern that do not cause substrings to be captured.\r
-\r
-Captured substrings are returned to the caller via a vector of integer offsets\r
-whose address is passed in \fIovector\fR. The number of elements in the vector\r
-is passed in \fIovecsize\fR. The first two-thirds of the vector is used to pass\r
-back captured substrings, each substring using a pair of integers. The\r
-remaining third of the vector is used as workspace by \fBpcre_exec()\fR while\r
-matching capturing subpatterns, and is not available for passing back\r
-information. The length passed in \fIovecsize\fR should always be a multiple of\r
-three. If it is not, it is rounded down.\r
-\r
-When a match has been successful, information about captured substrings is\r
-returned in pairs of integers, starting at the beginning of \fIovector\fR, and\r
-continuing up to two-thirds of its length at the most. The first element of a\r
-pair is set to the offset of the first character in a substring, and the second\r
-is set to the offset of the first character after the end of a substring. The\r
-first pair, \fIovector[0]\fR and \fIovector[1]\fR, identify the portion of the\r
-subject string matched by the entire pattern. The next pair is used for the\r
-first capturing subpattern, and so on. The value returned by \fBpcre_exec()\fR\r
-is the number of pairs that have been set. If there are no capturing\r
-subpatterns, the return value from a successful match is 1, indicating that\r
-just the first pair of offsets has been set.\r
-\r
-Some convenience functions are provided for extracting the captured substrings\r
-as separate strings. These are described in the following section.\r
-\r
-It is possible for an capturing subpattern number \fIn+1\fR to match some\r
-part of the subject when subpattern \fIn\fR has not been used at all. For\r
-example, if the string "abc" is matched against the pattern (a|(z))(bc)\r
-subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset\r
-values corresponding to the unused subpattern are set to -1.\r
-\r
-If a capturing subpattern is matched repeatedly, it is the last portion of the\r
-string that it matched that gets returned.\r
-\r
-If the vector is too small to hold all the captured substrings, it is used as\r
-far as possible (up to two-thirds of its length), and the function returns a\r
-value of zero. In particular, if the substring offsets are not of interest,\r
-\fBpcre_exec()\fR may be called with \fIovector\fR passed as NULL and\r
-\fIovecsize\fR as zero. However, if the pattern contains back references and\r
-the \fIovector\fR isn't big enough to remember the related substrings, PCRE has\r
-to get additional memory for use during matching. Thus it is usually advisable\r
-to supply an \fIovector\fR.\r
-\r
-Note that \fBpcre_info()\fR can be used to find out how many capturing\r
-subpatterns there are in a compiled pattern. The smallest size for\r
-\fIovector\fR that will allow for \fIn\fR captured substrings in addition to\r
-the offsets of the substring matched by the whole pattern is (\fIn\fR+1)*3.\r
-\r
-If \fBpcre_exec()\fR fails, it returns a negative number. The following are\r
-defined in the header file:\r
-\r
-  PCRE_ERROR_NOMATCH        (-1)\r
-\r
-The subject string did not match the pattern.\r
-\r
-  PCRE_ERROR_NULL           (-2)\r
-\r
-Either \fIcode\fR or \fIsubject\fR was passed as NULL, or \fIovector\fR was\r
-NULL and \fIovecsize\fR was not zero.\r
-\r
-  PCRE_ERROR_BADOPTION      (-3)\r
-\r
-An unrecognized bit was set in the \fIoptions\fR argument.\r
-\r
-  PCRE_ERROR_BADMAGIC       (-4)\r
-\r
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch\r
-the case when it is passed a junk pointer. This is the error it gives when the\r
-magic number isn't present.\r
-\r
-  PCRE_ERROR_UNKNOWN_NODE   (-5)\r
-\r
-While running the pattern match, an unknown item was encountered in the\r
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting\r
-of the compiled pattern.\r
-\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-\r
-If a pattern contains back references, but the \fIovector\fR that is passed to\r
-\fBpcre_exec()\fR is not big enough to remember the referenced substrings, PCRE\r
-gets a block of memory at the start of matching to use for this purpose. If the\r
-call via \fBpcre_malloc()\fR fails, this error is given. The memory is freed at\r
-the end of matching.\r
-\r
-\r
-.SH EXTRACTING CAPTURED SUBSTRINGS\r
-Captured substrings can be accessed directly by using the offsets returned by\r
-\fBpcre_exec()\fR in \fIovector\fR. For convenience, the functions\r
-\fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and\r
-\fBpcre_get_substring_list()\fR are provided for extracting captured substrings\r
-as new, separate, zero-terminated strings. A substring that contains a binary\r
-zero is correctly extracted and has a further zero added on the end, but the\r
-result does not, of course, function as a C string.\r
-\r
-The first three arguments are the same for all three functions: \fIsubject\fR\r
-is the subject string which has just been successfully matched, \fIovector\fR\r
-is a pointer to the vector of integer offsets that was passed to\r
-\fBpcre_exec()\fR, and \fIstringcount\fR is the number of substrings that\r
-were captured by the match, including the substring that matched the entire\r
-regular expression. This is the value returned by \fBpcre_exec\fR if it\r
-is greater than zero. If \fBpcre_exec()\fR returned zero, indicating that it\r
-ran out of space in \fIovector\fR, the value passed as \fIstringcount\fR should\r
-be the size of the vector divided by three.\r
-\r
-The functions \fBpcre_copy_substring()\fR and \fBpcre_get_substring()\fR\r
-extract a single substring, whose number is given as \fIstringnumber\fR. A\r
-value of zero extracts the substring that matched the entire pattern, while\r
-higher values extract the captured substrings. For \fBpcre_copy_substring()\fR,\r
-the string is placed in \fIbuffer\fR, whose length is given by\r
-\fIbuffersize\fR, while for \fBpcre_get_substring()\fR a new block of memory is\r
-obtained via \fBpcre_malloc\fR, and its address is returned via\r
-\fIstringptr\fR. The yield of the function is the length of the string, not\r
-including the terminating zero, or one of\r
-\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-\r
-The buffer was too small for \fBpcre_copy_substring()\fR, or the attempt to get\r
-memory failed for \fBpcre_get_substring()\fR.\r
-\r
-  PCRE_ERROR_NOSUBSTRING    (-7)\r
-\r
-There is no substring whose number is \fIstringnumber\fR.\r
-\r
-The \fBpcre_get_substring_list()\fR function extracts all available substrings\r
-and builds a list of pointers to them. All this is done in a single block of\r
-memory which is obtained via \fBpcre_malloc\fR. The address of the memory block\r
-is returned via \fIlistptr\fR, which is also the start of the list of string\r
-pointers. The end of the list is marked by a NULL pointer. The yield of the\r
-function is zero if all went well, or\r
-\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-\r
-if the attempt to get the memory block failed.\r
-\r
-When any of these functions encounter a substring that is unset, which can\r
-happen when capturing subpattern number \fIn+1\fR matches some part of the\r
-subject, but subpattern \fIn\fR has not been used at all, they return an empty\r
-string. This can be distinguished from a genuine zero-length substring by\r
-inspecting the appropriate offset in \fIovector\fR, which is negative for unset\r
-substrings.\r
-\r
-The two convenience functions \fBpcre_free_substring()\fR and\r
-\fBpcre_free_substring_list()\fR can be used to free the memory returned by\r
-a previous call of \fBpcre_get_substring()\fR or\r
-\fBpcre_get_substring_list()\fR, respectively. They do nothing more than call\r
-the function pointed to by \fBpcre_free\fR, which of course could be called\r
-directly from a C program. However, PCRE is used in some situations where it is\r
-linked via a special interface to another programming language which cannot use\r
-\fBpcre_free\fR directly; it is for these cases that the functions are\r
-provided.\r
-\r
-\r
-.SH LIMITATIONS\r
-There are some size limitations in PCRE but it is hoped that they will never in\r
-practice be relevant.\r
-The maximum length of a compiled pattern is 65539 (sic) bytes.\r
-All values in repeating quantifiers must be less than 65536.\r
-The maximum number of capturing subpatterns is 99.\r
-The maximum number of all parenthesized subpatterns, including capturing\r
-subpatterns, assertions, and other types of subpattern, is 200.\r
-\r
-The maximum length of a subject string is the largest positive number that an\r
-integer variable can hold. However, PCRE uses recursion to handle subpatterns\r
-and indefinite repetition. This means that the available stack space may limit\r
-the size of a subject string that can be processed by certain patterns.\r
-\r
-\r
-.SH DIFFERENCES FROM PERL\r
-The differences described here are with respect to Perl 5.005.\r
-\r
-1. By default, a whitespace character is any character that the C library\r
-function \fBisspace()\fR recognizes, though it is possible to compile PCRE with\r
-alternative character type tables. Normally \fBisspace()\fR matches space,\r
-formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5\r
-no longer includes vertical tab in its set of whitespace characters. The \\v\r
-escape that was in the Perl documentation for a long time was never in fact\r
-recognized. However, the character itself was treated as whitespace at least\r
-up to 5.002. In 5.004 and 5.005 it does not match \\s.\r
-\r
-2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits\r
-them, but they do not mean what you might think. For example, (?!a){3} does\r
-not assert that the next three characters are not "a". It just asserts that the\r
-next character is not "a" three times.\r
-\r
-3. Capturing subpatterns that occur inside negative lookahead assertions are\r
-counted, but their entries in the offsets vector are never set. Perl sets its\r
-numerical variables from any such patterns that are matched before the\r
-assertion fails to match something (thereby succeeding), but only if the\r
-negative lookahead assertion contains just one branch.\r
-\r
-4. Though binary zero characters are supported in the subject string, they are\r
-not allowed in a pattern string because it is passed as a normal C string,\r
-terminated by zero. The escape sequence "\\0" can be used in the pattern to\r
-represent a binary zero.\r
-\r
-5. The following Perl escape sequences are not supported: \\l, \\u, \\L, \\U,\r
-\\E, \\Q. In fact these are implemented by Perl's general string-handling and\r
-are not part of its pattern matching engine.\r
-\r
-6. The Perl \\G assertion is not supported as it is not relevant to single\r
-pattern matches.\r
-\r
-7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code})\r
-constructions. However, there is some experimental support for recursive\r
-patterns using the non-Perl item (?R).\r
-\r
-8. There are at the time of writing some oddities in Perl 5.005_02 concerned\r
-with the settings of captured strings when part of a pattern is repeated. For\r
-example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value\r
-"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if\r
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.\r
-\r
-In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the\r
-future Perl changes to a consistent state that is different, PCRE may change to\r
-follow.\r
-\r
-9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern\r
-/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not.\r
-However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset.\r
-\r
-10. PCRE provides some extensions to the Perl regular expression facilities:\r
-\r
-(a) Although lookbehind assertions must match fixed length strings, each\r
-alternative branch of a lookbehind assertion can match a different length of\r
-string. Perl 5.005 requires them all to have the same length.\r
-\r
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-\r
-character matches only at the very end of the string.\r
-\r
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\r
-meaning is faulted.\r
-\r
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\r
-inverted, that is, by default they are not greedy, but if followed by a\r
-question mark they are.\r
-\r
-(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start\r
-of the subject.\r
-\r
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for\r
-\fBpcre_exec()\fR have no Perl equivalents.\r
-\r
-(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do\r
-this using the (?p{code}) construct, which PCRE cannot of course support.)\r
-\r
-\r
-.SH REGULAR EXPRESSION DETAILS\r
-The syntax and semantics of the regular expressions supported by PCRE are\r
-described below. Regular expressions are also described in the Perl\r
-documentation and in a number of other books, some of which have copious\r
-examples. Jeffrey Friedl's "Mastering Regular Expressions", published by\r
-O'Reilly (ISBN 1-56592-257), covers them in great detail.\r
-\r
-The description here is intended as reference documentation. The basic\r
-operation of PCRE is on strings of bytes. However, there is the beginnings of\r
-some support for UTF-8 character strings. To use this support you must\r
-configure PCRE to include it, and then call \fBpcre_compile()\fR with the\r
-PCRE_UTF8 option. How this affects the pattern matching is described in the\r
-final section of this document.\r
-\r
-A regular expression is a pattern that is matched against a subject string from\r
-left to right. Most characters stand for themselves in a pattern, and match the\r
-corresponding characters in the subject. As a trivial example, the pattern\r
-\r
-  The quick brown fox\r
-\r
-matches a portion of a subject string that is identical to itself. The power of\r
-regular expressions comes from the ability to include alternatives and\r
-repetitions in the pattern. These are encoded in the pattern by the use of\r
-\fImeta-characters\fR, which do not stand for themselves but instead are\r
-interpreted in some special way.\r
-\r
-There are two different sets of meta-characters: those that are recognized\r
-anywhere in the pattern except within square brackets, and those that are\r
-recognized in square brackets. Outside square brackets, the meta-characters are\r
-as follows:\r
-\r
-  \\      general escape character with several uses\r
-  ^      assert start of subject (or line, in multiline mode)\r
-  $      assert end of subject (or line, in multiline mode)\r
-  .      match any character except newline (by default)\r
-  [      start character class definition\r
-  |      start of alternative branch\r
-  (      start subpattern\r
-  )      end subpattern\r
-  ?      extends the meaning of (\r
-         also 0 or 1 quantifier\r
-         also quantifier minimizer\r
-  *      0 or more quantifier\r
-  +      1 or more quantifier\r
-  {      start min/max quantifier\r
-\r
-Part of a pattern that is in square brackets is called a "character class". In\r
-a character class the only meta-characters are:\r
-\r
-  \\      general escape character\r
-  ^      negate the class, but only if the first character\r
-  -      indicates character range\r
-  ]      terminates the character class\r
-\r
-The following sections describe the use of each of the meta-characters.\r
-\r
-\r
-.SH BACKSLASH\r
-The backslash character has several uses. Firstly, if it is followed by a\r
-non-alphameric character, it takes away any special meaning that character may\r
-have. This use of backslash as an escape character applies both inside and\r
-outside character classes.\r
-\r
-For example, if you want to match a "*" character, you write "\\*" in the\r
-pattern. This applies whether or not the following character would otherwise be\r
-interpreted as a meta-character, so it is always safe to precede a\r
-non-alphameric with "\\" to specify that it stands for itself. In particular,\r
-if you want to match a backslash, you write "\\\\".\r
-\r
-If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the\r
-pattern (other than in a character class) and characters between a "#" outside\r
-a character class and the next newline character are ignored. An escaping\r
-backslash can be used to include a whitespace or "#" character as part of the\r
-pattern.\r
-\r
-A second use of backslash provides a way of encoding non-printing characters\r
-in patterns in a visible manner. There is no restriction on the appearance of\r
-non-printing characters, apart from the binary zero that terminates a pattern,\r
-but when a pattern is being prepared by text editing, it is usually easier to\r
-use one of the following escape sequences than the binary character it\r
-represents:\r
-\r
-  \\a     alarm, that is, the BEL character (hex 07)\r
-  \\cx    "control-x", where x is any character\r
-  \\e     escape (hex 1B)\r
-  \\f     formfeed (hex 0C)\r
-  \\n     newline (hex 0A)\r
-  \\r     carriage return (hex 0D)\r
-  \\t     tab (hex 09)\r
-  \\xhh   character with hex code hh\r
-  \\ddd   character with octal code ddd, or backreference\r
-\r
-The precise effect of "\\cx" is as follows: if "x" is a lower case letter, it\r
-is converted to upper case. Then bit 6 of the character (hex 40) is inverted.\r
-Thus "\\cz" becomes hex 1A, but "\\c{" becomes hex 3B, while "\\c;" becomes hex\r
-7B.\r
-\r
-After "\\x", up to two hexadecimal digits are read (letters can be in upper or\r
-lower case).\r
-\r
-After "\\0" up to two further octal digits are read. In both cases, if there\r
-are fewer than two digits, just those that are present are used. Thus the\r
-sequence "\\0\\x\\07" specifies two binary zeros followed by a BEL character.\r
-Make sure you supply two digits after the initial zero if the character that\r
-follows is itself an octal digit.\r
-\r
-The handling of a backslash followed by a digit other than 0 is complicated.\r
-Outside a character class, PCRE reads it and any following digits as a decimal\r
-number. If the number is less than 10, or if there have been at least that many\r
-previous capturing left parentheses in the expression, the entire sequence is\r
-taken as a \fIback reference\fR. A description of how this works is given\r
-later, following the discussion of parenthesized subpatterns.\r
-\r
-Inside a character class, or if the decimal number is greater than 9 and there\r
-have not been that many capturing subpatterns, PCRE re-reads up to three octal\r
-digits following the backslash, and generates a single byte from the least\r
-significant 8 bits of the value. Any subsequent digits stand for themselves.\r
-For example:\r
-\r
-  \\040   is another way of writing a space\r
-  \\40    is the same, provided there are fewer than 40\r
-            previous capturing subpatterns\r
-  \\7     is always a back reference\r
-  \\11    might be a back reference, or another way of\r
-            writing a tab\r
-  \\011   is always a tab\r
-  \\0113  is a tab followed by the character "3"\r
-  \\113   is the character with octal code 113 (since there\r
-            can be no more than 99 back references)\r
-  \\377   is a byte consisting entirely of 1 bits\r
-  \\81    is either a back reference, or a binary zero\r
-            followed by the two characters "8" and "1"\r
-\r
-Note that octal values of 100 or greater must not be introduced by a leading\r
-zero, because no more than three octal digits are ever read.\r
-\r
-All the sequences that define a single byte value can be used both inside and\r
-outside character classes. In addition, inside a character class, the sequence\r
-"\\b" is interpreted as the backspace character (hex 08). Outside a character\r
-class it has a different meaning (see below).\r
-\r
-The third use of backslash is for specifying generic character types:\r
-\r
-  \\d     any decimal digit\r
-  \\D     any character that is not a decimal digit\r
-  \\s     any whitespace character\r
-  \\S     any character that is not a whitespace character\r
-  \\w     any "word" character\r
-  \\W     any "non-word" character\r
-\r
-Each pair of escape sequences partitions the complete set of characters into\r
-two disjoint sets. Any given character matches one, and only one, of each pair.\r
-\r
-A "word" character is any letter or digit or the underscore character, that is,\r
-any character which can be part of a Perl "word". The definition of letters and\r
-digits is controlled by PCRE's character tables, and may vary if locale-\r
-specific matching is taking place (see "Locale support" above). For example, in\r
-the "fr" (French) locale, some character codes greater than 128 are used for\r
-accented letters, and these are matched by \\w.\r
-\r
-These character type sequences can appear both inside and outside character\r
-classes. They each match one character of the appropriate type. If the current\r
-matching point is at the end of the subject string, all of them fail, since\r
-there is no character to match.\r
-\r
-The fourth use of backslash is for certain simple assertions. An assertion\r
-specifies a condition that has to be met at a particular point in a match,\r
-without consuming any characters from the subject string. The use of\r
-subpatterns for more complicated assertions is described below. The backslashed\r
-assertions are\r
-\r
-  \\b     word boundary\r
-  \\B     not a word boundary\r
-  \\A     start of subject (independent of multiline mode)\r
-  \\Z     end of subject or newline at end (independent of multiline mode)\r
-  \\z     end of subject (independent of multiline mode)\r
-\r
-These assertions may not appear in character classes (but note that "\\b" has a\r
-different meaning, namely the backspace character, inside a character class).\r
-\r
-A word boundary is a position in the subject string where the current character\r
-and the previous character do not both match \\w or \\W (i.e. one matches\r
-\\w and the other matches \\W), or the start or end of the string if the\r
-first or last character matches \\w, respectively.\r
-\r
-The \\A, \\Z, and \\z assertions differ from the traditional circumflex and\r
-dollar (described below) in that they only ever match at the very start and end\r
-of the subject string, whatever options are set. They are not affected by the\r
-PCRE_NOTBOL or PCRE_NOTEOL options. If the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero, \\A can never match. The difference between \\Z\r
-and \\z is that \\Z matches before a newline that is the last character of the\r
-string as well as at the end of the string, whereas \\z matches only at the\r
-end.\r
-\r
-\r
-.SH CIRCUMFLEX AND DOLLAR\r
-Outside a character class, in the default matching mode, the circumflex\r
-character is an assertion which is true only if the current matching point is\r
-at the start of the subject string. If the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero, circumflex can never match. Inside a character\r
-class, circumflex has an entirely different meaning (see below).\r
-\r
-Circumflex need not be the first character of the pattern if a number of\r
-alternatives are involved, but it should be the first thing in each alternative\r
-in which it appears if the pattern is ever to match that branch. If all\r
-possible alternatives start with a circumflex, that is, if the pattern is\r
-constrained to match only at the start of the subject, it is said to be an\r
-"anchored" pattern. (There are also other constructs that can cause a pattern\r
-to be anchored.)\r
-\r
-A dollar character is an assertion which is true only if the current matching\r
-point is at the end of the subject string, or immediately before a newline\r
-character that is the last character in the string (by default). Dollar need\r
-not be the last character of the pattern if a number of alternatives are\r
-involved, but it should be the last item in any branch in which it appears.\r
-Dollar has no special meaning in a character class.\r
-\r
-The meaning of dollar can be changed so that it matches only at the very end of\r
-the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching\r
-time. This does not affect the \\Z assertion.\r
-\r
-The meanings of the circumflex and dollar characters are changed if the\r
-PCRE_MULTILINE option is set. When this is the case, they match immediately\r
-after and immediately before an internal "\\n" character, respectively, in\r
-addition to matching at the start and end of the subject string. For example,\r
-the pattern /^abc$/ matches the subject string "def\\nabc" in multiline mode,\r
-but not otherwise. Consequently, patterns that are anchored in single line mode\r
-because all branches start with "^" are not anchored in multiline mode, and a\r
-match for circumflex is possible when the \fIstartoffset\fR argument of\r
-\fBpcre_exec()\fR is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if\r
-PCRE_MULTILINE is set.\r
-\r
-Note that the sequences \\A, \\Z, and \\z can be used to match the start and\r
-end of the subject in both modes, and if all branches of a pattern start with\r
-\\A is it always anchored, whether PCRE_MULTILINE is set or not.\r
-\r
-\r
-.SH FULL STOP (PERIOD, DOT)\r
-Outside a character class, a dot in the pattern matches any one character in\r
-the subject, including a non-printing character, but not (by default) newline.\r
-If the PCRE_DOTALL option is set, dots match newlines as well. The handling of\r
-dot is entirely independent of the handling of circumflex and dollar, the only\r
-relationship being that they both involve newline characters. Dot has no\r
-special meaning in a character class.\r
-\r
-\r
-.SH SQUARE BRACKETS\r
-An opening square bracket introduces a character class, terminated by a closing\r
-square bracket. A closing square bracket on its own is not special. If a\r
-closing square bracket is required as a member of the class, it should be the\r
-first data character in the class (after an initial circumflex, if present) or\r
-escaped with a backslash.\r
-\r
-A character class matches a single character in the subject; the character must\r
-be in the set of characters defined by the class, unless the first character in\r
-the class is a circumflex, in which case the subject character must not be in\r
-the set defined by the class. If a circumflex is actually required as a member\r
-of the class, ensure it is not the first character, or escape it with a\r
-backslash.\r
-\r
-For example, the character class [aeiou] matches any lower case vowel, while\r
-[^aeiou] matches any character that is not a lower case vowel. Note that a\r
-circumflex is just a convenient notation for specifying the characters which\r
-are in the class by enumerating those that are not. It is not an assertion: it\r
-still consumes a character from the subject string, and fails if the current\r
-pointer is at the end of the string.\r
-\r
-When caseless matching is set, any letters in a class represent both their\r
-upper case and lower case versions, so for example, a caseless [aeiou] matches\r
-"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a\r
-caseful version would.\r
-\r
-The newline character is never treated in any special way in character classes,\r
-whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class\r
-such as [^a] will always match a newline.\r
-\r
-The minus (hyphen) character can be used to specify a range of characters in a\r
-character class. For example, [d-m] matches any letter between d and m,\r
-inclusive. If a minus character is required in a class, it must be escaped with\r
-a backslash or appear in a position where it cannot be interpreted as\r
-indicating a range, typically as the first or last character in the class.\r
-\r
-It is not possible to have the literal character "]" as the end character of a\r
-range. A pattern such as [W-]46] is interpreted as a class of two characters\r
-("W" and "-") followed by a literal string "46]", so it would match "W46]" or\r
-"-46]". However, if the "]" is escaped with a backslash it is interpreted as\r
-the end of range, so [W-\\]46] is interpreted as a single class containing a\r
-range followed by two separate characters. The octal or hexadecimal\r
-representation of "]" can also be used to end a range.\r
-\r
-Ranges operate in ASCII collating sequence. They can also be used for\r
-characters specified numerically, for example [\\000-\\037]. If a range that\r
-includes letters is used when caseless matching is set, it matches the letters\r
-in either case. For example, [W-c] is equivalent to [][\\^_`wxyzabc], matched\r
-caselessly, and if character tables for the "fr" locale are in use,\r
-[\\xc8-\\xcb] matches accented E characters in both cases.\r
-\r
-The character types \\d, \\D, \\s, \\S, \\w, and \\W may also appear in a\r
-character class, and add the characters that they match to the class. For\r
-example, [\\dABCDEF] matches any hexadecimal digit. A circumflex can\r
-conveniently be used with the upper case character types to specify a more\r
-restricted set of characters than the matching lower case type. For example,\r
-the class [^\\W_] matches any letter or digit, but not underscore.\r
-\r
-All non-alphameric characters other than \\, -, ^ (at the start) and the\r
-terminating ] are non-special in character classes, but it does no harm if they\r
-are escaped.\r
-\r
-\r
-.SH POSIX CHARACTER CLASSES\r
-Perl 5.6 (not yet released at the time of writing) is going to support the\r
-POSIX notation for character classes, which uses names enclosed by [: and :]\r
-within the enclosing square brackets. PCRE supports this notation. For example,\r
-\r
-  [01[:alpha:]%]\r
-\r
-matches "0", "1", any alphabetic character, or "%". The supported class names\r
-are\r
-\r
-  alnum    letters and digits\r
-  alpha    letters\r
-  ascii    character codes 0 - 127\r
-  cntrl    control characters\r
-  digit    decimal digits (same as \\d)\r
-  graph    printing characters, excluding space\r
-  lower    lower case letters\r
-  print    printing characters, including space\r
-  punct    printing characters, excluding letters and digits\r
-  space    white space (same as \\s)\r
-  upper    upper case letters\r
-  word     "word" characters (same as \\w)\r
-  xdigit   hexadecimal digits\r
-\r
-The names "ascii" and "word" are Perl extensions. Another Perl extension is\r
-negation, which is indicated by a ^ character after the colon. For example,\r
-\r
-  [12[:^digit:]]\r
-\r
-matches "1", "2", or any non-digit. PCRE (and Perl) also recogize the POSIX\r
-syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not\r
-supported, and an error is given if they are encountered.\r
-\r
-\r
-.SH VERTICAL BAR\r
-Vertical bar characters are used to separate alternative patterns. For example,\r
-the pattern\r
-\r
-  gilbert|sullivan\r
-\r
-matches either "gilbert" or "sullivan". Any number of alternatives may appear,\r
-and an empty alternative is permitted (matching the empty string).\r
-The matching process tries each alternative in turn, from left to right,\r
-and the first one that succeeds is used. If the alternatives are within a\r
-subpattern (defined below), "succeeds" means matching the rest of the main\r
-pattern as well as the alternative in the subpattern.\r
-\r
-\r
-.SH INTERNAL OPTION SETTING\r
-The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED\r
-can be changed from within the pattern by a sequence of Perl option letters\r
-enclosed between "(?" and ")". The option letters are\r
-\r
-  i  for PCRE_CASELESS\r
-  m  for PCRE_MULTILINE\r
-  s  for PCRE_DOTALL\r
-  x  for PCRE_EXTENDED\r
-\r
-For example, (?im) sets caseless, multiline matching. It is also possible to\r
-unset these options by preceding the letter with a hyphen, and a combined\r
-setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\r
-PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\r
-permitted. If a letter appears both before and after the hyphen, the option is\r
-unset.\r
-\r
-The scope of these option changes depends on where in the pattern the setting\r
-occurs. For settings that are outside any subpattern (defined below), the\r
-effect is the same as if the options were set or unset at the start of\r
-matching. The following patterns all behave in exactly the same way:\r
-\r
-  (?i)abc\r
-  a(?i)bc\r
-  ab(?i)c\r
-  abc(?i)\r
-\r
-which in turn is the same as compiling the pattern abc with PCRE_CASELESS set.\r
-In other words, such "top level" settings apply to the whole pattern (unless\r
-there are other changes inside subpatterns). If there is more than one setting\r
-of the same option at top level, the rightmost setting is used.\r
-\r
-If an option change occurs inside a subpattern, the effect is different. This\r
-is a change of behaviour in Perl 5.005. An option change inside a subpattern\r
-affects only that part of the subpattern that follows it, so\r
-\r
-  (a(?i)b)c\r
-\r
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\r
-By this means, options can be made to have different settings in different\r
-parts of the pattern. Any changes made in one alternative do carry on\r
-into subsequent branches within the same subpattern. For example,\r
-\r
-  (a(?i)b|c)\r
-\r
-matches "ab", "aB", "c", and "C", even though when matching "C" the first\r
-branch is abandoned before the option setting. This is because the effects of\r
-option settings happen at compile time. There would be some very weird\r
-behaviour otherwise.\r
-\r
-The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the\r
-same way as the Perl-compatible options by using the characters U and X\r
-respectively. The (?X) flag setting is special in that it must always occur\r
-earlier in the pattern than any of the additional features it turns on, even\r
-when it is at top level. It is best put at the start.\r
-\r
-\r
-.SH SUBPATTERNS\r
-Subpatterns are delimited by parentheses (round brackets), which can be nested.\r
-Marking part of a pattern as a subpattern does two things:\r
-\r
-1. It localizes a set of alternatives. For example, the pattern\r
-\r
-  cat(aract|erpillar|)\r
-\r
-matches one of the words "cat", "cataract", or "caterpillar". Without the\r
-parentheses, it would match "cataract", "erpillar" or the empty string.\r
-\r
-2. It sets up the subpattern as a capturing subpattern (as defined above).\r
-When the whole pattern matches, that portion of the subject string that matched\r
-the subpattern is passed back to the caller via the \fIovector\fR argument of\r
-\fBpcre_exec()\fR. Opening parentheses are counted from left to right (starting\r
-from 1) to obtain the numbers of the capturing subpatterns.\r
-\r
-For example, if the string "the red king" is matched against the pattern\r
-\r
-  the ((red|white) (king|queen))\r
-\r
-the captured substrings are "red king", "red", and "king", and are numbered 1,\r
-2, and 3.\r
-\r
-The fact that plain parentheses fulfil two functions is not always helpful.\r
-There are often times when a grouping subpattern is required without a\r
-capturing requirement. If an opening parenthesis is followed by "?:", the\r
-subpattern does not do any capturing, and is not counted when computing the\r
-number of any subsequent capturing subpatterns. For example, if the string "the\r
-white queen" is matched against the pattern\r
-\r
-  the ((?:red|white) (king|queen))\r
-\r
-the captured substrings are "white queen" and "queen", and are numbered 1 and\r
-2. The maximum number of captured substrings is 99, and the maximum number of\r
-all subpatterns, both capturing and non-capturing, is 200.\r
-\r
-As a convenient shorthand, if any option settings are required at the start of\r
-a non-capturing subpattern, the option letters may appear between the "?" and\r
-the ":". Thus the two patterns\r
-\r
-  (?i:saturday|sunday)\r
-  (?:(?i)saturday|sunday)\r
-\r
-match exactly the same set of strings. Because alternative branches are tried\r
-from left to right, and options are not reset until the end of the subpattern\r
-is reached, an option setting in one branch does affect subsequent branches, so\r
-the above patterns match "SUNDAY" as well as "Saturday".\r
-\r
-\r
-.SH REPETITION\r
-Repetition is specified by quantifiers, which can follow any of the following\r
-items:\r
-\r
-  a single character, possibly escaped\r
-  the . metacharacter\r
-  a character class\r
-  a back reference (see next section)\r
-  a parenthesized subpattern (unless it is an assertion - see below)\r
-\r
-The general repetition quantifier specifies a minimum and maximum number of\r
-permitted matches, by giving the two numbers in curly brackets (braces),\r
-separated by a comma. The numbers must be less than 65536, and the first must\r
-be less than or equal to the second. For example:\r
-\r
-  z{2,4}\r
-\r
-matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special\r
-character. If the second number is omitted, but the comma is present, there is\r
-no upper limit; if the second number and the comma are both omitted, the\r
-quantifier specifies an exact number of required matches. Thus\r
-\r
-  [aeiou]{3,}\r
-\r
-matches at least 3 successive vowels, but may match many more, while\r
-\r
-  \\d{8}\r
-\r
-matches exactly 8 digits. An opening curly bracket that appears in a position\r
-where a quantifier is not allowed, or one that does not match the syntax of a\r
-quantifier, is taken as a literal character. For example, {,6} is not a\r
-quantifier, but a literal string of four characters.\r
-\r
-The quantifier {0} is permitted, causing the expression to behave as if the\r
-previous item and the quantifier were not present.\r
-\r
-For convenience (and historical compatibility) the three most common\r
-quantifiers have single-character abbreviations:\r
-\r
-  *    is equivalent to {0,}\r
-  +    is equivalent to {1,}\r
-  ?    is equivalent to {0,1}\r
-\r
-It is possible to construct infinite loops by following a subpattern that can\r
-match no characters with a quantifier that has no upper limit, for example:\r
-\r
-  (a?)*\r
-\r
-Earlier versions of Perl and PCRE used to give an error at compile time for\r
-such patterns. However, because there are cases where this can be useful, such\r
-patterns are now accepted, but if any repetition of the subpattern does in fact\r
-match no characters, the loop is forcibly broken.\r
-\r
-By default, the quantifiers are "greedy", that is, they match as much as\r
-possible (up to the maximum number of permitted times), without causing the\r
-rest of the pattern to fail. The classic example of where this gives problems\r
-is in trying to match comments in C programs. These appear between the\r
-sequences /* and */ and within the sequence, individual * and / characters may\r
-appear. An attempt to match C comments by applying the pattern\r
-\r
-  /\\*.*\\*/\r
-\r
-to the string\r
-\r
-  /* first command */  not comment  /* second comment */\r
-\r
-fails, because it matches the entire string owing to the greediness of the .*\r
-item.\r
-\r
-However, if a quantifier is followed by a question mark, it ceases to be\r
-greedy, and instead matches the minimum number of times possible, so the\r
-pattern\r
-\r
-  /\\*.*?\\*/\r
-\r
-does the right thing with the C comments. The meaning of the various\r
-quantifiers is not otherwise changed, just the preferred number of matches.\r
-Do not confuse this use of question mark with its use as a quantifier in its\r
-own right. Because it has two uses, it can sometimes appear doubled, as in\r
-\r
-  \\d??\\d\r
-\r
-which matches one digit by preference, but can match two if that is the only\r
-way the rest of the pattern matches.\r
-\r
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl),\r
-the quantifiers are not greedy by default, but individual ones can be made\r
-greedy by following them with a question mark. In other words, it inverts the\r
-default behaviour.\r
-\r
-When a parenthesized subpattern is quantified with a minimum repeat count that\r
-is greater than 1 or with a limited maximum, more store is required for the\r
-compiled pattern, in proportion to the size of the minimum or maximum.\r
-\r
-If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\r
-to Perl's /s) is set, thus allowing the . to match newlines, the pattern is\r
-implicitly anchored, because whatever follows will be tried against every\r
-character position in the subject string, so there is no point in retrying the\r
-overall match at any position after the first. PCRE treats such a pattern as\r
-though it were preceded by \\A. In cases where it is known that the subject\r
-string contains no newlines, it is worth setting PCRE_DOTALL when the pattern\r
-begins with .* in order to obtain this optimization, or alternatively using ^\r
-to indicate anchoring explicitly.\r
-\r
-When a capturing subpattern is repeated, the value captured is the substring\r
-that matched the final iteration. For example, after\r
-\r
-  (tweedle[dume]{3}\\s*)+\r
-\r
-has matched "tweedledum tweedledee" the value of the captured substring is\r
-"tweedledee". However, if there are nested capturing subpatterns, the\r
-corresponding captured values may have been set in previous iterations. For\r
-example, after\r
-\r
-  /(a|(b))+/\r
-\r
-matches "aba" the value of the second captured substring is "b".\r
-\r
-\r
-.SH BACK REFERENCES\r
-Outside a character class, a backslash followed by a digit greater than 0 (and\r
-possibly further digits) is a back reference to a capturing subpattern earlier\r
-(i.e. to its left) in the pattern, provided there have been that many previous\r
-capturing left parentheses.\r
-\r
-However, if the decimal number following the backslash is less than 10, it is\r
-always taken as a back reference, and causes an error only if there are not\r
-that many capturing left parentheses in the entire pattern. In other words, the\r
-parentheses that are referenced need not be to the left of the reference for\r
-numbers less than 10. See the section entitled "Backslash" above for further\r
-details of the handling of digits following a backslash.\r
-\r
-A back reference matches whatever actually matched the capturing subpattern in\r
-the current subject string, rather than anything matching the subpattern\r
-itself. So the pattern\r
-\r
-  (sens|respons)e and \\1ibility\r
-\r
-matches "sense and sensibility" and "response and responsibility", but not\r
-"sense and responsibility". If caseful matching is in force at the time of the\r
-back reference, the case of letters is relevant. For example,\r
-\r
-  ((?i)rah)\\s+\\1\r
-\r
-matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original\r
-capturing subpattern is matched caselessly.\r
-\r
-There may be more than one back reference to the same subpattern. If a\r
-subpattern has not actually been used in a particular match, any back\r
-references to it always fail. For example, the pattern\r
-\r
-  (a|(bc))\\2\r
-\r
-always fails if it starts to match "a" rather than "bc". Because there may be\r
-up to 99 back references, all digits following the backslash are taken\r
-as part of a potential back reference number. If the pattern continues with a\r
-digit character, some delimiter must be used to terminate the back reference.\r
-If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty\r
-comment can be used.\r
-\r
-A back reference that occurs inside the parentheses to which it refers fails\r
-when the subpattern is first used, so, for example, (a\\1) never matches.\r
-However, such references can be useful inside repeated subpatterns. For\r
-example, the pattern\r
-\r
-  (a|b\\1)+\r
-\r
-matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of\r
-the subpattern, the back reference matches the character string corresponding\r
-to the previous iteration. In order for this to work, the pattern must be such\r
-that the first iteration does not need to match the back reference. This can be\r
-done using alternation, as in the example above, or by a quantifier with a\r
-minimum of zero.\r
-\r
-\r
-.SH ASSERTIONS\r
-An assertion is a test on the characters following or preceding the current\r
-matching point that does not actually consume any characters. The simple\r
-assertions coded as \\b, \\B, \\A, \\Z, \\z, ^ and $ are described above. More\r
-complicated assertions are coded as subpatterns. There are two kinds: those\r
-that look ahead of the current position in the subject string, and those that\r
-look behind it.\r
-\r
-An assertion subpattern is matched in the normal way, except that it does not\r
-cause the current matching position to be changed. Lookahead assertions start\r
-with (?= for positive assertions and (?! for negative assertions. For example,\r
-\r
-  \\w+(?=;)\r
-\r
-matches a word followed by a semicolon, but does not include the semicolon in\r
-the match, and\r
-\r
-  foo(?!bar)\r
-\r
-matches any occurrence of "foo" that is not followed by "bar". Note that the\r
-apparently similar pattern\r
-\r
-  (?!foo)bar\r
-\r
-does not find an occurrence of "bar" that is preceded by something other than\r
-"foo"; it finds any occurrence of "bar" whatsoever, because the assertion\r
-(?!foo) is always true when the next three characters are "bar". A\r
-lookbehind assertion is needed to achieve this effect.\r
-\r
-Lookbehind assertions start with (?<= for positive assertions and (?<! for\r
-negative assertions. For example,\r
-\r
-  (?<!foo)bar\r
-\r
-does find an occurrence of "bar" that is not preceded by "foo". The contents of\r
-a lookbehind assertion are restricted such that all the strings it matches must\r
-have a fixed length. However, if there are several alternatives, they do not\r
-all have to have the same fixed length. Thus\r
-\r
-  (?<=bullock|donkey)\r
-\r
-is permitted, but\r
-\r
-  (?<!dogs?|cats?)\r
-\r
-causes an error at compile time. Branches that match different length strings\r
-are permitted only at the top level of a lookbehind assertion. This is an\r
-extension compared with Perl 5.005, which requires all branches to match the\r
-same length of string. An assertion such as\r
-\r
-  (?<=ab(c|de))\r
-\r
-is not permitted, because its single top-level branch can match two different\r
-lengths, but it is acceptable if rewritten to use two top-level branches:\r
-\r
-  (?<=abc|abde)\r
-\r
-The implementation of lookbehind assertions is, for each alternative, to\r
-temporarily move the current position back by the fixed width and then try to\r
-match. If there are insufficient characters before the current position, the\r
-match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns\r
-can be particularly useful for matching at the ends of strings; an example is\r
-given at the end of the section on once-only subpatterns.\r
-\r
-Several assertions (of any sort) may occur in succession. For example,\r
-\r
-  (?<=\\d{3})(?<!999)foo\r
-\r
-matches "foo" preceded by three digits that are not "999". Notice that each of\r
-the assertions is applied independently at the same point in the subject\r
-string. First there is a check that the previous three characters are all\r
-digits, and then there is a check that the same three characters are not "999".\r
-This pattern does \fInot\fR match "foo" preceded by six characters, the first\r
-of which are digits and the last three of which are not "999". For example, it\r
-doesn't match "123abcfoo". A pattern to do that is\r
-\r
-  (?<=\\d{3}...)(?<!999)foo\r
-\r
-This time the first assertion looks at the preceding six characters, checking\r
-that the first three are digits, and then the second assertion checks that the\r
-preceding three characters are not "999".\r
-\r
-Assertions can be nested in any combination. For example,\r
-\r
-  (?<=(?<!foo)bar)baz\r
-\r
-matches an occurrence of "baz" that is preceded by "bar" which in turn is not\r
-preceded by "foo", while\r
-\r
-  (?<=\\d{3}(?!999)...)foo\r
-\r
-is another pattern which matches "foo" preceded by three digits and any three\r
-characters that are not "999".\r
-\r
-Assertion subpatterns are not capturing subpatterns, and may not be repeated,\r
-because it makes no sense to assert the same thing several times. If any kind\r
-of assertion contains capturing subpatterns within it, these are counted for\r
-the purposes of numbering the capturing subpatterns in the whole pattern.\r
-However, substring capturing is carried out only for positive assertions,\r
-because it does not make sense for negative assertions.\r
-\r
-Assertions count towards the maximum of 200 parenthesized subpatterns.\r
-\r
-\r
-.SH ONCE-ONLY SUBPATTERNS\r
-With both maximizing and minimizing repetition, failure of what follows\r
-normally causes the repeated item to be re-evaluated to see if a different\r
-number of repeats allows the rest of the pattern to match. Sometimes it is\r
-useful to prevent this, either to change the nature of the match, or to cause\r
-it fail earlier than it otherwise might, when the author of the pattern knows\r
-there is no point in carrying on.\r
-\r
-Consider, for example, the pattern \\d+foo when applied to the subject line\r
-\r
-  123456bar\r
-\r
-After matching all 6 digits and then failing to match "foo", the normal\r
-action of the matcher is to try again with only 5 digits matching the \\d+\r
-item, and then with 4, and so on, before ultimately failing. Once-only\r
-subpatterns provide the means for specifying that once a portion of the pattern\r
-has matched, it is not to be re-evaluated in this way, so the matcher would\r
-give up immediately on failing to match "foo" the first time. The notation is\r
-another kind of special parenthesis, starting with (?> as in this example:\r
-\r
-  (?>\\d+)bar\r
-\r
-This kind of parenthesis "locks up" the  part of the pattern it contains once\r
-it has matched, and a failure further into the pattern is prevented from\r
-backtracking into it. Backtracking past it to previous items, however, works as\r
-normal.\r
-\r
-An alternative description is that a subpattern of this type matches the string\r
-of characters that an identical standalone pattern would match, if anchored at\r
-the current point in the subject string.\r
-\r
-Once-only subpatterns are not capturing subpatterns. Simple cases such as the\r
-above example can be thought of as a maximizing repeat that must swallow\r
-everything it can. So, while both \\d+ and \\d+? are prepared to adjust the\r
-number of digits they match in order to make the rest of the pattern match,\r
-(?>\\d+) can only match an entire sequence of digits.\r
-\r
-This construction can of course contain arbitrarily complicated subpatterns,\r
-and it can be nested.\r
-\r
-Once-only subpatterns can be used in conjunction with lookbehind assertions to\r
-specify efficient matching at the end of the subject string. Consider a simple\r
-pattern such as\r
-\r
-  abcd$\r
-\r
-when applied to a long string which does not match. Because matching proceeds\r
-from left to right, PCRE will look for each "a" in the subject and then see if\r
-what follows matches the rest of the pattern. If the pattern is specified as\r
-\r
-  ^.*abcd$\r
-\r
-the initial .* matches the entire string at first, but when this fails (because\r
-there is no following "a"), it backtracks to match all but the last character,\r
-then all but the last two characters, and so on. Once again the search for "a"\r
-covers the entire string, from right to left, so we are no better off. However,\r
-if the pattern is written as\r
-\r
-  ^(?>.*)(?<=abcd)\r
-\r
-there can be no backtracking for the .* item; it can match only the entire\r
-string. The subsequent lookbehind assertion does a single test on the last four\r
-characters. If it fails, the match fails immediately. For long strings, this\r
-approach makes a significant difference to the processing time.\r
-\r
-When a pattern contains an unlimited repeat inside a subpattern that can itself\r
-be repeated an unlimited number of times, the use of a once-only subpattern is\r
-the only way to avoid some failing matches taking a very long time indeed.\r
-The pattern\r
-\r
-  (\\D+|<\\d+>)*[!?]\r
-\r
-matches an unlimited number of substrings that either consist of non-digits, or\r
-digits enclosed in <>, followed by either ! or ?. When it matches, it runs\r
-quickly. However, if it is applied to\r
-\r
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r
-\r
-it takes a long time before reporting failure. This is because the string can\r
-be divided between the two repeats in a large number of ways, and all have to\r
-be tried. (The example used [!?] rather than a single character at the end,\r
-because both PCRE and Perl have an optimization that allows for fast failure\r
-when a single character is used. They remember the last single character that\r
-is required for a match, and fail early if it is not present in the string.)\r
-If the pattern is changed to\r
-\r
-  ((?>\\D+)|<\\d+>)*[!?]\r
-\r
-sequences of non-digits cannot be broken, and failure happens quickly.\r
-\r
-\r
-.SH CONDITIONAL SUBPATTERNS\r
-It is possible to cause the matching process to obey a subpattern\r
-conditionally or to choose between two alternative subpatterns, depending on\r
-the result of an assertion, or whether a previous capturing subpattern matched\r
-or not. The two possible forms of conditional subpattern are\r
-\r
-  (?(condition)yes-pattern)\r
-  (?(condition)yes-pattern|no-pattern)\r
-\r
-If the condition is satisfied, the yes-pattern is used; otherwise the\r
-no-pattern (if present) is used. If there are more than two alternatives in the\r
-subpattern, a compile-time error occurs.\r
-\r
-There are two kinds of condition. If the text between the parentheses consists\r
-of a sequence of digits, the condition is satisfied if the capturing subpattern\r
-of that number has previously matched. The number must be greater than zero.\r
-Consider the following pattern, which contains non-significant white space to\r
-make it more readable (assume the PCRE_EXTENDED option) and to divide it into\r
-three parts for ease of discussion:\r
-\r
-  ( \\( )?    [^()]+    (?(1) \\) )\r
-\r
-The first part matches an optional opening parenthesis, and if that\r
-character is present, sets it as the first captured substring. The second part\r
-matches one or more characters that are not parentheses. The third part is a\r
-conditional subpattern that tests whether the first set of parentheses matched\r
-or not. If they did, that is, if subject started with an opening parenthesis,\r
-the condition is true, and so the yes-pattern is executed and a closing\r
-parenthesis is required. Otherwise, since no-pattern is not present, the\r
-subpattern matches nothing. In other words, this pattern matches a sequence of\r
-non-parentheses, optionally enclosed in parentheses.\r
-\r
-If the condition is not a sequence of digits, it must be an assertion. This may\r
-be a positive or negative lookahead or lookbehind assertion. Consider this\r
-pattern, again containing non-significant white space, and with the two\r
-alternatives on the second line:\r
-\r
-  (?(?=[^a-z]*[a-z])\r
-  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} )\r
-\r
-The condition is a positive lookahead assertion that matches an optional\r
-sequence of non-letters followed by a letter. In other words, it tests for the\r
-presence of at least one letter in the subject. If a letter is found, the\r
-subject is matched against the first alternative; otherwise it is matched\r
-against the second. This pattern matches strings in one of the two forms\r
-dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\r
-\r
-\r
-.SH COMMENTS\r
-The sequence (?# marks the start of a comment which continues up to the next\r
-closing parenthesis. Nested parentheses are not permitted. The characters\r
-that make up a comment play no part in the pattern matching at all.\r
-\r
-If the PCRE_EXTENDED option is set, an unescaped # character outside a\r
-character class introduces a comment that continues up to the next newline\r
-character in the pattern.\r
-\r
-\r
-.SH RECURSIVE PATTERNS\r
-Consider the problem of matching a string in parentheses, allowing for\r
-unlimited nested parentheses. Without the use of recursion, the best that can\r
-be done is to use a pattern that matches up to some fixed depth of nesting. It\r
-is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an\r
-experimental facility that allows regular expressions to recurse (amongst other\r
-things). It does this by interpolating Perl code in the expression at run time,\r
-and the code can refer to the expression itself. A Perl pattern to solve the\r
-parentheses problem can be created like this:\r
-\r
-  $re = qr{\\( (?: (?>[^()]+) | (?p{$re}) )* \\)}x;\r
-\r
-The (?p{...}) item interpolates Perl code at run time, and in this case refers\r
-recursively to the pattern in which it appears. Obviously, PCRE cannot support\r
-the interpolation of Perl code. Instead, the special item (?R) is provided for\r
-the specific case of recursion. This PCRE pattern solves the parentheses\r
-problem (assume the PCRE_EXTENDED option is set so that white space is\r
-ignored):\r
-\r
-  \\( ( (?>[^()]+) | (?R) )* \\)\r
-\r
-First it matches an opening parenthesis. Then it matches any number of\r
-substrings which can either be a sequence of non-parentheses, or a recursive\r
-match of the pattern itself (i.e. a correctly parenthesized substring). Finally\r
-there is a closing parenthesis.\r
-\r
-This particular example pattern contains nested unlimited repeats, and so the\r
-use of a once-only subpattern for matching strings of non-parentheses is\r
-important when applying the pattern to strings that do not match. For example,\r
-when it is applied to\r
-\r
-  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\r
-\r
-it yields "no match" quickly. However, if a once-only subpattern is not used,\r
-the match runs for a very long time indeed because there are so many different\r
-ways the + and * repeats can carve up the subject, and all have to be tested\r
-before failure can be reported.\r
-\r
-The values set for any capturing subpatterns are those from the outermost level\r
-of the recursion at which the subpattern value is set. If the pattern above is\r
-matched against\r
-\r
-  (ab(cd)ef)\r
-\r
-the value for the capturing parentheses is "ef", which is the last value taken\r
-on at the top level. If additional parentheses are added, giving\r
-\r
-  \\( ( ( (?>[^()]+) | (?R) )* ) \\)\r
-     ^                        ^\r
-     ^                        ^\r
-the string they capture is "ab(cd)ef", the contents of the top level\r
-parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE\r
-has to obtain extra memory to store data during a recursion, which it does by\r
-using \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR afterwards. If no\r
-memory can be obtained, it saves data for the first 15 capturing parentheses\r
-only, as there is no way to give an out-of-memory error from within a\r
-recursion.\r
-\r
-\r
-.SH PERFORMANCE\r
-Certain items that may appear in patterns are more efficient than others. It is\r
-more efficient to use a character class like [aeiou] than a set of alternatives\r
-such as (a|e|i|o|u). In general, the simplest construction that provides the\r
-required behaviour is usually the most efficient. Jeffrey Friedl's book\r
-contains a lot of discussion about optimizing regular expressions for efficient\r
-performance.\r
-\r
-When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is\r
-implicitly anchored by PCRE, since it can match only at the start of a subject\r
-string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization,\r
-because the . metacharacter does not then match a newline, and if the subject\r
-string contains newlines, the pattern may match from the character immediately\r
-following one of them instead of from the very start. For example, the pattern\r
-\r
-  (.*) second\r
-\r
-matches the subject "first\\nand second" (where \\n stands for a newline\r
-character) with the first captured substring being "and". In order to do this,\r
-PCRE has to retry the match starting after every newline in the subject.\r
-\r
-If you are using such a pattern with subject strings that do not contain\r
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting\r
-the pattern with ^.* to indicate explicit anchoring. That saves PCRE from\r
-having to scan along the subject looking for a newline to restart at.\r
-\r
-Beware of patterns that contain nested indefinite repeats. These can take a\r
-long time to run when applied to a string that does not match. Consider the\r
-pattern fragment\r
-\r
-  (a+)*\r
-\r
-This can match "aaaa" in 33 different ways, and this number increases very\r
-rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\r
-times, and for each of those cases other than 0, the + repeats can match\r
-different numbers of times.) When the remainder of the pattern is such that the\r
-entire match is going to fail, PCRE has in principle to try every possible\r
-variation, and this can take an extremely long time.\r
-\r
-An optimization catches some of the more simple cases such as\r
-\r
-  (a+)*b\r
-\r
-where a literal character follows. Before embarking on the standard matching\r
-procedure, PCRE checks that there is a "b" later in the subject string, and if\r
-there is not, it fails the match immediately. However, when there is no\r
-following literal this optimization cannot be used. You can see the difference\r
-by comparing the behaviour of\r
-\r
-  (a+)*\\d\r
-\r
-with the pattern above. The former gives a failure almost instantly when\r
-applied to a whole line of "a" characters, whereas the latter takes an\r
-appreciable time with strings longer than about 20 characters.\r
-\r
-\r
-.SH UTF-8 SUPPORT\r
-Starting at release 3.3, PCRE has some support for character strings encoded\r
-in the UTF-8 format. This is incomplete, and is regarded as experimental. In\r
-order to use it, you must configure PCRE to include UTF-8 support in the code,\r
-and, in addition, you must call \fBpcre_compile()\fR with the PCRE_UTF8 option\r
-flag. When you do this, both the pattern and any subject strings that are\r
-matched against it are treated as UTF-8 strings instead of just strings of\r
-bytes, but only in the cases that are mentioned below.\r
-\r
-If you compile PCRE with UTF-8 support, but do not use it at run time, the\r
-library will be a bit bigger, but the additional run time overhead is limited\r
-to testing the PCRE_UTF8 flag in several places, so should not be very large.\r
-\r
-PCRE assumes that the strings it is given contain valid UTF-8 codes. It does\r
-not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE,\r
-the results are undefined.\r
-\r
-Running with PCRE_UTF8 set causes these changes in the way PCRE works:\r
-\r
-1. In a pattern, the escape sequence \\x{...}, where the contents of the braces\r
-is a string of hexadecimal digits, is interpreted as a UTF-8 character whose\r
-code number is the given hexadecimal number, for example: \\x{1234}. This\r
-inserts from one to six literal bytes into the pattern, using the UTF-8\r
-encoding. If a non-hexadecimal digit appears between the braces, the item is\r
-not recognized.\r
-\r
-2. The original hexadecimal escape sequence, \\xhh, generates a two-byte UTF-8\r
-character if its value is greater than 127.\r
-\r
-3. Repeat quantifiers are NOT correctly handled if they follow a multibyte\r
-character. For example, \\x{100}* and \\xc3+ do not work. If you want to\r
-repeat such characters, you must enclose them in non-capturing parentheses,\r
-for example (?:\\x{100}), at present.\r
-\r
-4. The dot metacharacter matches one UTF-8 character instead of a single byte.\r
-\r
-5. Unlike literal UTF-8 characters, the dot metacharacter followed by a\r
-repeat quantifier does operate correctly on UTF-8 characters instead of\r
-single bytes.\r
-\r
-4. Although the \\x{...} escape is permitted in a character class, characters\r
-whose values are greater than 255 cannot be included in a class.\r
-\r
-5. A class is matched against a UTF-8 character instead of just a single byte,\r
-but it can match only characters whose values are less than 256. Characters\r
-with greater values always fail to match a class.\r
-\r
-6. Repeated classes work correctly on multiple characters.\r
-\r
-7. Classes containing just a single character whose value is greater than 127\r
-(but less than 256), for example, [\\x80] or [^\\x{93}], do not work because\r
-these are optimized into single byte matches. In the first case, of course,\r
-the class brackets are just redundant.\r
-\r
-8. Lookbehind assertions move backwards in the subject by a fixed number of\r
-characters instead of a fixed number of bytes. Simple cases have been tested\r
-to work correctly, but there may be hidden gotchas herein.\r
-\r
-9. The character types such as \\d and \\w do not work correctly with UTF-8\r
-characters. They continue to test a single byte.\r
-\r
-10. Anything not explicitly mentioned here continues to work in bytes rather\r
-than in characters.\r
-\r
-The following UTF-8 features of Perl 5.6 are not implemented:\r
-\r
-1. The escape sequence \\C to match a single byte.\r
-\r
-2. The use of Unicode tables and properties and escapes \\p, \\P, and \\X.\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-University Computing Service,\r
-.br\r
-New Museums Site,\r
-.br\r
-Cambridge CB2 3QG, England.\r
-.br\r
-Phone: +44 1223 334714\r
-\r
-Last updated: 28 August 2000,\r
-.br\r
-  the 250th anniversary of the death of J.S. Bach.\r
-.br\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcre.html b/pcre/doc/pcre.html
deleted file mode 100644 (file)
index b12b212..0000000
+++ /dev/null
@@ -1,2397 +0,0 @@
-<HTML>\r
-<HEAD>\r
-<TITLE>pcre specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcre specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">MULTI-THREADING</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">COMPILING A PATTERN</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">STUDYING A PATTERN</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">LOCALE SUPPORT</A>\r
-<LI><A NAME="TOC8" HREF="#SEC8">INFORMATION ABOUT A PATTERN</A>\r
-<LI><A NAME="TOC9" HREF="#SEC9">MATCHING A PATTERN</A>\r
-<LI><A NAME="TOC10" HREF="#SEC10">EXTRACTING CAPTURED SUBSTRINGS</A>\r
-<LI><A NAME="TOC11" HREF="#SEC11">LIMITATIONS</A>\r
-<LI><A NAME="TOC12" HREF="#SEC12">DIFFERENCES FROM PERL</A>\r
-<LI><A NAME="TOC13" HREF="#SEC13">REGULAR EXPRESSION DETAILS</A>\r
-<LI><A NAME="TOC14" HREF="#SEC14">BACKSLASH</A>\r
-<LI><A NAME="TOC15" HREF="#SEC15">CIRCUMFLEX AND DOLLAR</A>\r
-<LI><A NAME="TOC16" HREF="#SEC16">FULL STOP (PERIOD, DOT)</A>\r
-<LI><A NAME="TOC17" HREF="#SEC17">SQUARE BRACKETS</A>\r
-<LI><A NAME="TOC18" HREF="#SEC18">POSIX CHARACTER CLASSES</A>\r
-<LI><A NAME="TOC19" HREF="#SEC19">VERTICAL BAR</A>\r
-<LI><A NAME="TOC20" HREF="#SEC20">INTERNAL OPTION SETTING</A>\r
-<LI><A NAME="TOC21" HREF="#SEC21">SUBPATTERNS</A>\r
-<LI><A NAME="TOC22" HREF="#SEC22">REPETITION</A>\r
-<LI><A NAME="TOC23" HREF="#SEC23">BACK REFERENCES</A>\r
-<LI><A NAME="TOC24" HREF="#SEC24">ASSERTIONS</A>\r
-<LI><A NAME="TOC25" HREF="#SEC25">ONCE-ONLY SUBPATTERNS</A>\r
-<LI><A NAME="TOC26" HREF="#SEC26">CONDITIONAL SUBPATTERNS</A>\r
-<LI><A NAME="TOC27" HREF="#SEC27">COMMENTS</A>\r
-<LI><A NAME="TOC28" HREF="#SEC28">RECURSIVE PATTERNS</A>\r
-<LI><A NAME="TOC29" HREF="#SEC29">PERFORMANCE</A>\r
-<LI><A NAME="TOC30" HREF="#SEC30">UTF-8 SUPPORT</A>\r
-<LI><A NAME="TOC31" HREF="#SEC31">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcre - Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>#include &#60;pcre.h&#62;</B>\r
-</P>\r
-<P>\r
-<B>pcre *pcre_compile(const char *<I>pattern</I>, int <I>options</I>,</B>\r
-<B>const char **<I>errptr</I>, int *<I>erroffset</I>,</B>\r
-<B>const unsigned char *<I>tableptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>pcre_extra *pcre_study(const pcre *<I>code</I>, int <I>options</I>,</B>\r
-<B>const char **<I>errptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_exec(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B>\r
-<B>const char *<I>subject</I>, int <I>length</I>, int <I>startoffset</I>,</B>\r
-<B>int <I>options</I>, int *<I>ovector</I>, int <I>ovecsize</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_copy_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>\r
-<B>int <I>stringcount</I>, int <I>stringnumber</I>, char *<I>buffer</I>,</B>\r
-<B>int <I>buffersize</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_get_substring(const char *<I>subject</I>, int *<I>ovector</I>,</B>\r
-<B>int <I>stringcount</I>, int <I>stringnumber</I>,</B>\r
-<B>const char **<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_get_substring_list(const char *<I>subject</I>,</B>\r
-<B>int *<I>ovector</I>, int <I>stringcount</I>, const char ***<I>listptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>void pcre_free_substring(const char *<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>void pcre_free_substring_list(const char **<I>stringptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>const unsigned char *pcre_maketables(void);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_fullinfo(const pcre *<I>code</I>, const pcre_extra *<I>extra</I>,</B>\r
-<B>int <I>what</I>, void *<I>where</I>);</B>\r
-</P>\r
-<P>\r
-<B>int pcre_info(const pcre *<I>code</I>, int *<I>optptr</I>, int</B>\r
-<B>*<I>firstcharptr</I>);</B>\r
-</P>\r
-<P>\r
-<B>char *pcre_version(void);</B>\r
-</P>\r
-<P>\r
-<B>void *(*pcre_malloc)(size_t);</B>\r
-</P>\r
-<P>\r
-<B>void (*pcre_free)(void *);</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-The PCRE library is a set of functions that implement regular expression\r
-pattern matching using the same syntax and semantics as Perl 5, with just a few\r
-differences (see below). The current implementation corresponds to Perl 5.005,\r
-with some additional features from later versions. This includes some\r
-experimental, incomplete support for UTF-8 encoded strings. Details of exactly\r
-what is and what is not supported are given below.\r
-</P>\r
-<P>\r
-PCRE has its own native API, which is described in this document. There is also\r
-a set of wrapper functions that correspond to the POSIX regular expression API.\r
-These are described in the <B>pcreposix</B> documentation.\r
-</P>\r
-<P>\r
-The native API function prototypes are defined in the header file <B>pcre.h</B>,\r
-and on Unix systems the library itself is called <B>libpcre.a</B>, so can be\r
-accessed by adding <B>-lpcre</B> to the command for linking an application which\r
-calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to\r
-contain the major and minor release numbers for the library. Applications can\r
-use these to include support for different releases.\r
-</P>\r
-<P>\r
-The functions <B>pcre_compile()</B>, <B>pcre_study()</B>, and <B>pcre_exec()</B>\r
-are used for compiling and matching regular expressions.\r
-</P>\r
-<P>\r
-The functions <B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and\r
-<B>pcre_get_substring_list()</B> are convenience functions for extracting\r
-captured substrings from a matched subject string; <B>pcre_free_substring()</B>\r
-and <B>pcre_free_substring_list()</B> are also provided, to free the memory used\r
-for extracted strings.\r
-</P>\r
-<P>\r
-The function <B>pcre_maketables()</B> is used (optionally) to build a set of\r
-character tables in the current locale for passing to <B>pcre_compile()</B>.\r
-</P>\r
-<P>\r
-The function <B>pcre_fullinfo()</B> is used to find out information about a\r
-compiled pattern; <B>pcre_info()</B> is an obsolete version which returns only\r
-some of the available information, but is retained for backwards compatibility.\r
-The function <B>pcre_version()</B> returns a pointer to a string containing the\r
-version of PCRE and its date of release.\r
-</P>\r
-<P>\r
-The global variables <B>pcre_malloc</B> and <B>pcre_free</B> initially contain\r
-the entry points of the standard <B>malloc()</B> and <B>free()</B> functions\r
-respectively. PCRE calls the memory management functions via these variables,\r
-so a calling program can replace them if it wishes to intercept the calls. This\r
-should be done before calling any PCRE functions.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">MULTI-THREADING</A>\r
-<P>\r
-The PCRE functions can be used in multi-threading applications, with the\r
-proviso that the memory management functions pointed to by <B>pcre_malloc</B>\r
-and <B>pcre_free</B> are shared by all threads.\r
-</P>\r
-<P>\r
-The compiled form of a regular expression is not altered during matching, so\r
-the same compiled pattern can safely be used by several threads at once.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">COMPILING A PATTERN</A>\r
-<P>\r
-The function <B>pcre_compile()</B> is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument <I>pattern</I>. A pointer to a single block of memory\r
-that is obtained via <B>pcre_malloc</B> is returned. This contains the\r
-compiled code and related data. The <B>pcre</B> type is defined for this for\r
-convenience, but in fact <B>pcre</B> is just a typedef for <B>void</B>, since the\r
-contents of the block are not externally defined. It is up to the caller to\r
-free the memory when it is no longer required.\r
-</P>\r
-<P>\r
-The size of a compiled pattern is roughly proportional to the length of the\r
-pattern string, except that each character class (other than those containing\r
-just a single character, negated or not) requires 33 bytes, and repeat\r
-quantifiers with a minimum greater than one or a bounded maximum cause the\r
-relevant portions of the compiled pattern to be replicated.\r
-</P>\r
-<P>\r
-The <I>options</I> argument contains independent bits that affect the\r
-compilation. It should be zero if no options are required. Some of the options,\r
-in particular, those that are compatible with Perl, can also be set and unset\r
-from within the pattern (see the detailed description of regular expressions\r
-below). For these options, the contents of the <I>options</I> argument specifies\r
-their initial settings at the start of compilation and execution. The\r
-PCRE_ANCHORED option can be set at the time of matching as well as at compile\r
-time.\r
-</P>\r
-<P>\r
-If <I>errptr</I> is NULL, <B>pcre_compile()</B> returns NULL immediately.\r
-Otherwise, if compilation of a pattern fails, <B>pcre_compile()</B> returns\r
-NULL, and sets the variable pointed to by <I>errptr</I> to point to a textual\r
-error message. The offset from the start of the pattern to the character where\r
-the error was discovered is placed in the variable pointed to by\r
-<I>erroffset</I>, which must not be NULL. If it is, an immediate error is given.\r
-</P>\r
-<P>\r
-If the final argument, <I>tableptr</I>, is NULL, PCRE uses a default set of\r
-character tables which are built when it is compiled, using the default C\r
-locale. Otherwise, <I>tableptr</I> must be the result of a call to\r
-<B>pcre_maketables()</B>. See the section on locale support below.\r
-</P>\r
-<P>\r
-The following option bits are defined in the header file:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ANCHORED\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, the pattern is forced to be "anchored", that is, it is\r
-constrained to match only at the start of the string which is being searched\r
-(the "subject string"). This effect can also be achieved by appropriate\r
-constructs in the pattern itself, which is the only way to do it in Perl.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_CASELESS\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, letters in the pattern match both upper and lower case\r
-letters. It is equivalent to Perl's /i option.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_DOLLAR_ENDONLY\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, a dollar metacharacter in the pattern matches only at the\r
-end of the subject string. Without this option, a dollar also matches\r
-immediately before the final character if it is a newline (but not before any\r
-other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is\r
-set. There is no equivalent to this option in Perl.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_DOTALL\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, a dot metacharater in the pattern matches all characters,\r
-including newlines. Without it, newlines are excluded. This option is\r
-equivalent to Perl's /s option. A negative class such as [^a] always matches a\r
-newline character, independent of the setting of this option.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_EXTENDED\r
-</PRE>\r
-</P>\r
-<P>\r
-If this bit is set, whitespace data characters in the pattern are totally\r
-ignored except when escaped or inside a character class, and characters between\r
-an unescaped # outside a character class and the next newline character,\r
-inclusive, are also ignored. This is equivalent to Perl's /x option, and makes\r
-it possible to include comments inside complicated patterns. Note, however,\r
-that this applies only to data characters. Whitespace characters may never\r
-appear within special character sequences in a pattern, for example within the\r
-sequence (?( which introduces a conditional subpattern.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_EXTRA\r
-</PRE>\r
-</P>\r
-<P>\r
-This option was invented in order to turn on additional functionality of PCRE\r
-that is incompatible with Perl, but it is currently of very little use. When\r
-set, any backslash in a pattern that is followed by a letter that has no\r
-special meaning causes an error, thus reserving these combinations for future\r
-expansion. By default, as in Perl, a backslash followed by a letter with no\r
-special meaning is treated as a literal. There are at present no other features\r
-controlled by this option. It can also be set by a (?X) option setting within a\r
-pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_MULTILINE\r
-</PRE>\r
-</P>\r
-<P>\r
-By default, PCRE treats the subject string as consisting of a single "line" of\r
-characters (even if it actually contains several newlines). The "start of line"\r
-metacharacter (^) matches only at the start of the string, while the "end of\r
-line" metacharacter ($) matches only at the end of the string, or before a\r
-terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as\r
-Perl.\r
-</P>\r
-<P>\r
-When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs\r
-match immediately following or immediately before any newline in the subject\r
-string, respectively, as well as at the very start and end. This is equivalent\r
-to Perl's /m option. If there are no "\n" characters in a subject string, or\r
-no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no\r
-effect.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_UNGREEDY\r
-</PRE>\r
-</P>\r
-<P>\r
-This option inverts the "greediness" of the quantifiers so that they are not\r
-greedy by default, but become greedy if followed by "?". It is not compatible\r
-with Perl. It can also be set by a (?U) option setting within the pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_UTF8\r
-</PRE>\r
-</P>\r
-<P>\r
-This option causes PCRE to regard both the pattern and the subject as strings\r
-of UTF-8 characters instead of just byte strings. However, it is available only\r
-if PCRE has been built to include UTF-8 support. If not, the use of this option\r
-provokes an error. Support for UTF-8 is new, experimental, and incomplete.\r
-Details of exactly what it entails are given below.\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">STUDYING A PATTERN</A>\r
-<P>\r
-When a pattern is going to be used several times, it is worth spending more\r
-time analyzing it in order to speed up the time taken for matching. The\r
-function <B>pcre_study()</B> takes a pointer to a compiled pattern as its first\r
-argument, and returns a pointer to a <B>pcre_extra</B> block (another <B>void</B>\r
-typedef) containing additional information about the pattern; this can be\r
-passed to <B>pcre_exec()</B>. If no additional information is available, NULL\r
-is returned.\r
-</P>\r
-<P>\r
-The second argument contains option bits. At present, no options are defined\r
-for <B>pcre_study()</B>, and this argument should always be zero.\r
-</P>\r
-<P>\r
-The third argument for <B>pcre_study()</B> is a pointer to an error message. If\r
-studying succeeds (even if no data is returned), the variable it points to is\r
-set to NULL. Otherwise it points to a textual error message.\r
-</P>\r
-<P>\r
-At present, studying a pattern is useful only for non-anchored patterns that do\r
-not have a single fixed starting character. A bitmap of possible starting\r
-characters is created.\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">LOCALE SUPPORT</A>\r
-<P>\r
-PCRE handles caseless matching, and determines whether characters are letters,\r
-digits, or whatever, by reference to a set of tables. The library contains a\r
-default set of tables which is created in the default C locale when PCRE is\r
-compiled. This is used when the final argument of <B>pcre_compile()</B> is NULL,\r
-and is sufficient for many applications.\r
-</P>\r
-<P>\r
-An alternative set of tables can, however, be supplied. Such tables are built\r
-by calling the <B>pcre_maketables()</B> function, which has no arguments, in the\r
-relevant locale. The result can then be passed to <B>pcre_compile()</B> as often\r
-as necessary. For example, to build and use tables that are appropriate for the\r
-French locale (where accented characters with codes greater than 128 are\r
-treated as letters), the following code could be used:\r
-</P>\r
-<P>\r
-<PRE>\r
-  setlocale(LC_CTYPE, "fr");\r
-  tables = pcre_maketables();\r
-  re = pcre_compile(..., tables);\r
-</PRE>\r
-</P>\r
-<P>\r
-The tables are built in memory that is obtained via <B>pcre_malloc</B>. The\r
-pointer that is passed to <B>pcre_compile</B> is saved with the compiled\r
-pattern, and the same tables are used via this pointer by <B>pcre_study()</B>\r
-and <B>pcre_exec()</B>. Thus for any single pattern, compilation, studying and\r
-matching all happen in the same locale, but different patterns can be compiled\r
-in different locales. It is the caller's responsibility to ensure that the\r
-memory containing the tables remains available for as long as it is needed.\r
-</P>\r
-<LI><A NAME="SEC8" HREF="#TOC1">INFORMATION ABOUT A PATTERN</A>\r
-<P>\r
-The <B>pcre_fullinfo()</B> function returns information about a compiled\r
-pattern. It replaces the obsolete <B>pcre_info()</B> function, which is\r
-nevertheless retained for backwards compability (and is documented below).\r
-</P>\r
-<P>\r
-The first argument for <B>pcre_fullinfo()</B> is a pointer to the compiled\r
-pattern. The second argument is the result of <B>pcre_study()</B>, or NULL if\r
-the pattern was not studied. The third argument specifies which piece of\r
-information is required, while the fourth argument is a pointer to a variable\r
-to receive the data. The yield of the function is zero for success, or one of\r
-the following negative numbers:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NULL       the argument <I>code</I> was NULL\r
-                        the argument <I>where</I> was NULL\r
-  PCRE_ERROR_BADMAGIC   the "magic number" was not found\r
-  PCRE_ERROR_BADOPTION  the value of <I>what</I> was invalid\r
-</PRE>\r
-</P>\r
-<P>\r
-The possible values for the third argument are defined in <B>pcre.h</B>, and are\r
-as follows:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_OPTIONS\r
-</PRE>\r
-</P>\r
-<P>\r
-Return a copy of the options with which the pattern was compiled. The fourth\r
-argument should point to au <B>unsigned long int</B> variable. These option bits\r
-are those specified in the call to <B>pcre_compile()</B>, modified by any\r
-top-level option settings within the pattern itself, and with the PCRE_ANCHORED\r
-bit forcibly set if the form of the pattern implies that it can match only at\r
-the start of a subject string.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_SIZE\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the size of the compiled pattern, that is, the value that was passed as\r
-the argument to <B>pcre_malloc()</B> when PCRE was getting memory in which to\r
-place the compiled data. The fourth argument should point to a <B>size_t</B>\r
-variable.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_CAPTURECOUNT\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the number of capturing subpatterns in the pattern. The fourth argument\r
-should point to an \fbint\fR variable.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_BACKREFMAX\r
-</PRE>\r
-</P>\r
-<P>\r
-Return the number of the highest back reference in the pattern. The fourth\r
-argument should point to an <B>int</B> variable. Zero is returned if there are\r
-no back references.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_FIRSTCHAR\r
-</PRE>\r
-</P>\r
-<P>\r
-Return information about the first character of any matched string, for a\r
-non-anchored pattern. If there is a fixed first character, e.g. from a pattern\r
-such as (cat|cow|coyote), it is returned in the integer pointed to by\r
-<I>where</I>. Otherwise, if either\r
-</P>\r
-<P>\r
-(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch\r
-starts with "^", or\r
-</P>\r
-<P>\r
-(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set\r
-(if it were set, the pattern would be anchored),\r
-</P>\r
-<P>\r
--1 is returned, indicating that the pattern matches only at the start of a\r
-subject string or after any "\n" within the string. Otherwise -2 is returned.\r
-For anchored patterns, -2 is returned.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_FIRSTTABLE\r
-</PRE>\r
-</P>\r
-<P>\r
-If the pattern was studied, and this resulted in the construction of a 256-bit\r
-table indicating a fixed set of characters for the first character in any\r
-matching string, a pointer to the table is returned. Otherwise NULL is\r
-returned. The fourth argument should point to an <B>unsigned char *</B>\r
-variable.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_INFO_LASTLITERAL\r
-</PRE>\r
-</P>\r
-<P>\r
-For a non-anchored pattern, return the value of the rightmost literal character\r
-which must exist in any matched string, other than at its start. The fourth\r
-argument should point to an <B>int</B> variable. If there is no such character,\r
-or if the pattern is anchored, -1 is returned. For example, for the pattern\r
-/a\d+z\d+/ the returned value is 'z'.\r
-</P>\r
-<P>\r
-The <B>pcre_info()</B> function is now obsolete because its interface is too\r
-restrictive to return all the available data about a compiled pattern. New\r
-programs should use <B>pcre_fullinfo()</B> instead. The yield of\r
-<B>pcre_info()</B> is the number of capturing subpatterns, or one of the\r
-following negative numbers:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NULL       the argument <I>code</I> was NULL\r
-  PCRE_ERROR_BADMAGIC   the "magic number" was not found\r
-</PRE>\r
-</P>\r
-<P>\r
-If the <I>optptr</I> argument is not NULL, a copy of the options with which the\r
-pattern was compiled is placed in the integer it points to (see\r
-PCRE_INFO_OPTIONS above).\r
-</P>\r
-<P>\r
-If the pattern is not anchored and the <I>firstcharptr</I> argument is not NULL,\r
-it is used to pass back information about the first character of any matched\r
-string (see PCRE_INFO_FIRSTCHAR above).\r
-</P>\r
-<LI><A NAME="SEC9" HREF="#TOC1">MATCHING A PATTERN</A>\r
-<P>\r
-The function <B>pcre_exec()</B> is called to match a subject string against a\r
-pre-compiled pattern, which is passed in the <I>code</I> argument. If the\r
-pattern has been studied, the result of the study should be passed in the\r
-<I>extra</I> argument. Otherwise this must be NULL.\r
-</P>\r
-<P>\r
-The PCRE_ANCHORED option can be passed in the <I>options</I> argument, whose\r
-unused bits must be zero. However, if a pattern was compiled with\r
-PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it\r
-cannot be made unachored at matching time.\r
-</P>\r
-<P>\r
-There are also three further options that can be set only at matching time:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_NOTBOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The first character of the string is not the beginning of a line, so the\r
-circumflex metacharacter should not match before it. Setting this without\r
-PCRE_MULTILINE (at compile time) causes circumflex never to match.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_NOTEOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The end of the string is not the end of a line, so the dollar metacharacter\r
-should not match it nor (except in multiline mode) a newline immediately before\r
-it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never\r
-to match.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_NOTEMPTY\r
-</PRE>\r
-</P>\r
-<P>\r
-An empty string is not considered to be a valid match if this option is set. If\r
-there are alternatives in the pattern, they are tried. If all the alternatives\r
-match the empty string, the entire match fails. For example, if the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  a?b?\r
-</PRE>\r
-</P>\r
-<P>\r
-is applied to a string not beginning with "a" or "b", it matches the empty\r
-string at the start of the subject. With PCRE_NOTEMPTY set, this match is not\r
-valid, so PCRE searches further into the string for occurrences of "a" or "b".\r
-</P>\r
-<P>\r
-Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case\r
-of a pattern match of the empty string within its <B>split()</B> function, and\r
-when using the /g modifier. It is possible to emulate Perl's behaviour after\r
-matching a null string by first trying the match again at the same offset with\r
-PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see\r
-below) and trying an ordinary match again.\r
-</P>\r
-<P>\r
-The subject string is passed as a pointer in <I>subject</I>, a length in\r
-<I>length</I>, and a starting offset in <I>startoffset</I>. Unlike the pattern\r
-string, it may contain binary zero characters. When the starting offset is\r
-zero, the search for a match starts at the beginning of the subject, and this\r
-is by far the most common case.\r
-</P>\r
-<P>\r
-A non-zero starting offset is useful when searching for another match in the\r
-same subject by calling <B>pcre_exec()</B> again after a previous success.\r
-Setting <I>startoffset</I> differs from just passing over a shortened string and\r
-setting PCRE_NOTBOL in the case of a pattern that begins with any kind of\r
-lookbehind. For example, consider the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  \Biss\B\r
-</PRE>\r
-</P>\r
-<P>\r
-which finds occurrences of "iss" in the middle of words. (\B matches only if\r
-the current position in the subject is not a word boundary.) When applied to\r
-the string "Mississipi" the first call to <B>pcre_exec()</B> finds the first\r
-occurrence. If <B>pcre_exec()</B> is called again with just the remainder of the\r
-subject, namely "issipi", it does not match, because \B is always false at the\r
-start of the subject, which is deemed to be a word boundary. However, if\r
-<B>pcre_exec()</B> is passed the entire string again, but with <I>startoffset</I>\r
-set to 4, it finds the second occurrence of "iss" because it is able to look\r
-behind the starting point to discover that it is preceded by a letter.\r
-</P>\r
-<P>\r
-If a non-zero starting offset is passed when the pattern is anchored, one\r
-attempt to match at the given offset is tried. This can only succeed if the\r
-pattern does not require the match to be at the start of the subject.\r
-</P>\r
-<P>\r
-In general, a pattern matches a certain portion of the subject, and in\r
-addition, further substrings from the subject may be picked out by parts of the\r
-pattern. Following the usage in Jeffrey Friedl's book, this is called\r
-"capturing" in what follows, and the phrase "capturing subpattern" is used for\r
-a fragment of a pattern that picks out a substring. PCRE supports several other\r
-kinds of parenthesized subpattern that do not cause substrings to be captured.\r
-</P>\r
-<P>\r
-Captured substrings are returned to the caller via a vector of integer offsets\r
-whose address is passed in <I>ovector</I>. The number of elements in the vector\r
-is passed in <I>ovecsize</I>. The first two-thirds of the vector is used to pass\r
-back captured substrings, each substring using a pair of integers. The\r
-remaining third of the vector is used as workspace by <B>pcre_exec()</B> while\r
-matching capturing subpatterns, and is not available for passing back\r
-information. The length passed in <I>ovecsize</I> should always be a multiple of\r
-three. If it is not, it is rounded down.\r
-</P>\r
-<P>\r
-When a match has been successful, information about captured substrings is\r
-returned in pairs of integers, starting at the beginning of <I>ovector</I>, and\r
-continuing up to two-thirds of its length at the most. The first element of a\r
-pair is set to the offset of the first character in a substring, and the second\r
-is set to the offset of the first character after the end of a substring. The\r
-first pair, <I>ovector[0]</I> and <I>ovector[1]</I>, identify the portion of the\r
-subject string matched by the entire pattern. The next pair is used for the\r
-first capturing subpattern, and so on. The value returned by <B>pcre_exec()</B>\r
-is the number of pairs that have been set. If there are no capturing\r
-subpatterns, the return value from a successful match is 1, indicating that\r
-just the first pair of offsets has been set.\r
-</P>\r
-<P>\r
-Some convenience functions are provided for extracting the captured substrings\r
-as separate strings. These are described in the following section.\r
-</P>\r
-<P>\r
-It is possible for an capturing subpattern number <I>n+1</I> to match some\r
-part of the subject when subpattern <I>n</I> has not been used at all. For\r
-example, if the string "abc" is matched against the pattern (a|(z))(bc)\r
-subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset\r
-values corresponding to the unused subpattern are set to -1.\r
-</P>\r
-<P>\r
-If a capturing subpattern is matched repeatedly, it is the last portion of the\r
-string that it matched that gets returned.\r
-</P>\r
-<P>\r
-If the vector is too small to hold all the captured substrings, it is used as\r
-far as possible (up to two-thirds of its length), and the function returns a\r
-value of zero. In particular, if the substring offsets are not of interest,\r
-<B>pcre_exec()</B> may be called with <I>ovector</I> passed as NULL and\r
-<I>ovecsize</I> as zero. However, if the pattern contains back references and\r
-the <I>ovector</I> isn't big enough to remember the related substrings, PCRE has\r
-to get additional memory for use during matching. Thus it is usually advisable\r
-to supply an <I>ovector</I>.\r
-</P>\r
-<P>\r
-Note that <B>pcre_info()</B> can be used to find out how many capturing\r
-subpatterns there are in a compiled pattern. The smallest size for\r
-<I>ovector</I> that will allow for <I>n</I> captured substrings in addition to\r
-the offsets of the substring matched by the whole pattern is (<I>n</I>+1)*3.\r
-</P>\r
-<P>\r
-If <B>pcre_exec()</B> fails, it returns a negative number. The following are\r
-defined in the header file:\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NOMATCH        (-1)\r
-</PRE>\r
-</P>\r
-<P>\r
-The subject string did not match the pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NULL           (-2)\r
-</PRE>\r
-</P>\r
-<P>\r
-Either <I>code</I> or <I>subject</I> was passed as NULL, or <I>ovector</I> was\r
-NULL and <I>ovecsize</I> was not zero.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_BADOPTION      (-3)\r
-</PRE>\r
-</P>\r
-<P>\r
-An unrecognized bit was set in the <I>options</I> argument.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_BADMAGIC       (-4)\r
-</PRE>\r
-</P>\r
-<P>\r
-PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch\r
-the case when it is passed a junk pointer. This is the error it gives when the\r
-magic number isn't present.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_UNKNOWN_NODE   (-5)\r
-</PRE>\r
-</P>\r
-<P>\r
-While running the pattern match, an unknown item was encountered in the\r
-compiled pattern. This error could be caused by a bug in PCRE or by overwriting\r
-of the compiled pattern.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-If a pattern contains back references, but the <I>ovector</I> that is passed to\r
-<B>pcre_exec()</B> is not big enough to remember the referenced substrings, PCRE\r
-gets a block of memory at the start of matching to use for this purpose. If the\r
-call via <B>pcre_malloc()</B> fails, this error is given. The memory is freed at\r
-the end of matching.\r
-</P>\r
-<LI><A NAME="SEC10" HREF="#TOC1">EXTRACTING CAPTURED SUBSTRINGS</A>\r
-<P>\r
-Captured substrings can be accessed directly by using the offsets returned by\r
-<B>pcre_exec()</B> in <I>ovector</I>. For convenience, the functions\r
-<B>pcre_copy_substring()</B>, <B>pcre_get_substring()</B>, and\r
-<B>pcre_get_substring_list()</B> are provided for extracting captured substrings\r
-as new, separate, zero-terminated strings. A substring that contains a binary\r
-zero is correctly extracted and has a further zero added on the end, but the\r
-result does not, of course, function as a C string.\r
-</P>\r
-<P>\r
-The first three arguments are the same for all three functions: <I>subject</I>\r
-is the subject string which has just been successfully matched, <I>ovector</I>\r
-is a pointer to the vector of integer offsets that was passed to\r
-<B>pcre_exec()</B>, and <I>stringcount</I> is the number of substrings that\r
-were captured by the match, including the substring that matched the entire\r
-regular expression. This is the value returned by <B>pcre_exec</B> if it\r
-is greater than zero. If <B>pcre_exec()</B> returned zero, indicating that it\r
-ran out of space in <I>ovector</I>, the value passed as <I>stringcount</I> should\r
-be the size of the vector divided by three.\r
-</P>\r
-<P>\r
-The functions <B>pcre_copy_substring()</B> and <B>pcre_get_substring()</B>\r
-extract a single substring, whose number is given as <I>stringnumber</I>. A\r
-value of zero extracts the substring that matched the entire pattern, while\r
-higher values extract the captured substrings. For <B>pcre_copy_substring()</B>,\r
-the string is placed in <I>buffer</I>, whose length is given by\r
-<I>buffersize</I>, while for <B>pcre_get_substring()</B> a new block of memory is\r
-obtained via <B>pcre_malloc</B>, and its address is returned via\r
-<I>stringptr</I>. The yield of the function is the length of the string, not\r
-including the terminating zero, or one of\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-The buffer was too small for <B>pcre_copy_substring()</B>, or the attempt to get\r
-memory failed for <B>pcre_get_substring()</B>.\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NOSUBSTRING    (-7)\r
-</PRE>\r
-</P>\r
-<P>\r
-There is no substring whose number is <I>stringnumber</I>.\r
-</P>\r
-<P>\r
-The <B>pcre_get_substring_list()</B> function extracts all available substrings\r
-and builds a list of pointers to them. All this is done in a single block of\r
-memory which is obtained via <B>pcre_malloc</B>. The address of the memory block\r
-is returned via <I>listptr</I>, which is also the start of the list of string\r
-pointers. The end of the list is marked by a NULL pointer. The yield of the\r
-function is zero if all went well, or\r
-</P>\r
-<P>\r
-<PRE>\r
-  PCRE_ERROR_NOMEMORY       (-6)\r
-</PRE>\r
-</P>\r
-<P>\r
-if the attempt to get the memory block failed.\r
-</P>\r
-<P>\r
-When any of these functions encounter a substring that is unset, which can\r
-happen when capturing subpattern number <I>n+1</I> matches some part of the\r
-subject, but subpattern <I>n</I> has not been used at all, they return an empty\r
-string. This can be distinguished from a genuine zero-length substring by\r
-inspecting the appropriate offset in <I>ovector</I>, which is negative for unset\r
-substrings.\r
-</P>\r
-<P>\r
-The two convenience functions <B>pcre_free_substring()</B> and\r
-<B>pcre_free_substring_list()</B> can be used to free the memory returned by\r
-a previous call of <B>pcre_get_substring()</B> or\r
-<B>pcre_get_substring_list()</B>, respectively. They do nothing more than call\r
-the function pointed to by <B>pcre_free</B>, which of course could be called\r
-directly from a C program. However, PCRE is used in some situations where it is\r
-linked via a special interface to another programming language which cannot use\r
-<B>pcre_free</B> directly; it is for these cases that the functions are\r
-provided.\r
-</P>\r
-<LI><A NAME="SEC11" HREF="#TOC1">LIMITATIONS</A>\r
-<P>\r
-There are some size limitations in PCRE but it is hoped that they will never in\r
-practice be relevant.\r
-The maximum length of a compiled pattern is 65539 (sic) bytes.\r
-All values in repeating quantifiers must be less than 65536.\r
-The maximum number of capturing subpatterns is 99.\r
-The maximum number of all parenthesized subpatterns, including capturing\r
-subpatterns, assertions, and other types of subpattern, is 200.\r
-</P>\r
-<P>\r
-The maximum length of a subject string is the largest positive number that an\r
-integer variable can hold. However, PCRE uses recursion to handle subpatterns\r
-and indefinite repetition. This means that the available stack space may limit\r
-the size of a subject string that can be processed by certain patterns.\r
-</P>\r
-<LI><A NAME="SEC12" HREF="#TOC1">DIFFERENCES FROM PERL</A>\r
-<P>\r
-The differences described here are with respect to Perl 5.005.\r
-</P>\r
-<P>\r
-1. By default, a whitespace character is any character that the C library\r
-function <B>isspace()</B> recognizes, though it is possible to compile PCRE with\r
-alternative character type tables. Normally <B>isspace()</B> matches space,\r
-formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5\r
-no longer includes vertical tab in its set of whitespace characters. The \v\r
-escape that was in the Perl documentation for a long time was never in fact\r
-recognized. However, the character itself was treated as whitespace at least\r
-up to 5.002. In 5.004 and 5.005 it does not match \s.\r
-</P>\r
-<P>\r
-2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits\r
-them, but they do not mean what you might think. For example, (?!a){3} does\r
-not assert that the next three characters are not "a". It just asserts that the\r
-next character is not "a" three times.\r
-</P>\r
-<P>\r
-3. Capturing subpatterns that occur inside negative lookahead assertions are\r
-counted, but their entries in the offsets vector are never set. Perl sets its\r
-numerical variables from any such patterns that are matched before the\r
-assertion fails to match something (thereby succeeding), but only if the\r
-negative lookahead assertion contains just one branch.\r
-</P>\r
-<P>\r
-4. Though binary zero characters are supported in the subject string, they are\r
-not allowed in a pattern string because it is passed as a normal C string,\r
-terminated by zero. The escape sequence "\0" can be used in the pattern to\r
-represent a binary zero.\r
-</P>\r
-<P>\r
-5. The following Perl escape sequences are not supported: \l, \u, \L, \U,\r
-\E, \Q. In fact these are implemented by Perl's general string-handling and\r
-are not part of its pattern matching engine.\r
-</P>\r
-<P>\r
-6. The Perl \G assertion is not supported as it is not relevant to single\r
-pattern matches.\r
-</P>\r
-<P>\r
-7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code})\r
-constructions. However, there is some experimental support for recursive\r
-patterns using the non-Perl item (?R).\r
-</P>\r
-<P>\r
-8. There are at the time of writing some oddities in Perl 5.005_02 concerned\r
-with the settings of captured strings when part of a pattern is repeated. For\r
-example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value\r
-"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if\r
-the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set.\r
-</P>\r
-<P>\r
-In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the\r
-future Perl changes to a consistent state that is different, PCRE may change to\r
-follow.\r
-</P>\r
-<P>\r
-9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern\r
-/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not.\r
-However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset.\r
-</P>\r
-<P>\r
-10. PCRE provides some extensions to the Perl regular expression facilities:\r
-</P>\r
-<P>\r
-(a) Although lookbehind assertions must match fixed length strings, each\r
-alternative branch of a lookbehind assertion can match a different length of\r
-string. Perl 5.005 requires them all to have the same length.\r
-</P>\r
-<P>\r
-(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta-\r
-character matches only at the very end of the string.\r
-</P>\r
-<P>\r
-(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special\r
-meaning is faulted.\r
-</P>\r
-<P>\r
-(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is\r
-inverted, that is, by default they are not greedy, but if followed by a\r
-question mark they are.\r
-</P>\r
-<P>\r
-(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start\r
-of the subject.\r
-</P>\r
-<P>\r
-(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for\r
-<B>pcre_exec()</B> have no Perl equivalents.\r
-</P>\r
-<P>\r
-(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do\r
-this using the (?p{code}) construct, which PCRE cannot of course support.)\r
-</P>\r
-<LI><A NAME="SEC13" HREF="#TOC1">REGULAR EXPRESSION DETAILS</A>\r
-<P>\r
-The syntax and semantics of the regular expressions supported by PCRE are\r
-described below. Regular expressions are also described in the Perl\r
-documentation and in a number of other books, some of which have copious\r
-examples. Jeffrey Friedl's "Mastering Regular Expressions", published by\r
-O'Reilly (ISBN 1-56592-257), covers them in great detail.\r
-</P>\r
-<P>\r
-The description here is intended as reference documentation. The basic\r
-operation of PCRE is on strings of bytes. However, there is the beginnings of\r
-some support for UTF-8 character strings. To use this support you must\r
-configure PCRE to include it, and then call <B>pcre_compile()</B> with the\r
-PCRE_UTF8 option. How this affects the pattern matching is described in the\r
-final section of this document.\r
-</P>\r
-<P>\r
-A regular expression is a pattern that is matched against a subject string from\r
-left to right. Most characters stand for themselves in a pattern, and match the\r
-corresponding characters in the subject. As a trivial example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  The quick brown fox\r
-</PRE>\r
-</P>\r
-<P>\r
-matches a portion of a subject string that is identical to itself. The power of\r
-regular expressions comes from the ability to include alternatives and\r
-repetitions in the pattern. These are encoded in the pattern by the use of\r
-<I>meta-characters</I>, which do not stand for themselves but instead are\r
-interpreted in some special way.\r
-</P>\r
-<P>\r
-There are two different sets of meta-characters: those that are recognized\r
-anywhere in the pattern except within square brackets, and those that are\r
-recognized in square brackets. Outside square brackets, the meta-characters are\r
-as follows:\r
-</P>\r
-<P>\r
-<PRE>\r
-  \      general escape character with several uses\r
-  ^      assert start of subject (or line, in multiline mode)\r
-  $      assert end of subject (or line, in multiline mode)\r
-  .      match any character except newline (by default)\r
-  [      start character class definition\r
-  |      start of alternative branch\r
-  (      start subpattern\r
-  )      end subpattern\r
-  ?      extends the meaning of (\r
-         also 0 or 1 quantifier\r
-         also quantifier minimizer\r
-  *      0 or more quantifier\r
-  +      1 or more quantifier\r
-  {      start min/max quantifier\r
-</PRE>\r
-</P>\r
-<P>\r
-Part of a pattern that is in square brackets is called a "character class". In\r
-a character class the only meta-characters are:\r
-</P>\r
-<P>\r
-<PRE>\r
-  \      general escape character\r
-  ^      negate the class, but only if the first character\r
-  -      indicates character range\r
-  ]      terminates the character class\r
-</PRE>\r
-</P>\r
-<P>\r
-The following sections describe the use of each of the meta-characters.\r
-</P>\r
-<LI><A NAME="SEC14" HREF="#TOC1">BACKSLASH</A>\r
-<P>\r
-The backslash character has several uses. Firstly, if it is followed by a\r
-non-alphameric character, it takes away any special meaning that character may\r
-have. This use of backslash as an escape character applies both inside and\r
-outside character classes.\r
-</P>\r
-<P>\r
-For example, if you want to match a "*" character, you write "\*" in the\r
-pattern. This applies whether or not the following character would otherwise be\r
-interpreted as a meta-character, so it is always safe to precede a\r
-non-alphameric with "\" to specify that it stands for itself. In particular,\r
-if you want to match a backslash, you write "\\".\r
-</P>\r
-<P>\r
-If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the\r
-pattern (other than in a character class) and characters between a "#" outside\r
-a character class and the next newline character are ignored. An escaping\r
-backslash can be used to include a whitespace or "#" character as part of the\r
-pattern.\r
-</P>\r
-<P>\r
-A second use of backslash provides a way of encoding non-printing characters\r
-in patterns in a visible manner. There is no restriction on the appearance of\r
-non-printing characters, apart from the binary zero that terminates a pattern,\r
-but when a pattern is being prepared by text editing, it is usually easier to\r
-use one of the following escape sequences than the binary character it\r
-represents:\r
-</P>\r
-<P>\r
-<PRE>\r
-  \a     alarm, that is, the BEL character (hex 07)\r
-  \cx    "control-x", where x is any character\r
-  \e     escape (hex 1B)\r
-  \f     formfeed (hex 0C)\r
-  \n     newline (hex 0A)\r
-  \r     carriage return (hex 0D)\r
-  \t     tab (hex 09)\r
-  \xhh   character with hex code hh\r
-  \ddd   character with octal code ddd, or backreference\r
-</PRE>\r
-</P>\r
-<P>\r
-The precise effect of "\cx" is as follows: if "x" is a lower case letter, it\r
-is converted to upper case. Then bit 6 of the character (hex 40) is inverted.\r
-Thus "\cz" becomes hex 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex\r
-7B.\r
-</P>\r
-<P>\r
-After "\x", up to two hexadecimal digits are read (letters can be in upper or\r
-lower case).\r
-</P>\r
-<P>\r
-After "\0" up to two further octal digits are read. In both cases, if there\r
-are fewer than two digits, just those that are present are used. Thus the\r
-sequence "\0\x\07" specifies two binary zeros followed by a BEL character.\r
-Make sure you supply two digits after the initial zero if the character that\r
-follows is itself an octal digit.\r
-</P>\r
-<P>\r
-The handling of a backslash followed by a digit other than 0 is complicated.\r
-Outside a character class, PCRE reads it and any following digits as a decimal\r
-number. If the number is less than 10, or if there have been at least that many\r
-previous capturing left parentheses in the expression, the entire sequence is\r
-taken as a <I>back reference</I>. A description of how this works is given\r
-later, following the discussion of parenthesized subpatterns.\r
-</P>\r
-<P>\r
-Inside a character class, or if the decimal number is greater than 9 and there\r
-have not been that many capturing subpatterns, PCRE re-reads up to three octal\r
-digits following the backslash, and generates a single byte from the least\r
-significant 8 bits of the value. Any subsequent digits stand for themselves.\r
-For example:\r
-</P>\r
-<P>\r
-<PRE>\r
-  \040   is another way of writing a space\r
-  \40    is the same, provided there are fewer than 40\r
-            previous capturing subpatterns\r
-  \7     is always a back reference\r
-  \11    might be a back reference, or another way of\r
-            writing a tab\r
-  \011   is always a tab\r
-  \0113  is a tab followed by the character "3"\r
-  \113   is the character with octal code 113 (since there\r
-            can be no more than 99 back references)\r
-  \377   is a byte consisting entirely of 1 bits\r
-  \81    is either a back reference, or a binary zero\r
-            followed by the two characters "8" and "1"\r
-</PRE>\r
-</P>\r
-<P>\r
-Note that octal values of 100 or greater must not be introduced by a leading\r
-zero, because no more than three octal digits are ever read.\r
-</P>\r
-<P>\r
-All the sequences that define a single byte value can be used both inside and\r
-outside character classes. In addition, inside a character class, the sequence\r
-"\b" is interpreted as the backspace character (hex 08). Outside a character\r
-class it has a different meaning (see below).\r
-</P>\r
-<P>\r
-The third use of backslash is for specifying generic character types:\r
-</P>\r
-<P>\r
-<PRE>\r
-  \d     any decimal digit\r
-  \D     any character that is not a decimal digit\r
-  \s     any whitespace character\r
-  \S     any character that is not a whitespace character\r
-  \w     any "word" character\r
-  \W     any "non-word" character\r
-</PRE>\r
-</P>\r
-<P>\r
-Each pair of escape sequences partitions the complete set of characters into\r
-two disjoint sets. Any given character matches one, and only one, of each pair.\r
-</P>\r
-<P>\r
-A "word" character is any letter or digit or the underscore character, that is,\r
-any character which can be part of a Perl "word". The definition of letters and\r
-digits is controlled by PCRE's character tables, and may vary if locale-\r
-specific matching is taking place (see "Locale support" above). For example, in\r
-the "fr" (French) locale, some character codes greater than 128 are used for\r
-accented letters, and these are matched by \w.\r
-</P>\r
-<P>\r
-These character type sequences can appear both inside and outside character\r
-classes. They each match one character of the appropriate type. If the current\r
-matching point is at the end of the subject string, all of them fail, since\r
-there is no character to match.\r
-</P>\r
-<P>\r
-The fourth use of backslash is for certain simple assertions. An assertion\r
-specifies a condition that has to be met at a particular point in a match,\r
-without consuming any characters from the subject string. The use of\r
-subpatterns for more complicated assertions is described below. The backslashed\r
-assertions are\r
-</P>\r
-<P>\r
-<PRE>\r
-  \b     word boundary\r
-  \B     not a word boundary\r
-  \A     start of subject (independent of multiline mode)\r
-  \Z     end of subject or newline at end (independent of multiline mode)\r
-  \z     end of subject (independent of multiline mode)\r
-</PRE>\r
-</P>\r
-<P>\r
-These assertions may not appear in character classes (but note that "\b" has a\r
-different meaning, namely the backspace character, inside a character class).\r
-</P>\r
-<P>\r
-A word boundary is a position in the subject string where the current character\r
-and the previous character do not both match \w or \W (i.e. one matches\r
-\w and the other matches \W), or the start or end of the string if the\r
-first or last character matches \w, respectively.\r
-</P>\r
-<P>\r
-The \A, \Z, and \z assertions differ from the traditional circumflex and\r
-dollar (described below) in that they only ever match at the very start and end\r
-of the subject string, whatever options are set. They are not affected by the\r
-PCRE_NOTBOL or PCRE_NOTEOL options. If the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero, \A can never match. The difference between \Z\r
-and \z is that \Z matches before a newline that is the last character of the\r
-string as well as at the end of the string, whereas \z matches only at the\r
-end.\r
-</P>\r
-<LI><A NAME="SEC15" HREF="#TOC1">CIRCUMFLEX AND DOLLAR</A>\r
-<P>\r
-Outside a character class, in the default matching mode, the circumflex\r
-character is an assertion which is true only if the current matching point is\r
-at the start of the subject string. If the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero, circumflex can never match. Inside a character\r
-class, circumflex has an entirely different meaning (see below).\r
-</P>\r
-<P>\r
-Circumflex need not be the first character of the pattern if a number of\r
-alternatives are involved, but it should be the first thing in each alternative\r
-in which it appears if the pattern is ever to match that branch. If all\r
-possible alternatives start with a circumflex, that is, if the pattern is\r
-constrained to match only at the start of the subject, it is said to be an\r
-"anchored" pattern. (There are also other constructs that can cause a pattern\r
-to be anchored.)\r
-</P>\r
-<P>\r
-A dollar character is an assertion which is true only if the current matching\r
-point is at the end of the subject string, or immediately before a newline\r
-character that is the last character in the string (by default). Dollar need\r
-not be the last character of the pattern if a number of alternatives are\r
-involved, but it should be the last item in any branch in which it appears.\r
-Dollar has no special meaning in a character class.\r
-</P>\r
-<P>\r
-The meaning of dollar can be changed so that it matches only at the very end of\r
-the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching\r
-time. This does not affect the \Z assertion.\r
-</P>\r
-<P>\r
-The meanings of the circumflex and dollar characters are changed if the\r
-PCRE_MULTILINE option is set. When this is the case, they match immediately\r
-after and immediately before an internal "\n" character, respectively, in\r
-addition to matching at the start and end of the subject string. For example,\r
-the pattern /^abc$/ matches the subject string "def\nabc" in multiline mode,\r
-but not otherwise. Consequently, patterns that are anchored in single line mode\r
-because all branches start with "^" are not anchored in multiline mode, and a\r
-match for circumflex is possible when the <I>startoffset</I> argument of\r
-<B>pcre_exec()</B> is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if\r
-PCRE_MULTILINE is set.\r
-</P>\r
-<P>\r
-Note that the sequences \A, \Z, and \z can be used to match the start and\r
-end of the subject in both modes, and if all branches of a pattern start with\r
-\A is it always anchored, whether PCRE_MULTILINE is set or not.\r
-</P>\r
-<LI><A NAME="SEC16" HREF="#TOC1">FULL STOP (PERIOD, DOT)</A>\r
-<P>\r
-Outside a character class, a dot in the pattern matches any one character in\r
-the subject, including a non-printing character, but not (by default) newline.\r
-If the PCRE_DOTALL option is set, dots match newlines as well. The handling of\r
-dot is entirely independent of the handling of circumflex and dollar, the only\r
-relationship being that they both involve newline characters. Dot has no\r
-special meaning in a character class.\r
-</P>\r
-<LI><A NAME="SEC17" HREF="#TOC1">SQUARE BRACKETS</A>\r
-<P>\r
-An opening square bracket introduces a character class, terminated by a closing\r
-square bracket. A closing square bracket on its own is not special. If a\r
-closing square bracket is required as a member of the class, it should be the\r
-first data character in the class (after an initial circumflex, if present) or\r
-escaped with a backslash.\r
-</P>\r
-<P>\r
-A character class matches a single character in the subject; the character must\r
-be in the set of characters defined by the class, unless the first character in\r
-the class is a circumflex, in which case the subject character must not be in\r
-the set defined by the class. If a circumflex is actually required as a member\r
-of the class, ensure it is not the first character, or escape it with a\r
-backslash.\r
-</P>\r
-<P>\r
-For example, the character class [aeiou] matches any lower case vowel, while\r
-[^aeiou] matches any character that is not a lower case vowel. Note that a\r
-circumflex is just a convenient notation for specifying the characters which\r
-are in the class by enumerating those that are not. It is not an assertion: it\r
-still consumes a character from the subject string, and fails if the current\r
-pointer is at the end of the string.\r
-</P>\r
-<P>\r
-When caseless matching is set, any letters in a class represent both their\r
-upper case and lower case versions, so for example, a caseless [aeiou] matches\r
-"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a\r
-caseful version would.\r
-</P>\r
-<P>\r
-The newline character is never treated in any special way in character classes,\r
-whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class\r
-such as [^a] will always match a newline.\r
-</P>\r
-<P>\r
-The minus (hyphen) character can be used to specify a range of characters in a\r
-character class. For example, [d-m] matches any letter between d and m,\r
-inclusive. If a minus character is required in a class, it must be escaped with\r
-a backslash or appear in a position where it cannot be interpreted as\r
-indicating a range, typically as the first or last character in the class.\r
-</P>\r
-<P>\r
-It is not possible to have the literal character "]" as the end character of a\r
-range. A pattern such as [W-]46] is interpreted as a class of two characters\r
-("W" and "-") followed by a literal string "46]", so it would match "W46]" or\r
-"-46]". However, if the "]" is escaped with a backslash it is interpreted as\r
-the end of range, so [W-\]46] is interpreted as a single class containing a\r
-range followed by two separate characters. The octal or hexadecimal\r
-representation of "]" can also be used to end a range.\r
-</P>\r
-<P>\r
-Ranges operate in ASCII collating sequence. They can also be used for\r
-characters specified numerically, for example [\000-\037]. If a range that\r
-includes letters is used when caseless matching is set, it matches the letters\r
-in either case. For example, [W-c] is equivalent to [][\^_`wxyzabc], matched\r
-caselessly, and if character tables for the "fr" locale are in use,\r
-[\xc8-\xcb] matches accented E characters in both cases.\r
-</P>\r
-<P>\r
-The character types \d, \D, \s, \S, \w, and \W may also appear in a\r
-character class, and add the characters that they match to the class. For\r
-example, [\dABCDEF] matches any hexadecimal digit. A circumflex can\r
-conveniently be used with the upper case character types to specify a more\r
-restricted set of characters than the matching lower case type. For example,\r
-the class [^\W_] matches any letter or digit, but not underscore.\r
-</P>\r
-<P>\r
-All non-alphameric characters other than \, -, ^ (at the start) and the\r
-terminating ] are non-special in character classes, but it does no harm if they\r
-are escaped.\r
-</P>\r
-<LI><A NAME="SEC18" HREF="#TOC1">POSIX CHARACTER CLASSES</A>\r
-<P>\r
-Perl 5.6 (not yet released at the time of writing) is going to support the\r
-POSIX notation for character classes, which uses names enclosed by [: and :]\r
-within the enclosing square brackets. PCRE supports this notation. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  [01[:alpha:]%]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "0", "1", any alphabetic character, or "%". The supported class names\r
-are\r
-</P>\r
-<P>\r
-<PRE>\r
-  alnum    letters and digits\r
-  alpha    letters\r
-  ascii    character codes 0 - 127\r
-  cntrl    control characters\r
-  digit    decimal digits (same as \d)\r
-  graph    printing characters, excluding space\r
-  lower    lower case letters\r
-  print    printing characters, including space\r
-  punct    printing characters, excluding letters and digits\r
-  space    white space (same as \s)\r
-  upper    upper case letters\r
-  word     "word" characters (same as \w)\r
-  xdigit   hexadecimal digits\r
-</PRE>\r
-</P>\r
-<P>\r
-The names "ascii" and "word" are Perl extensions. Another Perl extension is\r
-negation, which is indicated by a ^ character after the colon. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  [12[:^digit:]]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "1", "2", or any non-digit. PCRE (and Perl) also recogize the POSIX\r
-syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not\r
-supported, and an error is given if they are encountered.\r
-</P>\r
-<LI><A NAME="SEC19" HREF="#TOC1">VERTICAL BAR</A>\r
-<P>\r
-Vertical bar characters are used to separate alternative patterns. For example,\r
-the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  gilbert|sullivan\r
-</PRE>\r
-</P>\r
-<P>\r
-matches either "gilbert" or "sullivan". Any number of alternatives may appear,\r
-and an empty alternative is permitted (matching the empty string).\r
-The matching process tries each alternative in turn, from left to right,\r
-and the first one that succeeds is used. If the alternatives are within a\r
-subpattern (defined below), "succeeds" means matching the rest of the main\r
-pattern as well as the alternative in the subpattern.\r
-</P>\r
-<LI><A NAME="SEC20" HREF="#TOC1">INTERNAL OPTION SETTING</A>\r
-<P>\r
-The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED\r
-can be changed from within the pattern by a sequence of Perl option letters\r
-enclosed between "(?" and ")". The option letters are\r
-</P>\r
-<P>\r
-<PRE>\r
-  i  for PCRE_CASELESS\r
-  m  for PCRE_MULTILINE\r
-  s  for PCRE_DOTALL\r
-  x  for PCRE_EXTENDED\r
-</PRE>\r
-</P>\r
-<P>\r
-For example, (?im) sets caseless, multiline matching. It is also possible to\r
-unset these options by preceding the letter with a hyphen, and a combined\r
-setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and\r
-PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also\r
-permitted. If a letter appears both before and after the hyphen, the option is\r
-unset.\r
-</P>\r
-<P>\r
-The scope of these option changes depends on where in the pattern the setting\r
-occurs. For settings that are outside any subpattern (defined below), the\r
-effect is the same as if the options were set or unset at the start of\r
-matching. The following patterns all behave in exactly the same way:\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?i)abc\r
-  a(?i)bc\r
-  ab(?i)c\r
-  abc(?i)\r
-</PRE>\r
-</P>\r
-<P>\r
-which in turn is the same as compiling the pattern abc with PCRE_CASELESS set.\r
-In other words, such "top level" settings apply to the whole pattern (unless\r
-there are other changes inside subpatterns). If there is more than one setting\r
-of the same option at top level, the rightmost setting is used.\r
-</P>\r
-<P>\r
-If an option change occurs inside a subpattern, the effect is different. This\r
-is a change of behaviour in Perl 5.005. An option change inside a subpattern\r
-affects only that part of the subpattern that follows it, so\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a(?i)b)c\r
-</PRE>\r
-</P>\r
-<P>\r
-matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).\r
-By this means, options can be made to have different settings in different\r
-parts of the pattern. Any changes made in one alternative do carry on\r
-into subsequent branches within the same subpattern. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a(?i)b|c)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "ab", "aB", "c", and "C", even though when matching "C" the first\r
-branch is abandoned before the option setting. This is because the effects of\r
-option settings happen at compile time. There would be some very weird\r
-behaviour otherwise.\r
-</P>\r
-<P>\r
-The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the\r
-same way as the Perl-compatible options by using the characters U and X\r
-respectively. The (?X) flag setting is special in that it must always occur\r
-earlier in the pattern than any of the additional features it turns on, even\r
-when it is at top level. It is best put at the start.\r
-</P>\r
-<LI><A NAME="SEC21" HREF="#TOC1">SUBPATTERNS</A>\r
-<P>\r
-Subpatterns are delimited by parentheses (round brackets), which can be nested.\r
-Marking part of a pattern as a subpattern does two things:\r
-</P>\r
-<P>\r
-1. It localizes a set of alternatives. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  cat(aract|erpillar|)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches one of the words "cat", "cataract", or "caterpillar". Without the\r
-parentheses, it would match "cataract", "erpillar" or the empty string.\r
-</P>\r
-<P>\r
-2. It sets up the subpattern as a capturing subpattern (as defined above).\r
-When the whole pattern matches, that portion of the subject string that matched\r
-the subpattern is passed back to the caller via the <I>ovector</I> argument of\r
-<B>pcre_exec()</B>. Opening parentheses are counted from left to right (starting\r
-from 1) to obtain the numbers of the capturing subpatterns.\r
-</P>\r
-<P>\r
-For example, if the string "the red king" is matched against the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  the ((red|white) (king|queen))\r
-</PRE>\r
-</P>\r
-<P>\r
-the captured substrings are "red king", "red", and "king", and are numbered 1,\r
-2, and 3.\r
-</P>\r
-<P>\r
-The fact that plain parentheses fulfil two functions is not always helpful.\r
-There are often times when a grouping subpattern is required without a\r
-capturing requirement. If an opening parenthesis is followed by "?:", the\r
-subpattern does not do any capturing, and is not counted when computing the\r
-number of any subsequent capturing subpatterns. For example, if the string "the\r
-white queen" is matched against the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  the ((?:red|white) (king|queen))\r
-</PRE>\r
-</P>\r
-<P>\r
-the captured substrings are "white queen" and "queen", and are numbered 1 and\r
-2. The maximum number of captured substrings is 99, and the maximum number of\r
-all subpatterns, both capturing and non-capturing, is 200.\r
-</P>\r
-<P>\r
-As a convenient shorthand, if any option settings are required at the start of\r
-a non-capturing subpattern, the option letters may appear between the "?" and\r
-the ":". Thus the two patterns\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?i:saturday|sunday)\r
-  (?:(?i)saturday|sunday)\r
-</PRE>\r
-</P>\r
-<P>\r
-match exactly the same set of strings. Because alternative branches are tried\r
-from left to right, and options are not reset until the end of the subpattern\r
-is reached, an option setting in one branch does affect subsequent branches, so\r
-the above patterns match "SUNDAY" as well as "Saturday".\r
-</P>\r
-<LI><A NAME="SEC22" HREF="#TOC1">REPETITION</A>\r
-<P>\r
-Repetition is specified by quantifiers, which can follow any of the following\r
-items:\r
-</P>\r
-<P>\r
-<PRE>\r
-  a single character, possibly escaped\r
-  the . metacharacter\r
-  a character class\r
-  a back reference (see next section)\r
-  a parenthesized subpattern (unless it is an assertion - see below)\r
-</PRE>\r
-</P>\r
-<P>\r
-The general repetition quantifier specifies a minimum and maximum number of\r
-permitted matches, by giving the two numbers in curly brackets (braces),\r
-separated by a comma. The numbers must be less than 65536, and the first must\r
-be less than or equal to the second. For example:\r
-</P>\r
-<P>\r
-<PRE>\r
-  z{2,4}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special\r
-character. If the second number is omitted, but the comma is present, there is\r
-no upper limit; if the second number and the comma are both omitted, the\r
-quantifier specifies an exact number of required matches. Thus\r
-</P>\r
-<P>\r
-<PRE>\r
-  [aeiou]{3,}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches at least 3 successive vowels, but may match many more, while\r
-</P>\r
-<P>\r
-<PRE>\r
-  \d{8}\r
-</PRE>\r
-</P>\r
-<P>\r
-matches exactly 8 digits. An opening curly bracket that appears in a position\r
-where a quantifier is not allowed, or one that does not match the syntax of a\r
-quantifier, is taken as a literal character. For example, {,6} is not a\r
-quantifier, but a literal string of four characters.\r
-</P>\r
-<P>\r
-The quantifier {0} is permitted, causing the expression to behave as if the\r
-previous item and the quantifier were not present.\r
-</P>\r
-<P>\r
-For convenience (and historical compatibility) the three most common\r
-quantifiers have single-character abbreviations:\r
-</P>\r
-<P>\r
-<PRE>\r
-  *    is equivalent to {0,}\r
-  +    is equivalent to {1,}\r
-  ?    is equivalent to {0,1}\r
-</PRE>\r
-</P>\r
-<P>\r
-It is possible to construct infinite loops by following a subpattern that can\r
-match no characters with a quantifier that has no upper limit, for example:\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a?)*\r
-</PRE>\r
-</P>\r
-<P>\r
-Earlier versions of Perl and PCRE used to give an error at compile time for\r
-such patterns. However, because there are cases where this can be useful, such\r
-patterns are now accepted, but if any repetition of the subpattern does in fact\r
-match no characters, the loop is forcibly broken.\r
-</P>\r
-<P>\r
-By default, the quantifiers are "greedy", that is, they match as much as\r
-possible (up to the maximum number of permitted times), without causing the\r
-rest of the pattern to fail. The classic example of where this gives problems\r
-is in trying to match comments in C programs. These appear between the\r
-sequences /* and */ and within the sequence, individual * and / characters may\r
-appear. An attempt to match C comments by applying the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  /\*.*\*/\r
-</PRE>\r
-</P>\r
-<P>\r
-to the string\r
-</P>\r
-<P>\r
-<PRE>\r
-  /* first command */  not comment  /* second comment */\r
-</PRE>\r
-</P>\r
-<P>\r
-fails, because it matches the entire string owing to the greediness of the .*\r
-item.\r
-</P>\r
-<P>\r
-However, if a quantifier is followed by a question mark, it ceases to be\r
-greedy, and instead matches the minimum number of times possible, so the\r
-pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  /\*.*?\*/\r
-</PRE>\r
-</P>\r
-<P>\r
-does the right thing with the C comments. The meaning of the various\r
-quantifiers is not otherwise changed, just the preferred number of matches.\r
-Do not confuse this use of question mark with its use as a quantifier in its\r
-own right. Because it has two uses, it can sometimes appear doubled, as in\r
-</P>\r
-<P>\r
-<PRE>\r
-  \d??\d\r
-</PRE>\r
-</P>\r
-<P>\r
-which matches one digit by preference, but can match two if that is the only\r
-way the rest of the pattern matches.\r
-</P>\r
-<P>\r
-If the PCRE_UNGREEDY option is set (an option which is not available in Perl),\r
-the quantifiers are not greedy by default, but individual ones can be made\r
-greedy by following them with a question mark. In other words, it inverts the\r
-default behaviour.\r
-</P>\r
-<P>\r
-When a parenthesized subpattern is quantified with a minimum repeat count that\r
-is greater than 1 or with a limited maximum, more store is required for the\r
-compiled pattern, in proportion to the size of the minimum or maximum.\r
-</P>\r
-<P>\r
-If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent\r
-to Perl's /s) is set, thus allowing the . to match newlines, the pattern is\r
-implicitly anchored, because whatever follows will be tried against every\r
-character position in the subject string, so there is no point in retrying the\r
-overall match at any position after the first. PCRE treats such a pattern as\r
-though it were preceded by \A. In cases where it is known that the subject\r
-string contains no newlines, it is worth setting PCRE_DOTALL when the pattern\r
-begins with .* in order to obtain this optimization, or alternatively using ^\r
-to indicate anchoring explicitly.\r
-</P>\r
-<P>\r
-When a capturing subpattern is repeated, the value captured is the substring\r
-that matched the final iteration. For example, after\r
-</P>\r
-<P>\r
-<PRE>\r
-  (tweedle[dume]{3}\s*)+\r
-</PRE>\r
-</P>\r
-<P>\r
-has matched "tweedledum tweedledee" the value of the captured substring is\r
-"tweedledee". However, if there are nested capturing subpatterns, the\r
-corresponding captured values may have been set in previous iterations. For\r
-example, after\r
-</P>\r
-<P>\r
-<PRE>\r
-  /(a|(b))+/\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "aba" the value of the second captured substring is "b".\r
-</P>\r
-<LI><A NAME="SEC23" HREF="#TOC1">BACK REFERENCES</A>\r
-<P>\r
-Outside a character class, a backslash followed by a digit greater than 0 (and\r
-possibly further digits) is a back reference to a capturing subpattern earlier\r
-(i.e. to its left) in the pattern, provided there have been that many previous\r
-capturing left parentheses.\r
-</P>\r
-<P>\r
-However, if the decimal number following the backslash is less than 10, it is\r
-always taken as a back reference, and causes an error only if there are not\r
-that many capturing left parentheses in the entire pattern. In other words, the\r
-parentheses that are referenced need not be to the left of the reference for\r
-numbers less than 10. See the section entitled "Backslash" above for further\r
-details of the handling of digits following a backslash.\r
-</P>\r
-<P>\r
-A back reference matches whatever actually matched the capturing subpattern in\r
-the current subject string, rather than anything matching the subpattern\r
-itself. So the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (sens|respons)e and \1ibility\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "sense and sensibility" and "response and responsibility", but not\r
-"sense and responsibility". If caseful matching is in force at the time of the\r
-back reference, the case of letters is relevant. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  ((?i)rah)\s+\1\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original\r
-capturing subpattern is matched caselessly.\r
-</P>\r
-<P>\r
-There may be more than one back reference to the same subpattern. If a\r
-subpattern has not actually been used in a particular match, any back\r
-references to it always fail. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a|(bc))\2\r
-</PRE>\r
-</P>\r
-<P>\r
-always fails if it starts to match "a" rather than "bc". Because there may be\r
-up to 99 back references, all digits following the backslash are taken\r
-as part of a potential back reference number. If the pattern continues with a\r
-digit character, some delimiter must be used to terminate the back reference.\r
-If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty\r
-comment can be used.\r
-</P>\r
-<P>\r
-A back reference that occurs inside the parentheses to which it refers fails\r
-when the subpattern is first used, so, for example, (a\1) never matches.\r
-However, such references can be useful inside repeated subpatterns. For\r
-example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a|b\1)+\r
-</PRE>\r
-</P>\r
-<P>\r
-matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of\r
-the subpattern, the back reference matches the character string corresponding\r
-to the previous iteration. In order for this to work, the pattern must be such\r
-that the first iteration does not need to match the back reference. This can be\r
-done using alternation, as in the example above, or by a quantifier with a\r
-minimum of zero.\r
-</P>\r
-<LI><A NAME="SEC24" HREF="#TOC1">ASSERTIONS</A>\r
-<P>\r
-An assertion is a test on the characters following or preceding the current\r
-matching point that does not actually consume any characters. The simple\r
-assertions coded as \b, \B, \A, \Z, \z, ^ and $ are described above. More\r
-complicated assertions are coded as subpatterns. There are two kinds: those\r
-that look ahead of the current position in the subject string, and those that\r
-look behind it.\r
-</P>\r
-<P>\r
-An assertion subpattern is matched in the normal way, except that it does not\r
-cause the current matching position to be changed. Lookahead assertions start\r
-with (?= for positive assertions and (?! for negative assertions. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  \w+(?=;)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches a word followed by a semicolon, but does not include the semicolon in\r
-the match, and\r
-</P>\r
-<P>\r
-<PRE>\r
-  foo(?!bar)\r
-</PRE>\r
-</P>\r
-<P>\r
-matches any occurrence of "foo" that is not followed by "bar". Note that the\r
-apparently similar pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?!foo)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-does not find an occurrence of "bar" that is preceded by something other than\r
-"foo"; it finds any occurrence of "bar" whatsoever, because the assertion\r
-(?!foo) is always true when the next three characters are "bar". A\r
-lookbehind assertion is needed to achieve this effect.\r
-</P>\r
-<P>\r
-Lookbehind assertions start with (?&#60;= for positive assertions and (?&#60;! for\r
-negative assertions. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;!foo)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-does find an occurrence of "bar" that is not preceded by "foo". The contents of\r
-a lookbehind assertion are restricted such that all the strings it matches must\r
-have a fixed length. However, if there are several alternatives, they do not\r
-all have to have the same fixed length. Thus\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=bullock|donkey)\r
-</PRE>\r
-</P>\r
-<P>\r
-is permitted, but\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;!dogs?|cats?)\r
-</PRE>\r
-</P>\r
-<P>\r
-causes an error at compile time. Branches that match different length strings\r
-are permitted only at the top level of a lookbehind assertion. This is an\r
-extension compared with Perl 5.005, which requires all branches to match the\r
-same length of string. An assertion such as\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=ab(c|de))\r
-</PRE>\r
-</P>\r
-<P>\r
-is not permitted, because its single top-level branch can match two different\r
-lengths, but it is acceptable if rewritten to use two top-level branches:\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=abc|abde)\r
-</PRE>\r
-</P>\r
-<P>\r
-The implementation of lookbehind assertions is, for each alternative, to\r
-temporarily move the current position back by the fixed width and then try to\r
-match. If there are insufficient characters before the current position, the\r
-match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns\r
-can be particularly useful for matching at the ends of strings; an example is\r
-given at the end of the section on once-only subpatterns.\r
-</P>\r
-<P>\r
-Several assertions (of any sort) may occur in succession. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=\d{3})(?&#60;!999)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-matches "foo" preceded by three digits that are not "999". Notice that each of\r
-the assertions is applied independently at the same point in the subject\r
-string. First there is a check that the previous three characters are all\r
-digits, and then there is a check that the same three characters are not "999".\r
-This pattern does <I>not</I> match "foo" preceded by six characters, the first\r
-of which are digits and the last three of which are not "999". For example, it\r
-doesn't match "123abcfoo". A pattern to do that is\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=\d{3}...)(?&#60;!999)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-This time the first assertion looks at the preceding six characters, checking\r
-that the first three are digits, and then the second assertion checks that the\r
-preceding three characters are not "999".\r
-</P>\r
-<P>\r
-Assertions can be nested in any combination. For example,\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=(?&#60;!foo)bar)baz\r
-</PRE>\r
-</P>\r
-<P>\r
-matches an occurrence of "baz" that is preceded by "bar" which in turn is not\r
-preceded by "foo", while\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#60;=\d{3}(?!999)...)foo\r
-</PRE>\r
-</P>\r
-<P>\r
-is another pattern which matches "foo" preceded by three digits and any three\r
-characters that are not "999".\r
-</P>\r
-<P>\r
-Assertion subpatterns are not capturing subpatterns, and may not be repeated,\r
-because it makes no sense to assert the same thing several times. If any kind\r
-of assertion contains capturing subpatterns within it, these are counted for\r
-the purposes of numbering the capturing subpatterns in the whole pattern.\r
-However, substring capturing is carried out only for positive assertions,\r
-because it does not make sense for negative assertions.\r
-</P>\r
-<P>\r
-Assertions count towards the maximum of 200 parenthesized subpatterns.\r
-</P>\r
-<LI><A NAME="SEC25" HREF="#TOC1">ONCE-ONLY SUBPATTERNS</A>\r
-<P>\r
-With both maximizing and minimizing repetition, failure of what follows\r
-normally causes the repeated item to be re-evaluated to see if a different\r
-number of repeats allows the rest of the pattern to match. Sometimes it is\r
-useful to prevent this, either to change the nature of the match, or to cause\r
-it fail earlier than it otherwise might, when the author of the pattern knows\r
-there is no point in carrying on.\r
-</P>\r
-<P>\r
-Consider, for example, the pattern \d+foo when applied to the subject line\r
-</P>\r
-<P>\r
-<PRE>\r
-  123456bar\r
-</PRE>\r
-</P>\r
-<P>\r
-After matching all 6 digits and then failing to match "foo", the normal\r
-action of the matcher is to try again with only 5 digits matching the \d+\r
-item, and then with 4, and so on, before ultimately failing. Once-only\r
-subpatterns provide the means for specifying that once a portion of the pattern\r
-has matched, it is not to be re-evaluated in this way, so the matcher would\r
-give up immediately on failing to match "foo" the first time. The notation is\r
-another kind of special parenthesis, starting with (?&#62; as in this example:\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?&#62;\d+)bar\r
-</PRE>\r
-</P>\r
-<P>\r
-This kind of parenthesis "locks up" the  part of the pattern it contains once\r
-it has matched, and a failure further into the pattern is prevented from\r
-backtracking into it. Backtracking past it to previous items, however, works as\r
-normal.\r
-</P>\r
-<P>\r
-An alternative description is that a subpattern of this type matches the string\r
-of characters that an identical standalone pattern would match, if anchored at\r
-the current point in the subject string.\r
-</P>\r
-<P>\r
-Once-only subpatterns are not capturing subpatterns. Simple cases such as the\r
-above example can be thought of as a maximizing repeat that must swallow\r
-everything it can. So, while both \d+ and \d+? are prepared to adjust the\r
-number of digits they match in order to make the rest of the pattern match,\r
-(?&#62;\d+) can only match an entire sequence of digits.\r
-</P>\r
-<P>\r
-This construction can of course contain arbitrarily complicated subpatterns,\r
-and it can be nested.\r
-</P>\r
-<P>\r
-Once-only subpatterns can be used in conjunction with lookbehind assertions to\r
-specify efficient matching at the end of the subject string. Consider a simple\r
-pattern such as\r
-</P>\r
-<P>\r
-<PRE>\r
-  abcd$\r
-</PRE>\r
-</P>\r
-<P>\r
-when applied to a long string which does not match. Because matching proceeds\r
-from left to right, PCRE will look for each "a" in the subject and then see if\r
-what follows matches the rest of the pattern. If the pattern is specified as\r
-</P>\r
-<P>\r
-<PRE>\r
-  ^.*abcd$\r
-</PRE>\r
-</P>\r
-<P>\r
-the initial .* matches the entire string at first, but when this fails (because\r
-there is no following "a"), it backtracks to match all but the last character,\r
-then all but the last two characters, and so on. Once again the search for "a"\r
-covers the entire string, from right to left, so we are no better off. However,\r
-if the pattern is written as\r
-</P>\r
-<P>\r
-<PRE>\r
-  ^(?&#62;.*)(?&#60;=abcd)\r
-</PRE>\r
-</P>\r
-<P>\r
-there can be no backtracking for the .* item; it can match only the entire\r
-string. The subsequent lookbehind assertion does a single test on the last four\r
-characters. If it fails, the match fails immediately. For long strings, this\r
-approach makes a significant difference to the processing time.\r
-</P>\r
-<P>\r
-When a pattern contains an unlimited repeat inside a subpattern that can itself\r
-be repeated an unlimited number of times, the use of a once-only subpattern is\r
-the only way to avoid some failing matches taking a very long time indeed.\r
-The pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (\D+|&#60;\d+&#62;)*[!?]\r
-</PRE>\r
-</P>\r
-<P>\r
-matches an unlimited number of substrings that either consist of non-digits, or\r
-digits enclosed in &#60;&#62;, followed by either ! or ?. When it matches, it runs\r
-quickly. However, if it is applied to\r
-</P>\r
-<P>\r
-<PRE>\r
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r
-</PRE>\r
-</P>\r
-<P>\r
-it takes a long time before reporting failure. This is because the string can\r
-be divided between the two repeats in a large number of ways, and all have to\r
-be tried. (The example used [!?] rather than a single character at the end,\r
-because both PCRE and Perl have an optimization that allows for fast failure\r
-when a single character is used. They remember the last single character that\r
-is required for a match, and fail early if it is not present in the string.)\r
-If the pattern is changed to\r
-</P>\r
-<P>\r
-<PRE>\r
-  ((?&#62;\D+)|&#60;\d+&#62;)*[!?]\r
-</PRE>\r
-</P>\r
-<P>\r
-sequences of non-digits cannot be broken, and failure happens quickly.\r
-</P>\r
-<LI><A NAME="SEC26" HREF="#TOC1">CONDITIONAL SUBPATTERNS</A>\r
-<P>\r
-It is possible to cause the matching process to obey a subpattern\r
-conditionally or to choose between two alternative subpatterns, depending on\r
-the result of an assertion, or whether a previous capturing subpattern matched\r
-or not. The two possible forms of conditional subpattern are\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?(condition)yes-pattern)\r
-  (?(condition)yes-pattern|no-pattern)\r
-</PRE>\r
-</P>\r
-<P>\r
-If the condition is satisfied, the yes-pattern is used; otherwise the\r
-no-pattern (if present) is used. If there are more than two alternatives in the\r
-subpattern, a compile-time error occurs.\r
-</P>\r
-<P>\r
-There are two kinds of condition. If the text between the parentheses consists\r
-of a sequence of digits, the condition is satisfied if the capturing subpattern\r
-of that number has previously matched. The number must be greater than zero.\r
-Consider the following pattern, which contains non-significant white space to\r
-make it more readable (assume the PCRE_EXTENDED option) and to divide it into\r
-three parts for ease of discussion:\r
-</P>\r
-<P>\r
-<PRE>\r
-  ( \( )?    [^()]+    (?(1) \) )\r
-</PRE>\r
-</P>\r
-<P>\r
-The first part matches an optional opening parenthesis, and if that\r
-character is present, sets it as the first captured substring. The second part\r
-matches one or more characters that are not parentheses. The third part is a\r
-conditional subpattern that tests whether the first set of parentheses matched\r
-or not. If they did, that is, if subject started with an opening parenthesis,\r
-the condition is true, and so the yes-pattern is executed and a closing\r
-parenthesis is required. Otherwise, since no-pattern is not present, the\r
-subpattern matches nothing. In other words, this pattern matches a sequence of\r
-non-parentheses, optionally enclosed in parentheses.\r
-</P>\r
-<P>\r
-If the condition is not a sequence of digits, it must be an assertion. This may\r
-be a positive or negative lookahead or lookbehind assertion. Consider this\r
-pattern, again containing non-significant white space, and with the two\r
-alternatives on the second line:\r
-</P>\r
-<P>\r
-<PRE>\r
-  (?(?=[^a-z]*[a-z])\r
-  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )\r
-</PRE>\r
-</P>\r
-<P>\r
-The condition is a positive lookahead assertion that matches an optional\r
-sequence of non-letters followed by a letter. In other words, it tests for the\r
-presence of at least one letter in the subject. If a letter is found, the\r
-subject is matched against the first alternative; otherwise it is matched\r
-against the second. This pattern matches strings in one of the two forms\r
-dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.\r
-</P>\r
-<LI><A NAME="SEC27" HREF="#TOC1">COMMENTS</A>\r
-<P>\r
-The sequence (?# marks the start of a comment which continues up to the next\r
-closing parenthesis. Nested parentheses are not permitted. The characters\r
-that make up a comment play no part in the pattern matching at all.\r
-</P>\r
-<P>\r
-If the PCRE_EXTENDED option is set, an unescaped # character outside a\r
-character class introduces a comment that continues up to the next newline\r
-character in the pattern.\r
-</P>\r
-<LI><A NAME="SEC28" HREF="#TOC1">RECURSIVE PATTERNS</A>\r
-<P>\r
-Consider the problem of matching a string in parentheses, allowing for\r
-unlimited nested parentheses. Without the use of recursion, the best that can\r
-be done is to use a pattern that matches up to some fixed depth of nesting. It\r
-is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an\r
-experimental facility that allows regular expressions to recurse (amongst other\r
-things). It does this by interpolating Perl code in the expression at run time,\r
-and the code can refer to the expression itself. A Perl pattern to solve the\r
-parentheses problem can be created like this:\r
-</P>\r
-<P>\r
-<PRE>\r
-  $re = qr{\( (?: (?&#62;[^()]+) | (?p{$re}) )* \)}x;\r
-</PRE>\r
-</P>\r
-<P>\r
-The (?p{...}) item interpolates Perl code at run time, and in this case refers\r
-recursively to the pattern in which it appears. Obviously, PCRE cannot support\r
-the interpolation of Perl code. Instead, the special item (?R) is provided for\r
-the specific case of recursion. This PCRE pattern solves the parentheses\r
-problem (assume the PCRE_EXTENDED option is set so that white space is\r
-ignored):\r
-</P>\r
-<P>\r
-<PRE>\r
-  \( ( (?&#62;[^()]+) | (?R) )* \)\r
-</PRE>\r
-</P>\r
-<P>\r
-First it matches an opening parenthesis. Then it matches any number of\r
-substrings which can either be a sequence of non-parentheses, or a recursive\r
-match of the pattern itself (i.e. a correctly parenthesized substring). Finally\r
-there is a closing parenthesis.\r
-</P>\r
-<P>\r
-This particular example pattern contains nested unlimited repeats, and so the\r
-use of a once-only subpattern for matching strings of non-parentheses is\r
-important when applying the pattern to strings that do not match. For example,\r
-when it is applied to\r
-</P>\r
-<P>\r
-<PRE>\r
-  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\r
-</PRE>\r
-</P>\r
-<P>\r
-it yields "no match" quickly. However, if a once-only subpattern is not used,\r
-the match runs for a very long time indeed because there are so many different\r
-ways the + and * repeats can carve up the subject, and all have to be tested\r
-before failure can be reported.\r
-</P>\r
-<P>\r
-The values set for any capturing subpatterns are those from the outermost level\r
-of the recursion at which the subpattern value is set. If the pattern above is\r
-matched against\r
-</P>\r
-<P>\r
-<PRE>\r
-  (ab(cd)ef)\r
-</PRE>\r
-</P>\r
-<P>\r
-the value for the capturing parentheses is "ef", which is the last value taken\r
-on at the top level. If additional parentheses are added, giving\r
-</P>\r
-<P>\r
-<PRE>\r
-  \( ( ( (?&#62;[^()]+) | (?R) )* ) \)\r
-     ^                        ^\r
-     ^                        ^\r
-</PRE>\r
-the string they capture is "ab(cd)ef", the contents of the top level\r
-parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE\r
-has to obtain extra memory to store data during a recursion, which it does by\r
-using <B>pcre_malloc</B>, freeing it via <B>pcre_free</B> afterwards. If no\r
-memory can be obtained, it saves data for the first 15 capturing parentheses\r
-only, as there is no way to give an out-of-memory error from within a\r
-recursion.\r
-</P>\r
-<LI><A NAME="SEC29" HREF="#TOC1">PERFORMANCE</A>\r
-<P>\r
-Certain items that may appear in patterns are more efficient than others. It is\r
-more efficient to use a character class like [aeiou] than a set of alternatives\r
-such as (a|e|i|o|u). In general, the simplest construction that provides the\r
-required behaviour is usually the most efficient. Jeffrey Friedl's book\r
-contains a lot of discussion about optimizing regular expressions for efficient\r
-performance.\r
-</P>\r
-<P>\r
-When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is\r
-implicitly anchored by PCRE, since it can match only at the start of a subject\r
-string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization,\r
-because the . metacharacter does not then match a newline, and if the subject\r
-string contains newlines, the pattern may match from the character immediately\r
-following one of them instead of from the very start. For example, the pattern\r
-</P>\r
-<P>\r
-<PRE>\r
-  (.*) second\r
-</PRE>\r
-</P>\r
-<P>\r
-matches the subject "first\nand second" (where \n stands for a newline\r
-character) with the first captured substring being "and". In order to do this,\r
-PCRE has to retry the match starting after every newline in the subject.\r
-</P>\r
-<P>\r
-If you are using such a pattern with subject strings that do not contain\r
-newlines, the best performance is obtained by setting PCRE_DOTALL, or starting\r
-the pattern with ^.* to indicate explicit anchoring. That saves PCRE from\r
-having to scan along the subject looking for a newline to restart at.\r
-</P>\r
-<P>\r
-Beware of patterns that contain nested indefinite repeats. These can take a\r
-long time to run when applied to a string that does not match. Consider the\r
-pattern fragment\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a+)*\r
-</PRE>\r
-</P>\r
-<P>\r
-This can match "aaaa" in 33 different ways, and this number increases very\r
-rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4\r
-times, and for each of those cases other than 0, the + repeats can match\r
-different numbers of times.) When the remainder of the pattern is such that the\r
-entire match is going to fail, PCRE has in principle to try every possible\r
-variation, and this can take an extremely long time.\r
-</P>\r
-<P>\r
-An optimization catches some of the more simple cases such as\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a+)*b\r
-</PRE>\r
-</P>\r
-<P>\r
-where a literal character follows. Before embarking on the standard matching\r
-procedure, PCRE checks that there is a "b" later in the subject string, and if\r
-there is not, it fails the match immediately. However, when there is no\r
-following literal this optimization cannot be used. You can see the difference\r
-by comparing the behaviour of\r
-</P>\r
-<P>\r
-<PRE>\r
-  (a+)*\d\r
-</PRE>\r
-</P>\r
-<P>\r
-with the pattern above. The former gives a failure almost instantly when\r
-applied to a whole line of "a" characters, whereas the latter takes an\r
-appreciable time with strings longer than about 20 characters.\r
-</P>\r
-<LI><A NAME="SEC30" HREF="#TOC1">UTF-8 SUPPORT</A>\r
-<P>\r
-Starting at release 3.3, PCRE has some support for character strings encoded\r
-in the UTF-8 format. This is incomplete, and is regarded as experimental. In\r
-order to use it, you must configure PCRE to include UTF-8 support in the code,\r
-and, in addition, you must call <B>pcre_compile()</B> with the PCRE_UTF8 option\r
-flag. When you do this, both the pattern and any subject strings that are\r
-matched against it are treated as UTF-8 strings instead of just strings of\r
-bytes, but only in the cases that are mentioned below.\r
-</P>\r
-<P>\r
-If you compile PCRE with UTF-8 support, but do not use it at run time, the\r
-library will be a bit bigger, but the additional run time overhead is limited\r
-to testing the PCRE_UTF8 flag in several places, so should not be very large.\r
-</P>\r
-<P>\r
-PCRE assumes that the strings it is given contain valid UTF-8 codes. It does\r
-not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE,\r
-the results are undefined.\r
-</P>\r
-<P>\r
-Running with PCRE_UTF8 set causes these changes in the way PCRE works:\r
-</P>\r
-<P>\r
-1. In a pattern, the escape sequence \x{...}, where the contents of the braces\r
-is a string of hexadecimal digits, is interpreted as a UTF-8 character whose\r
-code number is the given hexadecimal number, for example: \x{1234}. This\r
-inserts from one to six literal bytes into the pattern, using the UTF-8\r
-encoding. If a non-hexadecimal digit appears between the braces, the item is\r
-not recognized.\r
-</P>\r
-<P>\r
-2. The original hexadecimal escape sequence, \xhh, generates a two-byte UTF-8\r
-character if its value is greater than 127.\r
-</P>\r
-<P>\r
-3. Repeat quantifiers are NOT correctly handled if they follow a multibyte\r
-character. For example, \x{100}* and \xc3+ do not work. If you want to\r
-repeat such characters, you must enclose them in non-capturing parentheses,\r
-for example (?:\x{100}), at present.\r
-</P>\r
-<P>\r
-4. The dot metacharacter matches one UTF-8 character instead of a single byte.\r
-</P>\r
-<P>\r
-5. Unlike literal UTF-8 characters, the dot metacharacter followed by a\r
-repeat quantifier does operate correctly on UTF-8 characters instead of\r
-single bytes.\r
-</P>\r
-<P>\r
-4. Although the \x{...} escape is permitted in a character class, characters\r
-whose values are greater than 255 cannot be included in a class.\r
-</P>\r
-<P>\r
-5. A class is matched against a UTF-8 character instead of just a single byte,\r
-but it can match only characters whose values are less than 256. Characters\r
-with greater values always fail to match a class.\r
-</P>\r
-<P>\r
-6. Repeated classes work correctly on multiple characters.\r
-</P>\r
-<P>\r
-7. Classes containing just a single character whose value is greater than 127\r
-(but less than 256), for example, [\x80] or [^\x{93}], do not work because\r
-these are optimized into single byte matches. In the first case, of course,\r
-the class brackets are just redundant.\r
-</P>\r
-<P>\r
-8. Lookbehind assertions move backwards in the subject by a fixed number of\r
-characters instead of a fixed number of bytes. Simple cases have been tested\r
-to work correctly, but there may be hidden gotchas herein.\r
-</P>\r
-<P>\r
-9. The character types such as \d and \w do not work correctly with UTF-8\r
-characters. They continue to test a single byte.\r
-</P>\r
-<P>\r
-10. Anything not explicitly mentioned here continues to work in bytes rather\r
-than in characters.\r
-</P>\r
-<P>\r
-The following UTF-8 features of Perl 5.6 are not implemented:\r
-</P>\r
-<P>\r
-1. The escape sequence \C to match a single byte.\r
-</P>\r
-<P>\r
-2. The use of Unicode tables and properties and escapes \p, \P, and \X.\r
-</P>\r
-<LI><A NAME="SEC31" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel &#60;ph10@cam.ac.uk&#62;\r
-<BR>\r
-University Computing Service,\r
-<BR>\r
-New Museums Site,\r
-<BR>\r
-Cambridge CB2 3QG, England.\r
-<BR>\r
-Phone: +44 1223 334714\r
-</P>\r
-<P>\r
-Last updated: 28 August 2000,\r
-<BR>\r
-<PRE>\r
-  the 250th anniversary of the death of J.S. Bach.\r
-<BR>\r
-</PRE>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcre.txt b/pcre/doc/pcre.txt
deleted file mode 100644 (file)
index 1db4b53..0000000
+++ /dev/null
@@ -1,2125 +0,0 @@
-NAME
-     pcre - Perl-compatible regular expressions.
-
-
-
-SYNOPSIS
-     #include <pcre.h>
-
-     pcre *pcre_compile(const char *pattern, int options,
-          const char **errptr, int *erroffset,
-          const unsigned char *tableptr);
-
-     pcre_extra *pcre_study(const pcre *code, int options,
-          const char **errptr);
-
-     int pcre_exec(const pcre *code, const pcre_extra *extra,
-          const char *subject, int length, int startoffset,
-          int options, int *ovector, int ovecsize);
-
-     int pcre_copy_substring(const char *subject, int *ovector,
-          int stringcount, int stringnumber, char *buffer,
-          int buffersize);
-
-     int pcre_get_substring(const char *subject, int *ovector,
-          int stringcount, int stringnumber,
-          const char **stringptr);
-
-     int pcre_get_substring_list(const char *subject,
-          int *ovector, int stringcount, const char ***listptr);
-
-     void pcre_free_substring(const char *stringptr);
-
-     void pcre_free_substring_list(const char **stringptr);
-
-     const unsigned char *pcre_maketables(void);
-
-     int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
-          int what, void *where);
-
-     int pcre_info(const pcre *code, int *optptr, *firstcharptr);
-
-     char *pcre_version(void);
-
-     void *(*pcre_malloc)(size_t);
-
-     void (*pcre_free)(void *);
-
-
-
-
-DESCRIPTION
-     The PCRE library is a set of functions that implement  regu-
-     lar  expression  pattern  matching using the same syntax and
-     semantics as Perl  5,  with  just  a  few  differences  (see
-
-     below).  The  current  implementation  corresponds  to  Perl
-     5.005, with some additional features  from  later  versions.
-     This  includes  some  experimental,  incomplete  support for
-     UTF-8 encoded strings. Details of exactly what is  and  what
-     is not supported are given below.
-
-     PCRE has its own native API,  which  is  described  in  this
-     document.  There  is  also  a  set of wrapper functions that
-     correspond to the POSIX regular expression API.   These  are
-     described in the pcreposix documentation.
-
-     The native API function prototypes are defined in the header
-     file  pcre.h,  and  on  Unix  systems  the library itself is
-     called libpcre.a, so can be accessed by adding -lpcre to the
-     command  for  linking  an  application  which  calls it. The
-     header file defines the macros PCRE_MAJOR and PCRE_MINOR  to
-     contain the major and minor release numbers for the library.
-     Applications can use these to include support for  different
-     releases.
-
-     The functions pcre_compile(), pcre_study(), and  pcre_exec()
-     are used for compiling and matching regular expressions.
-
-     The functions  pcre_copy_substring(),  pcre_get_substring(),
-     and  pcre_get_substring_list() are convenience functions for
-     extracting  captured  substrings  from  a  matched   subject
-     string; pcre_free_substring() and pcre_free_substring_list()
-     are also provided, to free the  memory  used  for  extracted
-     strings.
-
-     The function pcre_maketables() is used (optionally) to build
-     a  set of character tables in the current locale for passing
-     to pcre_compile().
-
-     The function pcre_fullinfo() is used to find out information
-     about a compiled pattern; pcre_info() is an obsolete version
-     which returns only some of the available information, but is
-     retained   for   backwards   compatibility.    The  function
-     pcre_version() returns a pointer to a string containing  the
-     version of PCRE and its date of release.
-
-     The global variables  pcre_malloc  and  pcre_free  initially
-     contain the entry points of the standard malloc() and free()
-     functions respectively. PCRE  calls  the  memory  management
-     functions  via  these  variables,  so  a calling program can
-     replace them if it  wishes  to  intercept  the  calls.  This
-     should be done before calling any PCRE functions.
-
-
-
-MULTI-THREADING
-     The  PCRE  functions  can   be   used   in   multi-threading
-
-
-
-
-
-SunOS 5.8                 Last change:                          2
-
-
-
-     applications,  with  the  proviso that the memory management
-     functions pointed to by pcre_malloc and pcre_free are shared
-     by all threads.
-
-     The compiled form of a regular  expression  is  not  altered
-     during  matching, so the same compiled pattern can safely be
-     used by several threads at once.
-
-
-
-COMPILING A PATTERN
-     The function pcre_compile() is called to compile  a  pattern
-     into  an internal form. The pattern is a C string terminated
-     by a binary zero, and is passed in the argument  pattern.  A
-     pointer  to  a  single  block of memory that is obtained via
-     pcre_malloc is returned. This contains the compiled code and
-     related data. The pcre type is defined for this for conveni-
-     ence, but in fact pcre is just a typedef for void, since the
-     contents  of  the block are not externally defined. It is up
-     to the caller to free  the  memory  when  it  is  no  longer
-     required.
-
-     The size of a compiled pattern is  roughly  proportional  to
-     the length of the pattern string, except that each character
-     class (other than those containing just a single  character,
-     negated  or  not)  requires 33 bytes, and repeat quantifiers
-     with a minimum greater than one or a bounded  maximum  cause
-     the  relevant  portions of the compiled pattern to be repli-
-     cated.
-
-     The options argument contains independent bits  that  affect
-     the  compilation.  It  should  be  zero  if  no  options are
-     required. Some of the options, in particular, those that are
-     compatible  with Perl, can also be set and unset from within
-     the pattern (see the detailed description of regular expres-
-     sions below). For these options, the contents of the options
-     argument specifies their initial settings at  the  start  of
-     compilation  and  execution. The PCRE_ANCHORED option can be
-     set at the time of matching as well as at compile time.
-
-     If errptr is NULL, pcre_compile() returns NULL  immediately.
-     Otherwise, if compilation of a pattern fails, pcre_compile()
-     returns NULL, and sets the variable pointed to by errptr  to
-     point  to a textual error message. The offset from the start
-     of  the  pattern  to  the  character  where  the  error  was
-     discovered   is   placed  in  the  variable  pointed  to  by
-     erroffset, which must not be NULL. If it  is,  an  immediate
-     error is given.
-
-     If the final  argument,  tableptr,  is  NULL,  PCRE  uses  a
-     default  set  of character tables which are built when it is
-     compiled, using the default C  locale.  Otherwise,  tableptr
-     must  be  the result of a call to pcre_maketables(). See the
-     section on locale support below.
-
-     The following option bits are defined in the header file:
-
-       PCRE_ANCHORED
-
-     If this bit is set, the pattern is forced to be  "anchored",
-     that is, it is constrained to match only at the start of the
-     string which is being searched (the "subject string").  This
-     effect can also be achieved by appropriate constructs in the
-     pattern itself, which is the only way to do it in Perl.
-
-       PCRE_CASELESS
-
-     If this bit is set, letters in the pattern match both  upper
-     and  lower  case  letters.  It  is  equivalent  to Perl's /i
-     option.
-
-       PCRE_DOLLAR_ENDONLY
-
-     If this bit is set, a dollar metacharacter  in  the  pattern
-     matches  only at the end of the subject string. Without this
-     option, a dollar also matches immediately before  the  final
-     character  if it is a newline (but not before any other new-
-     lines).  The  PCRE_DOLLAR_ENDONLY  option  is   ignored   if
-     PCRE_MULTILINE is set. There is no equivalent to this option
-     in Perl.
-
-       PCRE_DOTALL
-
-     If this bit is  set,  a  dot  metacharater  in  the  pattern
-     matches all characters, including newlines. Without it, new-
-     lines are excluded. This option is equivalent to  Perl's  /s
-     option.  A negative class such as [^a] always matches a new-
-     line character, independent of the setting of this option.
-
-       PCRE_EXTENDED
-
-     If this bit is set, whitespace data characters in  the  pat-
-     tern  are  totally  ignored  except when escaped or inside a
-     character class, and characters between an unescaped #  out-
-     side  a  character  class  and  the  next newline character,
-     inclusive, are also ignored. This is equivalent to Perl's /x
-     option,  and  makes  it  possible to include comments inside
-     complicated patterns. Note, however, that this applies  only
-     to  data  characters. Whitespace characters may never appear
-     within special character sequences in a pattern, for example
-     within  the sequence (?( which introduces a conditional sub-
-     pattern.
-
-       PCRE_EXTRA
-
-     This option was invented in  order  to  turn  on  additional
-     functionality of PCRE that is incompatible with Perl, but it
-     is currently of very little use. When set, any backslash  in
-     a  pattern  that is followed by a letter that has no special
-     meaning causes an error, thus reserving  these  combinations
-     for  future  expansion.  By default, as in Perl, a backslash
-     followed by a letter with no special meaning is treated as a
-     literal.  There  are at present no other features controlled
-     by this option. It can also be set by a (?X) option  setting
-     within a pattern.
-
-       PCRE_MULTILINE
-
-     By default, PCRE treats the subject string as consisting  of
-     a  single "line" of characters (even if it actually contains
-     several newlines). The "start  of  line"  metacharacter  (^)
-     matches  only  at the start of the string, while the "end of
-     line" metacharacter ($) matches  only  at  the  end  of  the
-     string,    or   before   a   terminating   newline   (unless
-     PCRE_DOLLAR_ENDONLY is set). This is the same as Perl.
-
-     When PCRE_MULTILINE it is set, the "start of line" and  "end
-     of  line"  constructs match immediately following or immedi-
-     ately before any newline  in  the  subject  string,  respec-
-     tively,  as  well  as  at  the  very  start and end. This is
-     equivalent to Perl's /m option. If there are no "\n" charac-
-     ters  in  a subject string, or no occurrences of ^ or $ in a
-     pattern, setting PCRE_MULTILINE has no effect.
-
-       PCRE_UNGREEDY
-
-     This option inverts the "greediness" of the  quantifiers  so
-     that  they  are  not greedy by default, but become greedy if
-     followed by "?". It is not compatible with Perl. It can also
-     be set by a (?U) option setting within the pattern.
-
-       PCRE_UTF8
-
-     This option causes PCRE to regard both the pattern  and  the
-     subject  as strings of UTF-8 characters instead of just byte
-     strings. However, it is available  only  if  PCRE  has  been
-     built  to  include  UTF-8  support.  If not, the use of this
-     option provokes an error. Support for UTF-8 is new,  experi-
-     mental,  and incomplete.  Details of exactly what it entails
-     are given below.
-
-
-
-STUDYING A PATTERN
-     When a pattern is going to be  used  several  times,  it  is
-     worth  spending  more time analyzing it in order to speed up
-     the time taken for matching. The function pcre_study() takes
-
-     a  pointer  to a compiled pattern as its first argument, and
-     returns a  pointer  to  a  pcre_extra  block  (another  void
-     typedef)  containing  additional  information about the pat-
-     tern; this can be passed to pcre_exec().  If  no  additional
-     information is available, NULL is returned.
-
-     The second argument contains option  bits.  At  present,  no
-     options  are  defined  for  pcre_study(),  and this argument
-     should always be zero.
-
-     The third argument for pcre_study() is a pointer to an error
-     message. If studying succeeds (even if no data is returned),
-     the variable it points to  is  set  to  NULL.  Otherwise  it
-     points to a textual error message.
-
-     At present, studying a  pattern  is  useful  only  for  non-
-     anchored  patterns  that do not have a single fixed starting
-     character. A  bitmap  of  possible  starting  characters  is
-     created.
-
-
-
-LOCALE SUPPORT
-     PCRE handles caseless matching, and determines whether char-
-     acters  are  letters, digits, or whatever, by reference to a
-     set of tables. The library contains a default set of  tables
-     which  is  created in the default C locale when PCRE is com-
-     piled.  This  is   used   when   the   final   argument   of
-     pcre_compile()  is NULL, and is sufficient for many applica-
-     tions.
-
-     An alternative set of tables can, however, be supplied. Such
-     tables  are built by calling the pcre_maketables() function,
-     which has no arguments, in the relevant locale.  The  result
-     can  then be passed to pcre_compile() as often as necessary.
-     For example, to build and use tables  that  are  appropriate
-     for  the French locale (where accented characters with codes
-     greater than 128 are treated as letters), the following code
-     could be used:
-
-       setlocale(LC_CTYPE, "fr");
-       tables = pcre_maketables();
-       re = pcre_compile(..., tables);
-
-     The  tables  are  built  in  memory  that  is  obtained  via
-     pcre_malloc.  The  pointer that is passed to pcre_compile is
-     saved with the compiled pattern, and  the  same  tables  are
-     used  via this pointer by pcre_study() and pcre_exec(). Thus
-     for any single pattern, compilation, studying  and  matching
-     all happen in the same locale, but different patterns can be
-     compiled in different locales. It is the caller's  responsi-
-     bility  to  ensure  that  the  memory  containing the tables
-     remains available for as long as it is needed.
-
-
-
-INFORMATION ABOUT A PATTERN
-     The pcre_fullinfo() function  returns  information  about  a
-     compiled pattern. It replaces the obsolete pcre_info() func-
-     tion, which is nevertheless retained for backwards compabil-
-     ity (and is documented below).
-
-     The first argument for pcre_fullinfo() is a pointer  to  the
-     compiled  pattern.  The  second  argument  is  the result of
-     pcre_study(), or NULL if the pattern was  not  studied.  The
-     third  argument  specifies  which  piece  of  information is
-     required, while the fourth argument is a pointer to a  vari-
-     able  to receive the data. The yield of the function is zero
-     for success, or one of the following negative numbers:
-
-       PCRE_ERROR_NULL       the argument code was NULL
-                             the argument where was NULL
-       PCRE_ERROR_BADMAGIC   the "magic number" was not found
-       PCRE_ERROR_BADOPTION  the value of what was invalid
-
-     The possible values for the third argument  are  defined  in
-     pcre.h, and are as follows:
-
-       PCRE_INFO_OPTIONS
-
-     Return a copy of the options with which the pattern was com-
-     piled.  The fourth argument should point to au unsigned long
-     int variable. These option bits are those specified  in  the
-     call  to  pcre_compile(),  modified  by any top-level option
-     settings  within  the   pattern   itself,   and   with   the
-     PCRE_ANCHORED  bit  forcibly  set if the form of the pattern
-     implies that it can match only at the  start  of  a  subject
-     string.
-
-       PCRE_INFO_SIZE
-
-     Return the size of the compiled pattern, that is, the  value
-     that  was  passed as the argument to pcre_malloc() when PCRE
-     was getting memory in which to place the compiled data.  The
-     fourth argument should point to a size_t variable.
-
-       PCRE_INFO_CAPTURECOUNT
-
-     Return the number of capturing subpatterns in  the  pattern.
-     The fourth argument should point to an int variable.
-
-       PCRE_INFO_BACKREFMAX
-
-     Return the number of  the  highest  back  reference  in  the
-     pattern.  The  fourth  argument should point to an int vari-
-     able. Zero is returned if there are no back references.
-
-       PCRE_INFO_FIRSTCHAR
-
-     Return information about the first character of any  matched
-     string,  for  a  non-anchored  pattern.  If there is a fixed
-     first   character,   e.g.   from   a   pattern    such    as
-     (cat|cow|coyote),  it  is returned in the integer pointed to
-     by where. Otherwise, if either
-
-     (a) the pattern was compiled with the PCRE_MULTILINE option,
-     and every branch starts with "^", or
-
-     (b) every  branch  of  the  pattern  starts  with  ".*"  and
-     PCRE_DOTALL is not set (if it were set, the pattern would be
-     anchored),
-
-     -1 is returned, indicating that the pattern matches only  at
-     the  start  of a subject string or after any "\n" within the
-     string. Otherwise -2 is returned.  For anchored patterns, -2
-     is returned.
-
-       PCRE_INFO_FIRSTTABLE
-
-     If the pattern was studied, and this resulted  in  the  con-
-     struction of a 256-bit table indicating a fixed set of char-
-     acters for the first character in  any  matching  string,  a
-     pointer   to  the  table  is  returned.  Otherwise  NULL  is
-     returned. The fourth argument should point  to  an  unsigned
-     char * variable.
-
-       PCRE_INFO_LASTLITERAL
-
-     For a non-anchored pattern, return the value of  the  right-
-     most  literal  character  which  must  exist  in any matched
-     string, other than at its start. The fourth argument  should
-     point  to an int variable. If there is no such character, or
-     if the pattern is anchored, -1 is returned. For example, for
-     the pattern /a\d+z\d+/ the returned value is 'z'.
-
-     The pcre_info() function is now obsolete because its  inter-
-     face  is  too  restrictive  to return all the available data
-     about  a  compiled  pattern.   New   programs   should   use
-     pcre_fullinfo()  instead.  The  yield  of pcre_info() is the
-     number of capturing subpatterns, or  one  of  the  following
-     negative numbers:
-
-       PCRE_ERROR_NULL       the argument code was NULL
-       PCRE_ERROR_BADMAGIC   the "magic number" was not found
-
-     If the optptr argument is not NULL, a copy  of  the  options
-     with which the pattern was compiled is placed in the integer
-     it points to (see PCRE_INFO_OPTIONS above).
-
-     If the pattern is not anchored and the firstcharptr argument
-     is  not  NULL, it is used to pass back information about the
-     first    character    of    any    matched    string    (see
-     PCRE_INFO_FIRSTCHAR above).
-
-
-
-MATCHING A PATTERN
-     The function pcre_exec() is called to match a subject string
-     against  a pre-compiled pattern, which is passed in the code
-     argument. If the pattern has been studied, the result of the
-     study should be passed in the extra argument. Otherwise this
-     must be NULL.
-
-     The PCRE_ANCHORED option can be passed in the options  argu-
-     ment,  whose unused bits must be zero. However, if a pattern
-     was  compiled  with  PCRE_ANCHORED,  or  turned  out  to  be
-     anchored  by  virtue  of  its  contents,  it  cannot be made
-     unachored at matching time.
-
-     There are also three further options that can be set only at
-     matching time:
-
-       PCRE_NOTBOL
-
-     The first character of the string is not the beginning of  a
-     line,  so  the  circumflex  metacharacter  should  not match
-     before it. Setting this without PCRE_MULTILINE  (at  compile
-     time) causes circumflex never to match.
-
-       PCRE_NOTEOL
-
-     The end of the string is not the end of a line, so the  dol-
-     lar  metacharacter should not match it nor (except in multi-
-     line mode) a newline immediately  before  it.  Setting  this
-     without PCRE_MULTILINE (at compile time) causes dollar never
-     to match.
-
-       PCRE_NOTEMPTY
-
-     An empty string is not considered to be  a  valid  match  if
-     this  option  is  set. If there are alternatives in the pat-
-     tern, they are tried. If  all  the  alternatives  match  the
-     empty  string,  the  entire match fails. For example, if the
-     pattern
-
-       a?b?
-
-     is applied to a string not beginning with  "a"  or  "b",  it
-     matches  the  empty string at the start of the subject. With
-     PCRE_NOTEMPTY set, this match is not valid, so PCRE searches
-     further into the string for occurrences of "a" or "b".
-
-     Perl has no direct equivalent of PCRE_NOTEMPTY, but it  does
-     make  a  special case of a pattern match of the empty string
-     within its split() function, and when using the /g modifier.
-     It  is possible to emulate Perl's behaviour after matching a
-     null string by first trying the  match  again  at  the  same
-     offset  with  PCRE_NOTEMPTY  set,  and then if that fails by
-     advancing the starting offset  (see  below)  and  trying  an
-     ordinary match again.
-
-     The subject string is passed as  a  pointer  in  subject,  a
-     length  in  length,  and  a  starting offset in startoffset.
-     Unlike the pattern string, it may contain binary zero  char-
-     acters.  When  the starting offset is zero, the search for a
-     match starts at the beginning of the subject, and this is by
-     far the most common case.
-
-     A non-zero starting offset  is  useful  when  searching  for
-     another  match  in  the  same subject by calling pcre_exec()
-     again after a previous success.  Setting startoffset differs
-     from  just  passing  over  a  shortened  string  and setting
-     PCRE_NOTBOL in the case of a pattern that  begins  with  any
-     kind of lookbehind. For example, consider the pattern
-
-       \Biss\B
-
-     which finds occurrences of "iss" in the middle of words. (\B
-     matches only if the current position in the subject is not a
-     word boundary.) When applied to the string "Mississipi"  the
-     first  call  to  pcre_exec()  finds the first occurrence. If
-     pcre_exec() is called again with just the remainder  of  the
-     subject,  namely  "issipi", it does not match, because \B is
-     always false at the start of the subject, which is deemed to
-     be  a  word  boundary. However, if pcre_exec() is passed the
-     entire string again, but with startoffset set to 4, it finds
-     the  second  occurrence  of "iss" because it is able to look
-     behind the starting point to discover that it is preceded by
-     a letter.
-
-     If a non-zero starting offset is passed when the pattern  is
-     anchored, one attempt to match at the given offset is tried.
-     This can only succeed if the pattern does  not  require  the
-     match to be at the start of the subject.
-
-     In general, a pattern matches a certain portion of the  sub-
-     ject,  and  in addition, further substrings from the subject
-     may be picked out by parts of  the  pattern.  Following  the
-     usage  in  Jeffrey Friedl's book, this is called "capturing"
-     in what follows, and the phrase  "capturing  subpattern"  is
-     used for a fragment of a pattern that picks out a substring.
-     PCRE supports several other kinds of  parenthesized  subpat-
-     tern that do not cause substrings to be captured.
-
-     Captured substrings are returned to the caller via a  vector
-     of  integer  offsets whose address is passed in ovector. The
-     number of elements in the vector is passed in ovecsize.  The
-     first two-thirds of the vector is used to pass back captured
-     substrings, each substring using a  pair  of  integers.  The
-     remaining  third  of  the  vector  is  used  as workspace by
-     pcre_exec() while matching capturing subpatterns, and is not
-     available for passing back information. The length passed in
-     ovecsize should always be a multiple of three. If it is not,
-     it is rounded down.
-
-     When a match has been successful, information about captured
-     substrings is returned in pairs of integers, starting at the
-     beginning of ovector, and continuing up to two-thirds of its
-     length  at  the  most. The first element of a pair is set to
-     the offset of the first character in a  substring,  and  the
-     second is set to the offset of the first character after the
-     end of a substring. The first  pair,  ovector[0]  and  ovec-
-     tor[1],  identify  the portion of the subject string matched
-     by the entire pattern. The next pair is used for  the  first
-     capturing  subpattern,  and  so  on.  The  value returned by
-     pcre_exec() is the number of pairs that have  been  set.  If
-     there  are no capturing subpatterns, the return value from a
-     successful match is 1, indicating that just the  first  pair
-     of offsets has been set.
-
-     Some convenience functions are provided for  extracting  the
-     captured substrings as separate strings. These are described
-     in the following section.
-
-     It is possible for an capturing  subpattern  number  n+1  to
-     match  some  part  of  the subject when subpattern n has not
-     been used at all.  For  example,  if  the  string  "abc"  is
-     matched  against the pattern (a|(z))(bc) subpatterns 1 and 3
-     are matched, but 2 is not. When this  happens,  both  offset
-     values corresponding to the unused subpattern are set to -1.
-
-     If a capturing subpattern is matched repeatedly, it  is  the
-     last  portion  of  the  string  that  it  matched  that gets
-     returned.
-
-     If the vector is too small to hold  all  the  captured  sub-
-     strings,  it is used as far as possible (up to two-thirds of
-     its length), and the function returns a value  of  zero.  In
-     particular,  if  the  substring offsets are not of interest,
-     pcre_exec() may be called with ovector passed  as  NULL  and
-     ovecsize  as  zero.  However,  if  the pattern contains back
-     references and the ovector isn't big enough to remember  the
-     related  substrings,  PCRE  has to get additional memory for
-     use during matching. Thus it is usually advisable to  supply
-     an ovector.
-
-     Note that pcre_info() can be used to find out how many  cap-
-     turing  subpatterns  there  are  in  a compiled pattern. The
-     smallest size for ovector that will  allow  for  n  captured
-     substrings  in  addition  to  the  offsets  of the substring
-     matched by the whole pattern is (n+1)*3.
-
-     If pcre_exec() fails, it returns a negative number. The fol-
-     lowing are defined in the header file:
-
-       PCRE_ERROR_NOMATCH        (-1)
-
-     The subject string did not match the pattern.
-
-       PCRE_ERROR_NULL           (-2)
-
-     Either code or subject was passed as NULL,  or  ovector  was
-     NULL and ovecsize was not zero.
-
-       PCRE_ERROR_BADOPTION      (-3)
-
-     An unrecognized bit was set in the options argument.
-
-       PCRE_ERROR_BADMAGIC       (-4)
-
-     PCRE stores a 4-byte "magic number" at the start of the com-
-     piled  code,  to  catch  the  case  when it is passed a junk
-     pointer. This is the error it gives when  the  magic  number
-     isn't present.
-
-       PCRE_ERROR_UNKNOWN_NODE   (-5)
-
-     While running the pattern match, an unknown item was encoun-
-     tered in the compiled pattern. This error could be caused by
-     a bug in PCRE or by overwriting of the compiled pattern.
-
-       PCRE_ERROR_NOMEMORY       (-6)
-
-     If a pattern contains back references, but the ovector  that
-     is  passed  to pcre_exec() is not big enough to remember the
-     referenced substrings, PCRE gets a block of  memory  at  the
-     start  of  matching to use for this purpose. If the call via
-     pcre_malloc() fails, this error  is  given.  The  memory  is
-     freed at the end of matching.
-
-
-
-EXTRACTING CAPTURED SUBSTRINGS
-     Captured substrings can be accessed directly  by  using  the
-
-
-
-
-
-SunOS 5.8                 Last change:                         12
-
-
-
-     offsets returned by pcre_exec() in ovector. For convenience,
-     the functions  pcre_copy_substring(),  pcre_get_substring(),
-     and  pcre_get_substring_list()  are  provided for extracting
-     captured  substrings  as  new,   separate,   zero-terminated
-     strings.   A  substring  that  contains  a  binary  zero  is
-     correctly extracted and has a further zero added on the end,
-     but the result does not, of course, function as a C string.
-
-     The first three arguments are the same for all  three  func-
-     tions:  subject  is  the  subject string which has just been
-     successfully matched, ovector is a pointer to the vector  of
-     integer   offsets   that  was  passed  to  pcre_exec(),  and
-     stringcount is the number of substrings that  were  captured
-     by  the  match,  including  the  substring  that matched the
-     entire regular expression. This is  the  value  returned  by
-     pcre_exec  if  it  is  greater  than  zero.  If  pcre_exec()
-     returned zero, indicating that it ran out of space in  ovec-
-     tor,  the  value passed as stringcount should be the size of
-     the vector divided by three.
-
-     The functions pcre_copy_substring() and pcre_get_substring()
-     extract a single substring, whose number is given as string-
-     number. A value of zero extracts the substring that  matched
-     the entire pattern, while higher values extract the captured
-     substrings. For pcre_copy_substring(), the string is  placed
-     in  buffer,  whose  length is given by buffersize, while for
-     pcre_get_substring() a new block of memory is  obtained  via
-     pcre_malloc,  and its address is returned via stringptr. The
-     yield of the function is  the  length  of  the  string,  not
-     including the terminating zero, or one of
-
-       PCRE_ERROR_NOMEMORY       (-6)
-
-     The buffer was too small for pcre_copy_substring(),  or  the
-     attempt to get memory failed for pcre_get_substring().
-
-       PCRE_ERROR_NOSUBSTRING    (-7)
-
-     There is no substring whose number is stringnumber.
-
-     The pcre_get_substring_list() function extracts  all  avail-
-     able  substrings  and builds a list of pointers to them. All
-     this is done in a single block of memory which  is  obtained
-     via pcre_malloc. The address of the memory block is returned
-     via listptr, which is also the start of the list  of  string
-     pointers.  The  end of the list is marked by a NULL pointer.
-     The yield of the function is zero if all went well, or
-
-       PCRE_ERROR_NOMEMORY       (-6)
-
-     if the attempt to get the memory block failed.
-
-     When any of these functions encounter a  substring  that  is
-     unset, which can happen when capturing subpattern number n+1
-     matches some part of the subject, but subpattern n  has  not
-     been  used  at all, they return an empty string. This can be
-     distinguished  from  a  genuine  zero-length  substring   by
-     inspecting the appropriate offset in ovector, which is nega-
-     tive for unset substrings.
-
-     The  two  convenience  functions  pcre_free_substring()  and
-     pcre_free_substring_list()  can  be  used to free the memory
-     returned by  a  previous  call  of  pcre_get_substring()  or
-     pcre_get_substring_list(),  respectively.  They  do  nothing
-     more than call the function pointed to by  pcre_free,  which
-     of  course  could  be called directly from a C program. How-
-     ever, PCRE is used in some situations where it is linked via
-     a  special  interface  to another programming language which
-     cannot use pcre_free directly; it is for  these  cases  that
-     the functions are provided.
-
-
-
-LIMITATIONS
-     There are some size limitations in PCRE but it is hoped that
-     they will never in practice be relevant.  The maximum length
-     of a compiled pattern is 65539 (sic) bytes.  All  values  in
-     repeating  quantifiers must be less than 65536.  The maximum
-     number of capturing subpatterns is 99.  The  maximum  number
-     of  all  parenthesized subpatterns, including capturing sub-
-     patterns, assertions, and other types of subpattern, is 200.
-
-     The maximum length of a subject string is the largest  posi-
-     tive number that an integer variable can hold. However, PCRE
-     uses recursion to handle subpatterns and indefinite  repeti-
-     tion.  This  means  that the available stack space may limit
-     the size of a subject string that can be processed  by  cer-
-     tain patterns.
-
-
-
-DIFFERENCES FROM PERL
-     The differences described here  are  with  respect  to  Perl
-     5.005.
-
-     1. By default, a whitespace character is any character  that
-     the  C  library  function isspace() recognizes, though it is
-     possible to compile PCRE  with  alternative  character  type
-     tables. Normally isspace() matches space, formfeed, newline,
-     carriage return, horizontal tab, and vertical tab. Perl 5 no
-     longer  includes vertical tab in its set of whitespace char-
-     acters. The \v escape that was in the Perl documentation for
-     a long time was never in fact recognized. However, the char-
-     acter itself was treated as whitespace at least up to 5.002.
-     In 5.004 and 5.005 it does not match \s.
-
-     2. PCRE does  not  allow  repeat  quantifiers  on  lookahead
-     assertions. Perl permits them, but they do not mean what you
-     might think. For example, (?!a){3} does not assert that  the
-     next  three characters are not "a". It just asserts that the
-     next character is not "a" three times.
-
-     3. Capturing subpatterns that occur inside  negative  looka-
-     head  assertions  are  counted,  but  their  entries  in the
-     offsets vector are never set. Perl sets its numerical  vari-
-     ables  from  any  such  patterns that are matched before the
-     assertion fails to match something (thereby succeeding), but
-     only  if  the negative lookahead assertion contains just one
-     branch.
-
-     4. Though binary zero characters are supported in  the  sub-
-     ject  string,  they  are  not  allowed  in  a pattern string
-     because it is passed as a normal  C  string,  terminated  by
-     zero. The escape sequence "\0" can be used in the pattern to
-     represent a binary zero.
-
-     5. The following Perl escape sequences  are  not  supported:
-     \l,  \u,  \L,  \U,  \E, \Q. In fact these are implemented by
-     Perl's general string-handling and are not part of its  pat-
-     tern matching engine.
-
-     6. The Perl \G assertion is  not  supported  as  it  is  not
-     relevant to single pattern matches.
-
-     7. Fairly obviously, PCRE does not support the (?{code}) and
-     (?p{code})  constructions. However, there is some experimen-
-     tal support for recursive patterns using the  non-Perl  item
-     (?R).
-
-     8. There are at the time of writing some  oddities  in  Perl
-     5.005_02  concerned  with  the  settings of captured strings
-     when part of a pattern is repeated.  For  example,  matching
-     "aba"  against the pattern /^(a(b)?)+$/ sets $2 to the value
-     "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves  $2
-     unset.    However,    if   the   pattern   is   changed   to
-     /^(aa(b(b))?)+$/ then $2 (and $3) are set.
-
-     In Perl 5.004 $2 is set in both cases, and that is also true
-     of PCRE. If in the future Perl changes to a consistent state
-     that is different, PCRE may change to follow.
-
-     9. Another as yet unresolved discrepancy  is  that  in  Perl
-     5.005_02  the  pattern /^(a)?(?(1)a|b)+$/ matches the string
-     "a", whereas in PCRE it does not.  However, in both Perl and
-     PCRE /^(a)?a/ matched against "a" leaves $1 unset.
-
-     10. PCRE  provides  some  extensions  to  the  Perl  regular
-     expression facilities:
-
-     (a) Although lookbehind assertions must match  fixed  length
-     strings,  each  alternative branch of a lookbehind assertion
-     can match a different length of string. Perl 5.005  requires
-     them all to have the same length.
-
-     (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is  not
-     set,  the  $ meta- character matches only at the very end of
-     the string.
-
-     (c) If PCRE_EXTRA is set, a backslash followed by  a  letter
-     with no special meaning is faulted.
-
-     (d) If PCRE_UNGREEDY is set, the greediness of  the  repeti-
-     tion  quantifiers  is inverted, that is, by default they are
-     not greedy, but if followed by a question mark they are.
-
-     (e) PCRE_ANCHORED can be used to force a pattern to be tried
-     only at the start of the subject.
-
-     (f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY  options
-     for pcre_exec() have no Perl equivalents.
-
-     (g) The (?R) construct allows for recursive pattern matching
-     (Perl  5.6 can do this using the (?p{code}) construct, which
-     PCRE cannot of course support.)
-
-
-
-REGULAR EXPRESSION DETAILS
-     The syntax and semantics of  the  regular  expressions  sup-
-     ported  by PCRE are described below. Regular expressions are
-     also described in the Perl documentation and in a number  of
-     other  books,  some  of which have copious examples. Jeffrey
-     Friedl's  "Mastering  Regular  Expressions",  published   by
-     O'Reilly (ISBN 1-56592-257), covers them in great detail.
-
-     The description here is intended as reference documentation.
-     The basic operation of PCRE is on strings of bytes. However,
-     there is the beginnings of some support for UTF-8  character
-     strings.  To  use  this  support  you must configure PCRE to
-     include it, and then call pcre_compile() with the  PCRE_UTF8
-     option.  How  this affects the pattern matching is described
-     in the final section of this document.
-
-     A regular expression is a pattern that is matched against  a
-     subject string from left to right. Most characters stand for
-     themselves in a pattern, and match the corresponding charac-
-     ters in the subject. As a trivial example, the pattern
-
-       The quick brown fox
-
-     matches a portion of a subject string that is  identical  to
-     itself.  The  power  of  regular  expressions comes from the
-     ability to include alternatives and repetitions in the  pat-
-     tern.  These  are encoded in the pattern by the use of meta-
-     characters, which do not stand for  themselves  but  instead
-     are interpreted in some special way.
-
-     There are two different sets of meta-characters: those  that
-     are  recognized anywhere in the pattern except within square
-     brackets, and those that are recognized in square  brackets.
-     Outside square brackets, the meta-characters are as follows:
-
-       \      general escape character with several uses
-       ^      assert start of  subject  (or  line,  in  multiline
-     mode)
-       $      assert end of subject (or line, in multiline mode)
-       .      match any character except newline (by default)
-       [      start character class definition
-       |      start of alternative branch
-       (      start subpattern
-       )      end subpattern
-       ?      extends the meaning of (
-              also 0 or 1 quantifier
-              also quantifier minimizer
-       *      0 or more quantifier
-       +      1 or more quantifier
-       {      start min/max quantifier
-
-     Part of a pattern that is in square  brackets  is  called  a
-     "character  class".  In  a  character  class  the only meta-
-     characters are:
-
-       \      general escape character
-       ^      negate the class, but only if the first character
-       -      indicates character range
-       ]      terminates the character class
-
-     The following sections describe  the  use  of  each  of  the
-     meta-characters.
-
-
-
-BACKSLASH
-     The backslash character has several uses. Firstly, if it  is
-     followed  by  a  non-alphameric character, it takes away any
-     special  meaning  that  character  may  have.  This  use  of
-     backslash  as  an  escape  character applies both inside and
-     outside character classes.
-
-     For example, if you want to match a "*" character, you write
-     "\*" in the pattern. This applies whether or not the follow-
-     ing character would otherwise  be  interpreted  as  a  meta-
-     character,  so it is always safe to precede a non-alphameric
-     with "\" to specify that it stands for itself.  In  particu-
-     lar, if you want to match a backslash, you write "\\".
-
-     If a pattern is compiled with the PCRE_EXTENDED option, whi-
-     tespace in the pattern (other than in a character class) and
-     characters between a "#" outside a character class  and  the
-     next  newline  character  are ignored. An escaping backslash
-     can be used to include a whitespace or "#" character as part
-     of the pattern.
-
-     A second use of backslash provides a way  of  encoding  non-
-     printing  characters  in patterns in a visible manner. There
-     is no restriction on the appearance of non-printing  charac-
-     ters,  apart from the binary zero that terminates a pattern,
-     but when a pattern is being prepared by text editing, it  is
-     usually  easier to use one of the following escape sequences
-     than the binary character it represents:
-
-       \a     alarm, that is, the BEL character (hex 07)
-       \cx    "control-x", where x is any character
-       \e     escape (hex 1B)
-       \f     formfeed (hex 0C)
-       \n     newline (hex 0A)
-       \r     carriage return (hex 0D)
-       \t     tab (hex 09)
-       \xhh   character with hex code hh
-       \ddd   character with octal code ddd, or backreference
-
-     The precise effect of "\cx" is as follows: if "x" is a lower
-     case  letter,  it  is converted to upper case. Then bit 6 of
-     the character (hex 40) is inverted.  Thus "\cz" becomes  hex
-     1A, but "\c{" becomes hex 3B, while "\c;" becomes hex 7B.
-
-     After "\x", up to two hexadecimal digits are  read  (letters
-     can be in upper or lower case).
-
-     After "\0" up to two further octal digits are read. In  both
-     cases,  if  there are fewer than two digits, just those that
-     are present are used. Thus the sequence "\0\x\07"  specifies
-     two binary zeros followed by a BEL character.  Make sure you
-     supply two digits after the initial zero  if  the  character
-     that follows is itself an octal digit.
-
-     The handling of a backslash followed by a digit other than 0
-     is  complicated.   Outside  a character class, PCRE reads it
-     and any following digits as a decimal number. If the  number
-     is  less  than  10, or if there have been at least that many
-     previous capturing left parentheses in the  expression,  the
-     entire  sequence is taken as a back reference. A description
-     of how this works is given later, following  the  discussion
-     of parenthesized subpatterns.
-
-     Inside a character  class,  or  if  the  decimal  number  is
-     greater  than  9 and there have not been that many capturing
-     subpatterns, PCRE re-reads up to three octal digits  follow-
-     ing  the  backslash,  and  generates  a single byte from the
-     least significant 8 bits of the value. Any subsequent digits
-     stand for themselves.  For example:
-
-       \040   is another way of writing a space
-       \40    is the same, provided there are fewer than 40
-                 previous capturing subpatterns
-       \7     is always a back reference
-       \11    might be a back reference, or another way of
-                 writing a tab
-       \011   is always a tab
-       \0113  is a tab followed by the character "3"
-       \113   is the character with octal code 113 (since there
-                 can be no more than 99 back references)
-       \377   is a byte consisting entirely of 1 bits
-       \81    is either a back reference, or a binary zero
-                 followed by the two characters "8" and "1"
-
-     Note that octal values of 100 or greater must not be  intro-
-     duced  by  a  leading zero, because no more than three octal
-     digits are ever read.
-
-     All the sequences that define a single  byte  value  can  be
-     used both inside and outside character classes. In addition,
-     inside a character class, the sequence "\b"  is  interpreted
-     as  the  backspace  character  (hex 08). Outside a character
-     class it has a different meaning (see below).
-
-     The third use of backslash is for specifying generic charac-
-     ter types:
-
-       \d     any decimal digit
-       \D     any character that is not a decimal digit
-       \s     any whitespace character
-       \S     any character that is not a whitespace character
-       \w     any "word" character
-       \W     any "non-word" character
-
-     Each pair of escape sequences partitions the complete set of
-     characters  into  two  disjoint  sets.  Any  given character
-     matches one, and only one, of each pair.
-
-     A "word" character is any letter or digit or the  underscore
-     character,  that  is,  any  character which can be part of a
-     Perl "word". The definition of letters and  digits  is  con-
-     trolled  by PCRE's character tables, and may vary if locale-
-     specific matching is  taking  place  (see  "Locale  support"
-     above). For example, in the "fr" (French) locale, some char-
-     acter codes greater than 128 are used for accented  letters,
-     and these are matched by \w.
-
-     These character type sequences can appear  both  inside  and
-     outside  character classes. They each match one character of
-     the appropriate type. If the current matching  point  is  at
-     the end of the subject string, all of them fail, since there
-     is no character to match.
-
-     The fourth use of backslash is  for  certain  simple  asser-
-     tions. An assertion specifies a condition that has to be met
-     at a particular point in  a  match,  without  consuming  any
-     characters  from  the subject string. The use of subpatterns
-     for more complicated  assertions  is  described  below.  The
-     backslashed assertions are
-
-       \b     word boundary
-       \B     not a word boundary
-       \A     start of subject (independent of multiline mode)
-       \Z     end of subject or newline at  end  (independent  of
-     multiline mode)
-       \z     end of subject (independent of multiline mode)
-
-     These assertions may not appear in  character  classes  (but
-     note that "\b" has a different meaning, namely the backspace
-     character, inside a character class).
-
-     A word boundary is a position in the  subject  string  where
-     the current character and the previous character do not both
-     match \w or \W (i.e. one matches \w and  the  other  matches
-     \W),  or the start or end of the string if the first or last
-     character matches \w, respectively.
-
-     The \A, \Z, and \z assertions differ  from  the  traditional
-     circumflex  and  dollar  (described below) in that they only
-     ever match at the very start and end of the subject  string,
-     whatever  options  are  set.  They  are  not affected by the
-     PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argu-
-     ment  of  pcre_exec()  is  non-zero, \A can never match. The
-     difference between \Z and \z is that  \Z  matches  before  a
-     newline  that is the last character of the string as well as
-     at the end of the string, whereas \z  matches  only  at  the
-     end.
-
-
-
-CIRCUMFLEX AND DOLLAR
-     Outside a character class, in the default matching mode, the
-     circumflex  character  is an assertion which is true only if
-     the current matching point is at the start  of  the  subject
-
-     string.  If  the startoffset argument of pcre_exec() is non-
-     zero, circumflex can never match. Inside a character  class,
-     circumflex has an entirely different meaning (see below).
-
-     Circumflex need not be the first character of the pattern if
-     a  number of alternatives are involved, but it should be the
-     first thing in each alternative in which it appears  if  the
-     pattern is ever to match that branch. If all possible alter-
-     natives start with a circumflex, that is, if the pattern  is
-     constrained to match only at the start of the subject, it is
-     said to be an "anchored" pattern. (There are also other con-
-     structs that can cause a pattern to be anchored.)
-
-     A dollar character is an assertion which is true only if the
-     current  matching point is at the end of the subject string,
-     or immediately before a newline character that is  the  last
-     character in the string (by default). Dollar need not be the
-     last character of the pattern if a  number  of  alternatives
-     are  involved,  but it should be the last item in any branch
-     in which it appears.  Dollar has no  special  meaning  in  a
-     character class.
-
-     The meaning of dollar can be changed so that it matches only
-     at   the   very   end   of   the   string,  by  setting  the
-     PCRE_DOLLAR_ENDONLY option at compile or matching time. This
-     does not affect the \Z assertion.
-
-     The meanings of the circumflex  and  dollar  characters  are
-     changed  if  the  PCRE_MULTILINE option is set. When this is
-     the case,  they  match  immediately  after  and  immediately
-     before an internal "\n" character, respectively, in addition
-     to matching at the start and end of the subject string.  For
-     example,  the  pattern  /^abc$/  matches  the subject string
-     "def\nabc" in multiline  mode,  but  not  otherwise.  Conse-
-     quently,  patterns  that  are  anchored  in single line mode
-     because all branches start with "^" are not anchored in mul-
-     tiline mode, and a match for circumflex is possible when the
-     startoffset  argument  of  pcre_exec()  is   non-zero.   The
-     PCRE_DOLLAR_ENDONLY  option  is ignored if PCRE_MULTILINE is
-     set.
-
-     Note that the sequences \A, \Z, and \z can be used to  match
-     the  start  and end of the subject in both modes, and if all
-     branches of a pattern start with \A is it  always  anchored,
-     whether PCRE_MULTILINE is set or not.
-
-
-
-FULL STOP (PERIOD, DOT)
-     Outside a character class, a dot in the pattern matches  any
-     one character in the subject, including a non-printing char-
-     acter, but not (by default)  newline.   If  the  PCRE_DOTALL
-
-     option  is set, dots match newlines as well. The handling of
-     dot is entirely independent of the  handling  of  circumflex
-     and  dollar,  the  only  relationship  being  that they both
-     involve newline characters. Dot has no special meaning in  a
-     character class.
-
-
-
-SQUARE BRACKETS
-     An opening square bracket introduces a character class, ter-
-     minated  by  a  closing  square  bracket.  A  closing square
-     bracket on its own is  not  special.  If  a  closing  square
-     bracket  is  required as a member of the class, it should be
-     the first data character in the class (after an initial cir-
-     cumflex, if present) or escaped with a backslash.
-
-     A character class matches a single character in the subject;
-     the  character  must  be in the set of characters defined by
-     the class, unless the first character in the class is a cir-
-     cumflex,  in which case the subject character must not be in
-     the set defined by the class. If a  circumflex  is  actually
-     required  as  a  member  of  the class, ensure it is not the
-     first character, or escape it with a backslash.
-
-     For example, the character class [aeiou] matches  any  lower
-     case vowel, while [^aeiou] matches any character that is not
-     a lower case vowel. Note that a circumflex is  just  a  con-
-     venient  notation for specifying the characters which are in
-     the class by enumerating those that are not. It  is  not  an
-     assertion:  it  still  consumes a character from the subject
-     string, and fails if the current pointer is at  the  end  of
-     the string.
-
-     When caseless matching  is  set,  any  letters  in  a  class
-     represent  both their upper case and lower case versions, so
-     for example, a caseless [aeiou] matches "A" as well as  "a",
-     and  a caseless [^aeiou] does not match "A", whereas a case-
-     ful version would.
-
-     The newline character is never treated in any special way in
-     character  classes,  whatever the setting of the PCRE_DOTALL
-     or PCRE_MULTILINE options is. A  class  such  as  [^a]  will
-     always match a newline.
-
-     The minus (hyphen) character can be used to specify a  range
-     of  characters  in  a  character  class.  For example, [d-m]
-     matches any letter between d and m, inclusive.  If  a  minus
-     character  is required in a class, it must be escaped with a
-     backslash or appear in a position where it cannot be  inter-
-     preted as indicating a range, typically as the first or last
-     character in the class.
-
-     It is not possible to have the literal character "]" as  the
-     end  character  of  a  range.  A  pattern such as [W-]46] is
-     interpreted as a class of two characters ("W" and "-")  fol-
-     lowed by a literal string "46]", so it would match "W46]" or
-     "-46]". However, if the "]" is escaped with a  backslash  it
-     is  interpreted  as  the end of range, so [W-\]46] is inter-
-     preted as a single class containing a range followed by  two
-     separate characters. The octal or hexadecimal representation
-     of "]" can also be used to end a range.
-
-     Ranges operate in ASCII collating sequence. They can also be
-     used  for  characters  specified  numerically,  for  example
-     [\000-\037]. If a range that includes letters is  used  when
-     caseless  matching  is set, it matches the letters in either
-     case. For example, [W-c] is equivalent  to  [][\^_`wxyzabc],
-     matched  caselessly,  and  if  character tables for the "fr"
-     locale are in use, [\xc8-\xcb] matches accented E characters
-     in both cases.
-
-     The character types \d, \D, \s, \S,  \w,  and  \W  may  also
-     appear  in  a  character  class, and add the characters that
-     they match to the class. For example, [\dABCDEF] matches any
-     hexadecimal  digit.  A  circumflex  can conveniently be used
-     with the upper case character types to specify a  more  res-
-     tricted set of characters than the matching lower case type.
-     For example, the class [^\W_] matches any letter  or  digit,
-     but not underscore.
-
-     All non-alphameric characters other than \,  -,  ^  (at  the
-     start)  and  the  terminating ] are non-special in character
-     classes, but it does no harm if they are escaped.
-
-
-
-POSIX CHARACTER CLASSES
-     Perl 5.6 (not yet released at the time of writing) is  going
-     to  support  the POSIX notation for character classes, which
-     uses names enclosed by  [:  and  :]   within  the  enclosing
-     square brackets. PCRE supports this notation. For example,
-
-       [01[:alpha:]%]
-
-     matches "0", "1", any alphabetic character, or "%". The sup-
-     ported class names are
-
-       alnum    letters and digits
-       alpha    letters
-       ascii    character codes 0 - 127
-       cntrl    control characters
-       digit    decimal digits (same as \d)
-       graph    printing characters, excluding space
-       lower    lower case letters
-       print    printing characters, including space
-       punct    printing characters, excluding letters and digits
-       space    white space (same as \s)
-       upper    upper case letters
-       word     "word" characters (same as \w)
-       xdigit   hexadecimal digits
-
-     The names "ascii" and "word" are  Perl  extensions.  Another
-     Perl  extension is negation, which is indicated by a ^ char-
-     acter after the colon. For example,
-
-       [12[:^digit:]]
-
-     matches "1", "2", or any non-digit.  PCRE  (and  Perl)  also
-     recogize  the POSIX syntax [.ch.] and [=ch=] where "ch" is a
-     "collating element", but these are  not  supported,  and  an
-     error is given if they are encountered.
-
-
-
-VERTICAL BAR
-     Vertical bar characters are  used  to  separate  alternative
-     patterns. For example, the pattern
-
-       gilbert|sullivan
-
-     matches either "gilbert" or "sullivan". Any number of alter-
-     natives  may  appear,  and an empty alternative is permitted
-     (matching the empty string).   The  matching  process  tries
-     each  alternative in turn, from left to right, and the first
-     one that succeeds is used. If the alternatives are within  a
-     subpattern  (defined  below),  "succeeds" means matching the
-     rest of the main pattern as well as the alternative  in  the
-     subpattern.
-
-
-
-INTERNAL OPTION SETTING
-     The settings of PCRE_CASELESS, PCRE_MULTILINE,  PCRE_DOTALL,
-     and  PCRE_EXTENDED can be changed from within the pattern by
-     a sequence of Perl option letters enclosed between "(?"  and
-     ")". The option letters are
-
-       i  for PCRE_CASELESS
-       m  for PCRE_MULTILINE
-       s  for PCRE_DOTALL
-       x  for PCRE_EXTENDED
-
-     For example, (?im) sets caseless, multiline matching. It  is
-     also possible to unset these options by preceding the letter
-     with a hyphen, and a combined setting and unsetting such  as
-     (?im-sx),  which sets PCRE_CASELESS and PCRE_MULTILINE while
-     unsetting PCRE_DOTALL and PCRE_EXTENDED, is also  permitted.
-     If  a  letter  appears both before and after the hyphen, the
-     option is unset.
-
-     The scope of these option changes depends on  where  in  the
-     pattern  the  setting  occurs. For settings that are outside
-     any subpattern (defined below), the effect is the same as if
-     the  options were set or unset at the start of matching. The
-     following patterns all behave in exactly the same way:
-
-       (?i)abc
-       a(?i)bc
-       ab(?i)c
-       abc(?i)
-
-     which in turn is the same as compiling the pattern abc  with
-     PCRE_CASELESS  set.   In  other words, such "top level" set-
-     tings apply to the whole pattern  (unless  there  are  other
-     changes  inside subpatterns). If there is more than one set-
-     ting of the same option at top level, the rightmost  setting
-     is used.
-
-     If an option change occurs inside a subpattern,  the  effect
-     is  different.  This is a change of behaviour in Perl 5.005.
-     An option change inside a subpattern affects only that  part
-     of the subpattern that follows it, so
-
-       (a(?i)b)c
-
-     matches  abc  and  aBc  and  no  other   strings   (assuming
-     PCRE_CASELESS  is  not used).  By this means, options can be
-     made to have different settings in different  parts  of  the
-     pattern.  Any  changes  made  in one alternative do carry on
-     into subsequent branches within  the  same  subpattern.  For
-     example,
-
-       (a(?i)b|c)
-
-     matches "ab", "aB", "c", and "C", even though when  matching
-     "C" the first branch is abandoned before the option setting.
-     This is because the effects of  option  settings  happen  at
-     compile  time. There would be some very weird behaviour oth-
-     erwise.
-
-     The PCRE-specific options PCRE_UNGREEDY and  PCRE_EXTRA  can
-     be changed in the same way as the Perl-compatible options by
-     using the characters U and X  respectively.  The  (?X)  flag
-     setting  is  special in that it must always occur earlier in
-     the pattern than any of the additional features it turns on,
-     even when it is at top level. It is best put at the start.
-
-
-
-SUBPATTERNS
-     Subpatterns are delimited by parentheses  (round  brackets),
-     which can be nested.  Marking part of a pattern as a subpat-
-     tern does two things:
-
-     1. It localizes a set of alternatives. For example, the pat-
-     tern
-
-       cat(aract|erpillar|)
-
-     matches one of the words "cat",  "cataract",  or  "caterpil-
-     lar".  Without  the  parentheses, it would match "cataract",
-     "erpillar" or the empty string.
-
-     2. It sets up the subpattern as a capturing  subpattern  (as
-     defined  above).   When the whole pattern matches, that por-
-     tion of the subject string that matched  the  subpattern  is
-     passed  back  to  the  caller  via  the  ovector argument of
-     pcre_exec(). Opening parentheses are counted  from  left  to
-     right (starting from 1) to obtain the numbers of the captur-
-     ing subpatterns.
-
-     For example, if the string "the red king" is matched against
-     the pattern
-
-       the ((red|white) (king|queen))
-
-     the captured substrings are "red king", "red",  and  "king",
-     and are numbered 1, 2, and 3.
-
-     The fact that plain parentheses fulfil two functions is  not
-     always  helpful.  There are often times when a grouping sub-
-     pattern is required without a capturing requirement.  If  an
-     opening parenthesis is followed by "?:", the subpattern does
-     not do any capturing, and is not counted when computing  the
-     number of any subsequent capturing subpatterns. For example,
-     if the string "the white queen" is matched against the  pat-
-     tern
-
-       the ((?:red|white) (king|queen))
-
-     the captured substrings are "white queen" and  "queen",  and
-     are  numbered  1  and 2. The maximum number of captured sub-
-     strings is 99, and the maximum number  of  all  subpatterns,
-     both capturing and non-capturing, is 200.
-
-     As a  convenient  shorthand,  if  any  option  settings  are
-     required  at  the  start  of a non-capturing subpattern, the
-     option letters may appear between the "?" and the ":".  Thus
-     the two patterns
-
-       (?i:saturday|sunday)
-       (?:(?i)saturday|sunday)
-
-     match exactly the same set of strings.  Because  alternative
-     branches  are  tried from left to right, and options are not
-     reset until the end of the subpattern is reached, an  option
-     setting  in  one  branch does affect subsequent branches, so
-     the above patterns match "SUNDAY" as well as "Saturday".
-
-
-
-REPETITION
-     Repetition is specified by quantifiers, which can follow any
-     of the following items:
-
-       a single character, possibly escaped
-       the . metacharacter
-       a character class
-       a back reference (see next section)
-       a parenthesized subpattern (unless it is  an  assertion  -
-     see below)
-
-     The general repetition quantifier specifies  a  minimum  and
-     maximum  number  of  permitted  matches,  by  giving the two
-     numbers in curly brackets (braces), separated  by  a  comma.
-     The  numbers  must be less than 65536, and the first must be
-     less than or equal to the second. For example:
-
-       z{2,4}
-
-     matches "zz", "zzz", or "zzzz". A closing brace on  its  own
-     is not a special character. If the second number is omitted,
-     but the comma is present, there is no upper  limit;  if  the
-     second number and the comma are both omitted, the quantifier
-     specifies an exact number of required matches. Thus
-
-       [aeiou]{3,}
-
-     matches at least 3 successive vowels,  but  may  match  many
-     more, while
-
-       \d{8}
-
-     matches exactly 8 digits.  An  opening  curly  bracket  that
-     appears  in a position where a quantifier is not allowed, or
-     one that does not match the syntax of a quantifier, is taken
-     as  a literal character. For example, {,6} is not a quantif-
-     ier, but a literal string of four characters.
-
-     The quantifier {0} is permitted, causing the  expression  to
-     behave  as  if the previous item and the quantifier were not
-     present.
-
-     For convenience (and  historical  compatibility)  the  three
-     most common quantifiers have single-character abbreviations:
-
-       *    is equivalent to {0,}
-       +    is equivalent to {1,}
-       ?    is equivalent to {0,1}
-
-     It is possible to construct infinite loops  by  following  a
-     subpattern  that  can  match no characters with a quantifier
-     that has no upper limit, for example:
-
-       (a?)*
-
-     Earlier versions of Perl and PCRE used to give an  error  at
-     compile  time  for such patterns. However, because there are
-     cases where this  can  be  useful,  such  patterns  are  now
-     accepted,  but  if  any repetition of the subpattern does in
-     fact match no characters, the loop is forcibly broken.
-
-     By default, the quantifiers  are  "greedy",  that  is,  they
-     match  as much as possible (up to the maximum number of per-
-     mitted times), without causing the rest of  the  pattern  to
-     fail. The classic example of where this gives problems is in
-     trying to match comments in C programs. These appear between
-     the  sequences /* and */ and within the sequence, individual
-     * and / characters may appear. An attempt to  match  C  com-
-     ments by applying the pattern
-
-       /\*.*\*/
-
-     to the string
-
-       /* first command */  not comment  /* second comment */
-
-     fails, because it matches the entire  string  owing  to  the
-     greediness of the .*  item.
-
-     However, if a quantifier is followed by a question mark,  it
-     ceases  to be greedy, and instead matches the minimum number
-     of times possible, so the pattern
-
-       /\*.*?\*/
-
-     does the right thing with the C comments. The meaning of the
-     various  quantifiers is not otherwise changed, just the pre-
-     ferred number of matches.  Do not confuse this use of  ques-
-     tion  mark  with  its  use as a quantifier in its own right.
-     Because it has two uses, it can sometimes appear doubled, as
-     in
-
-       \d??\d
-
-     which matches one digit by preference, but can match two  if
-     that is the only way the rest of the pattern matches.
-
-     If the PCRE_UNGREEDY option is set (an option which  is  not
-     available  in  Perl),  the  quantifiers  are  not  greedy by
-     default, but individual ones can be made greedy by following
-     them  with  a  question mark. In other words, it inverts the
-     default behaviour.
-
-     When a parenthesized subpattern is quantified with a minimum
-     repeat  count  that is greater than 1 or with a limited max-
-     imum, more store is required for the  compiled  pattern,  in
-     proportion to the size of the minimum or maximum.
-
-     If a pattern starts with .* or  .{0,}  and  the  PCRE_DOTALL
-     option (equivalent to Perl's /s) is set, thus allowing the .
-     to match  newlines,  the  pattern  is  implicitly  anchored,
-     because whatever follows will be tried against every charac-
-     ter position in the subject string, so there is no point  in
-     retrying  the overall match at any position after the first.
-     PCRE treats such a pattern as though it were preceded by \A.
-     In  cases where it is known that the subject string contains
-     no newlines, it is worth setting PCRE_DOTALL when  the  pat-
-     tern begins with .* in order to obtain this optimization, or
-     alternatively using ^ to indicate anchoring explicitly.
-
-     When a capturing subpattern is repeated, the value  captured
-     is the substring that matched the final iteration. For exam-
-     ple, after
-
-       (tweedle[dume]{3}\s*)+
-
-     has matched "tweedledum tweedledee" the value  of  the  cap-
-     tured  substring  is  "tweedledee".  However,  if  there are
-     nested capturing  subpatterns,  the  corresponding  captured
-     values  may  have been set in previous iterations. For exam-
-     ple, after
-
-       /(a|(b))+/
-
-     matches "aba" the value of the second captured substring  is
-     "b".
-
-
-
-BACK REFERENCES
-     Outside a character class, a backslash followed by  a  digit
-     greater  than  0  (and  possibly  further  digits) is a back
-     reference to a capturing subpattern  earlier  (i.e.  to  its
-     left)  in  the  pattern,  provided there have been that many
-     previous capturing left parentheses.
-
-     However, if the decimal number following  the  backslash  is
-     less  than  10,  it is always taken as a back reference, and
-     causes an error only if there are not  that  many  capturing
-     left  parentheses in the entire pattern. In other words, the
-     parentheses that are referenced need not be to the  left  of
-     the  reference  for  numbers  less  than 10. See the section
-     entitled "Backslash" above for further details of  the  han-
-     dling of digits following a backslash.
-
-     A back reference matches whatever actually matched the  cap-
-     turing subpattern in the current subject string, rather than
-     anything matching the subpattern itself. So the pattern
-
-       (sens|respons)e and \1ibility
-
-     matches "sense and sensibility" and "response and  responsi-
-     bility",  but  not  "sense  and  responsibility". If caseful
-     matching is in force at the time of the back reference,  the
-     case of letters is relevant. For example,
-
-       ((?i)rah)\s+\1
-
-     matches "rah rah" and "RAH RAH", but  not  "RAH  rah",  even
-     though  the  original  capturing subpattern is matched case-
-     lessly.
-
-     There may be more than one back reference to the  same  sub-
-     pattern.  If  a  subpattern  has not actually been used in a
-     particular match, any back references to it always fail. For
-     example, the pattern
-
-       (a|(bc))\2
-
-     always fails if it starts to match  "a"  rather  than  "bc".
-     Because  there  may  be up to 99 back references, all digits
-     following the backslash are taken as  part  of  a  potential
-     back reference number. If the pattern continues with a digit
-     character, some delimiter must be used to terminate the back
-     reference.   If the PCRE_EXTENDED option is set, this can be
-     whitespace. Otherwise an empty comment can be used.
-
-     A back reference that occurs inside the parentheses to which
-     it  refers  fails when the subpattern is first used, so, for
-     example, (a\1) never matches.  However, such references  can
-     be useful inside repeated subpatterns. For example, the pat-
-     tern
-
-       (a|b\1)+
-
-     matches any number of "a"s and also "aba", "ababbaa" etc. At
-     each iteration of the subpattern, the back reference matches
-     the  character  string   corresponding   to   the   previous
-     iteration.  In  order  for this to work, the pattern must be
-     such that the first iteration does not  need  to  match  the
-     back  reference.  This  can be done using alternation, as in
-     the example above, or by a  quantifier  with  a  minimum  of
-     zero.
-
-
-
-ASSERTIONS
-     An assertion is  a  test  on  the  characters  following  or
-     preceding  the current matching point that does not actually
-     consume any characters. The simple assertions coded  as  \b,
-     \B,  \A,  \Z,  \z, ^ and $ are described above. More compli-
-     cated assertions are coded as  subpatterns.  There  are  two
-     kinds:  those that look ahead of the current position in the
-     subject string, and those that look behind it.
-
-     An assertion subpattern is matched in the normal way, except
-     that  it  does not cause the current matching position to be
-     changed. Lookahead assertions start with  (?=  for  positive
-     assertions and (?! for negative assertions. For example,
-
-       \w+(?=;)
-
-     matches a word followed by a semicolon, but does not include
-     the semicolon in the match, and
-
-       foo(?!bar)
-
-     matches any occurrence of "foo"  that  is  not  followed  by
-     "bar". Note that the apparently similar pattern
-
-       (?!foo)bar
-
-     does not find an occurrence of "bar"  that  is  preceded  by
-     something other than "foo"; it finds any occurrence of "bar"
-     whatsoever, because the assertion  (?!foo)  is  always  true
-     when  the  next  three  characters  are  "bar". A lookbehind
-     assertion is needed to achieve this effect.
-
-     Lookbehind assertions start with (?<=  for  positive  asser-
-     tions and (?<! for negative assertions. For example,
-
-       (?<!foo)bar
-
-     does find an occurrence of "bar" that  is  not  preceded  by
-     "foo". The contents of a lookbehind assertion are restricted
-     such that all the strings  it  matches  must  have  a  fixed
-     length.  However, if there are several alternatives, they do
-     not all have to have the same fixed length. Thus
-
-       (?<=bullock|donkey)
-
-     is permitted, but
-
-       (?<!dogs?|cats?)
-
-     causes an error at compile time. Branches  that  match  dif-
-     ferent length strings are permitted only at the top level of
-     a lookbehind assertion. This is an extension  compared  with
-     Perl  5.005,  which  requires all branches to match the same
-     length of string. An assertion such as
-
-       (?<=ab(c|de))
-
-     is not permitted, because its single  top-level  branch  can
-     match two different lengths, but it is acceptable if rewrit-
-     ten to use two top-level branches:
-
-       (?<=abc|abde)
-
-     The implementation of lookbehind  assertions  is,  for  each
-     alternative,  to  temporarily move the current position back
-     by the fixed width and then  try  to  match.  If  there  are
-     insufficient  characters  before  the  current position, the
-     match is deemed to fail.  Lookbehinds  in  conjunction  with
-     once-only  subpatterns can be particularly useful for match-
-     ing at the ends of strings; an example is given at  the  end
-     of the section on once-only subpatterns.
-
-     Several assertions (of any sort) may  occur  in  succession.
-     For example,
-
-       (?<=\d{3})(?<!999)foo
-
-     matches "foo" preceded by three digits that are  not  "999".
-     Notice  that each of the assertions is applied independently
-     at the same point in the subject string. First  there  is  a
-     check that the previous three characters are all digits, and
-     then there is a check that the same three characters are not
-     "999".   This  pattern  does not match "foo" preceded by six
-     characters, the first of which are digits and the last three
-     of  which  are  not  "999".  For  example,  it doesn't match
-     "123abcfoo". A pattern to do that is
-
-       (?<=\d{3}...)(?<!999)foo
-
-     This time the first assertion looks  at  the  preceding  six
-     characters,  checking  that  the first three are digits, and
-     then the second assertion checks that  the  preceding  three
-     characters are not "999".
-
-     Assertions can be nested in any combination. For example,
-
-       (?<=(?<!foo)bar)baz
-
-     matches an occurrence of "baz" that  is  preceded  by  "bar"
-     which in turn is not preceded by "foo", while
-
-       (?<=\d{3}(?!999)...)foo
-
-     is another pattern which matches  "foo"  preceded  by  three
-     digits and any three characters that are not "999".
-
-     Assertion subpatterns are not capturing subpatterns, and may
-     not  be  repeated,  because  it makes no sense to assert the
-     same thing several times. If any kind of assertion  contains
-     capturing  subpatterns  within it, these are counted for the
-     purposes of numbering the capturing subpatterns in the whole
-     pattern.   However,  substring capturing is carried out only
-     for positive assertions, because it does not make sense  for
-     negative assertions.
-
-     Assertions count towards the maximum  of  200  parenthesized
-     subpatterns.
-
-
-
-ONCE-ONLY SUBPATTERNS
-     With both maximizing and minimizing repetition,  failure  of
-     what  follows  normally  causes  the repeated item to be re-
-     evaluated to see if a different number of repeats allows the
-     rest  of  the  pattern  to  match. Sometimes it is useful to
-     prevent this, either to change the nature of the  match,  or
-     to  cause  it fail earlier than it otherwise might, when the
-     author of the pattern knows there is no  point  in  carrying
-     on.
-
-     Consider, for example, the pattern \d+foo  when  applied  to
-     the subject line
-
-       123456bar
-
-     After matching all 6 digits and then failing to match "foo",
-     the normal action of the matcher is to try again with only 5
-     digits matching the \d+ item, and then with 4,  and  so  on,
-     before ultimately failing. Once-only subpatterns provide the
-     means for specifying that once a portion of the pattern  has
-     matched,  it  is  not to be re-evaluated in this way, so the
-     matcher would give up immediately on failing to match  "foo"
-     the  first  time.  The  notation  is another kind of special
-     parenthesis, starting with (?> as in this example:
-
-       (?>\d+)bar
-
-     This kind of parenthesis "locks up" the  part of the pattern
-     it  contains once it has matched, and a failure further into
-     the  pattern  is  prevented  from  backtracking   into   it.
-     Backtracking  past  it  to previous items, however, works as
-     normal.
-
-     An alternative description is that a subpattern of this type
-     matches  the  string  of  characters that an identical stan-
-     dalone pattern would match, if anchored at the current point
-     in the subject string.
-
-     Once-only subpatterns are not capturing subpatterns.  Simple
-     cases  such as the above example can be thought of as a max-
-     imizing repeat that must  swallow  everything  it  can.  So,
-     while both \d+ and \d+? are prepared to adjust the number of
-     digits they match in order to make the rest of  the  pattern
-     match, (?>\d+) can only match an entire sequence of digits.
-
-     This construction can of course contain arbitrarily  compli-
-     cated subpatterns, and it can be nested.
-
-     Once-only subpatterns can be used in conjunction with  look-
-     behind  assertions  to specify efficient matching at the end
-     of the subject string. Consider a simple pattern such as
-
-       abcd$
-
-     when applied to a long string which does not match.  Because
-     matching  proceeds  from  left  to right, PCRE will look for
-     each "a" in the subject and then see if what follows matches
-     the rest of the pattern. If the pattern is specified as
-
-       ^.*abcd$
-
-     the initial .* matches the entire string at first, but  when
-     this  fails  (because  there  is no following "a"), it back-
-     tracks to match all but the last character, then all but the
-     last  two  characters,  and so on. Once again the search for
-     "a" covers the entire string, from right to left, so we  are
-     no better off. However, if the pattern is written as
-
-       ^(?>.*)(?<=abcd)
-
-     there can be no backtracking for the .* item; it  can  match
-     only  the entire string. The subsequent lookbehind assertion
-     does a single test on the last four characters. If it fails,
-     the match fails immediately. For long strings, this approach
-     makes a significant difference to the processing time.
-
-     When a pattern contains an unlimited repeat inside a subpat-
-     tern  that  can  itself  be  repeated an unlimited number of
-     times, the use of a once-only subpattern is the only way  to
-     avoid  some  failing matches taking a very long time indeed.
-     The pattern
-
-       (\D+|<\d+>)*[!?]
-
-     matches an unlimited number of substrings that  either  con-
-     sist  of  non-digits,  or digits enclosed in <>, followed by
-     either ! or ?. When it matches, it runs quickly. However, if
-     it is applied to
-
-       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
-     it takes a long  time  before  reporting  failure.  This  is
-     because the string can be divided between the two repeats in
-     a large number of ways, and all have to be tried. (The exam-
-     ple  used  [!?]  rather  than a single character at the end,
-     because both PCRE and Perl have an optimization that  allows
-     for  fast  failure  when  a  single  character is used. They
-     remember the last single character that is  required  for  a
-     match,  and  fail early if it is not present in the string.)
-     If the pattern is changed to
-
-       ((?>\D+)|<\d+>)*[!?]
-
-     sequences of non-digits cannot be broken, and  failure  hap-
-     pens quickly.
-
-
-
-CONDITIONAL SUBPATTERNS
-     It is possible to cause the matching process to obey a  sub-
-     pattern  conditionally  or to choose between two alternative
-     subpatterns, depending on the result  of  an  assertion,  or
-     whether  a previous capturing subpattern matched or not. The
-     two possible forms of conditional subpattern are
-
-       (?(condition)yes-pattern)
-       (?(condition)yes-pattern|no-pattern)
-
-     If the condition is satisfied, the yes-pattern is used; oth-
-     erwise  the  no-pattern  (if  present) is used. If there are
-     more than two alternatives in the subpattern, a compile-time
-     error occurs.
-
-     There are two kinds of condition. If the  text  between  the
-     parentheses  consists of a sequence of digits, the condition
-     is satisfied if the capturing subpattern of that number  has
-     previously  matched.  The  number must be greater than zero.
-     Consider  the  following  pattern,   which   contains   non-
-     significant white space to make it more readable (assume the
-     PCRE_EXTENDED option) and to divide it into three parts  for
-     ease of discussion:
-
-       ( \( )?    [^()]+    (?(1) \) )
-
-     The first part matches an optional opening parenthesis,  and
-     if  that character is present, sets it as the first captured
-     substring. The second part matches one  or  more  characters
-     that  are  not  parentheses. The third part is a conditional
-     subpattern that tests whether the first set  of  parentheses
-     matched  or  not.  If  they did, that is, if subject started
-     with an opening parenthesis, the condition is true,  and  so
-     the  yes-pattern  is  executed  and a closing parenthesis is
-     required. Otherwise, since no-pattern is  not  present,  the
-     subpattern  matches  nothing.  In  other words, this pattern
-     matches a sequence of non-parentheses,  optionally  enclosed
-     in parentheses.
-
-     If the condition is not a sequence of digits, it must be  an
-     assertion.  This  may be a positive or negative lookahead or
-     lookbehind assertion. Consider this pattern, again  contain-
-     ing  non-significant  white space, and with the two alterna-
-     tives on the second line:
-
-       (?(?=[^a-z]*[a-z])
-       \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
-
-     The condition is a positive lookahead assertion that matches
-     an optional sequence of non-letters followed by a letter. In
-     other words, it tests for  the  presence  of  at  least  one
-     letter  in the subject. If a letter is found, the subject is
-     matched against  the  first  alternative;  otherwise  it  is
-     matched  against the second. This pattern matches strings in
-     one of the two forms dd-aaa-dd or dd-dd-dd,  where  aaa  are
-     letters and dd are digits.
-
-
-
-COMMENTS
-     The sequence (?# marks the start of a comment which  contin-
-     ues  up  to the next closing parenthesis. Nested parentheses
-     are not permitted. The characters that  make  up  a  comment
-     play no part in the pattern matching at all.
-
-     If the PCRE_EXTENDED option is set, an unescaped # character
-     outside  a character class introduces a comment that contin-
-     ues up to the next newline character in the pattern.
-
-
-
-RECURSIVE PATTERNS
-     Consider the problem of matching a  string  in  parentheses,
-     allowing  for  unlimited nested parentheses. Without the use
-     of recursion, the best that can be done is to use a  pattern
-     that  matches  up  to some fixed depth of nesting. It is not
-     possible to handle an arbitrary nesting depth. Perl 5.6  has
-     provided   an  experimental  facility  that  allows  regular
-     expressions to recurse (amongst other things). It does  this
-     by  interpolating  Perl  code in the expression at run time,
-     and the code can refer to the expression itself. A Perl pat-
-     tern  to  solve  the parentheses problem can be created like
-     this:
-
-       $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
-
-     The (?p{...}) item interpolates Perl code at run  time,  and
-     in  this  case refers recursively to the pattern in which it
-     appears. Obviously, PCRE cannot support the interpolation of
-     Perl  code.  Instead,  the special item (?R) is provided for
-     the specific case of recursion. This PCRE pattern solves the
-     parentheses  problem (assume the PCRE_EXTENDED option is set
-     so that white space is ignored):
-
-       \( ( (?>[^()]+) | (?R) )* \)
-
-     First it matches an opening parenthesis. Then it matches any
-     number  of substrings which can either be a sequence of non-
-     parentheses, or a recursive  match  of  the  pattern  itself
-     (i.e. a correctly parenthesized substring). Finally there is
-     a closing parenthesis.
-
-     This particular example pattern  contains  nested  unlimited
-     repeats, and so the use of a once-only subpattern for match-
-     ing strings of non-parentheses is  important  when  applying
-     the  pattern to strings that do not match. For example, when
-     it is applied to
-
-       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
-
-     it yields "no match" quickly. However, if a  once-only  sub-
-     pattern  is  not  used,  the match runs for a very long time
-     indeed because there are so many different ways the + and  *
-     repeats  can carve up the subject, and all have to be tested
-     before failure can be reported.
-
-     The values set for any capturing subpatterns are those  from
-     the outermost level of the recursion at which the subpattern
-     value is set. If the pattern above is matched against
-
-       (ab(cd)ef)
-
-     the value for the capturing parentheses is  "ef",  which  is
-     the  last  value  taken  on  at the top level. If additional
-     parentheses are added, giving
-
-       \( ( ( (?>[^()]+) | (?R) )* ) \)
-          ^                        ^
-          ^                        ^ the string they  capture  is
-     "ab(cd)ef",  the  contents  of the top level parentheses. If
-     there are more than 15 capturing parentheses in  a  pattern,
-     PCRE  has  to  obtain  extra  memory  to store data during a
-     recursion, which it does by using  pcre_malloc,  freeing  it
-     via  pcre_free  afterwards. If no memory can be obtained, it
-     saves data for the first 15 capturing parentheses  only,  as
-     there is no way to give an out-of-memory error from within a
-     recursion.
-
-
-
-PERFORMANCE
-     Certain items that may appear in patterns are more efficient
-     than  others.  It is more efficient to use a character class
-     like [aeiou] than a set of alternatives such as (a|e|i|o|u).
-     In  general,  the  simplest  construction  that provides the
-     required behaviour is usually the  most  efficient.  Jeffrey
-     Friedl's  book contains a lot of discussion about optimizing
-     regular expressions for efficient performance.
-
-     When a pattern begins with .* and the PCRE_DOTALL option  is
-     set,  the  pattern  is implicitly anchored by PCRE, since it
-     can match only at the start of a subject string. However, if
-     PCRE_DOTALL  is not set, PCRE cannot make this optimization,
-     because the . metacharacter does not then match  a  newline,
-     and if the subject string contains newlines, the pattern may
-     match from the character immediately following one  of  them
-     instead of from the very start. For example, the pattern
-
-       (.*) second
-
-     matches the subject "first\nand second" (where \n stands for
-     a newline character) with the first captured substring being
-     "and". In order to do this, PCRE  has  to  retry  the  match
-     starting after every newline in the subject.
-
-     If you are using such a pattern with subject strings that do
-     not  contain  newlines,  the best performance is obtained by
-     setting PCRE_DOTALL, or starting the  pattern  with  ^.*  to
-     indicate  explicit anchoring. That saves PCRE from having to
-     scan along the subject looking for a newline to restart at.
-
-     Beware of patterns that contain nested  indefinite  repeats.
-     These  can  take a long time to run when applied to a string
-     that does not match. Consider the pattern fragment
-
-       (a+)*
-
-     This can match "aaaa" in 33 different ways, and this  number
-     increases  very  rapidly  as  the string gets longer. (The *
-     repeat can match 0, 1, 2, 3, or 4 times,  and  for  each  of
-     those  cases other than 0, the + repeats can match different
-     numbers of times.) When the remainder of the pattern is such
-     that  the entire match is going to fail, PCRE has in princi-
-     ple to try every possible variation, and this  can  take  an
-     extremely long time.
-
-     An optimization catches some of the more simple  cases  such
-     as
-
-       (a+)*b
-
-     where a literal character follows. Before embarking  on  the
-     standard matching procedure, PCRE checks that there is a "b"
-     later in the subject string, and if there is not,  it  fails
-     the  match  immediately. However, when there is no following
-     literal this optimization cannot be used. You  can  see  the
-     difference by comparing the behaviour of
-
-       (a+)*\d
-
-     with the pattern above. The former gives  a  failure  almost
-     instantly  when  applied  to a whole line of "a" characters,
-     whereas the latter takes an appreciable  time  with  strings
-     longer than about 20 characters.
-
-
-
-UTF-8 SUPPORT
-     Starting at release 3.3, PCRE has some support for character
-     strings encoded in the UTF-8 format. This is incomplete, and
-     is regarded as experimental. In order to use  it,  you  must
-     configure PCRE to include UTF-8 support in the code, and, in
-     addition, you must call pcre_compile()  with  the  PCRE_UTF8
-     option flag. When you do this, both the pattern and any sub-
-     ject strings that are matched  against  it  are  treated  as
-     UTF-8  strings instead of just strings of bytes, but only in
-     the cases that are mentioned below.
-
-     If you compile PCRE with UTF-8 support, but do not use it at
-     run  time,  the  library will be a bit bigger, but the addi-
-     tional run time overhead is limited to testing the PCRE_UTF8
-     flag in several places, so should not be very large.
-
-     PCRE assumes that the strings  it  is  given  contain  valid
-     UTF-8  codes. It does not diagnose invalid UTF-8 strings. If
-     you pass invalid UTF-8 strings  to  PCRE,  the  results  are
-     undefined.
-
-     Running with PCRE_UTF8 set causes these changes in  the  way
-     PCRE works:
-
-     1. In a pattern, the escape sequence \x{...}, where the con-
-     tents  of  the  braces is a string of hexadecimal digits, is
-     interpreted as a UTF-8 character whose code  number  is  the
-     given   hexadecimal  number,  for  example:  \x{1234}.  This
-     inserts from one to six  literal  bytes  into  the  pattern,
-     using the UTF-8 encoding. If a non-hexadecimal digit appears
-     between the braces, the item is not recognized.
-
-     2. The original hexadecimal escape sequence, \xhh, generates
-     a two-byte UTF-8 character if its value is greater than 127.
-
-     3. Repeat quantifiers are NOT correctly handled if they fol-
-     low  a  multibyte character. For example, \x{100}* and \xc3+
-     do not work. If you want to repeat such characters, you must
-     enclose  them  in  non-capturing  parentheses,  for  example
-     (?:\x{100}), at present.
-
-     4. The dot metacharacter matches one UTF-8 character instead
-     of a single byte.
-
-     5. Unlike literal UTF-8 characters,  the  dot  metacharacter
-     followed  by  a  repeat quantifier does operate correctly on
-     UTF-8 characters instead of single bytes.
-
-     4. Although the \x{...} escape is permitted in  a  character
-     class,  characters  whose values are greater than 255 cannot
-     be included in a class.
-
-     5. A class is matched against a UTF-8 character  instead  of
-     just  a  single byte, but it can match only characters whose
-     values are less than 256.  Characters  with  greater  values
-     always fail to match a class.
-
-     6. Repeated classes work correctly on multiple characters.
-
-     7. Classes containing just a single character whose value is
-     greater than 127 (but less than 256), for example, [\x80] or
-     [^\x{93}], do not work because these are optimized into sin-
-     gle  byte  matches.  In the first case, of course, the class
-     brackets are just redundant.
-
-     8. Lookbehind assertions move backwards in the subject by  a
-     fixed  number  of  characters  instead  of a fixed number of
-     bytes. Simple cases have been tested to work correctly,  but
-     there may be hidden gotchas herein.
-
-     9. The character types  such  as  \d  and  \w  do  not  work
-     correctly  with  UTF-8  characters.  They continue to test a
-     single byte.
-
-     10. Anything not explicitly mentioned here continues to work
-     in bytes rather than in characters.
-
-     The following UTF-8 features of  Perl  5.6  are  not  imple-
-     mented:
-     1. The escape sequence \C to match a single byte.
-
-     2. The use of Unicode tables and properties and escapes  \p,
-     \P, and \X.
-
-
-
-AUTHOR
-     Philip Hazel <ph10@cam.ac.uk>
-     University Computing Service,
-     New Museums Site,
-     Cambridge CB2 3QG, England.
-     Phone: +44 1223 334714
-
-     Last updated: 28 August 2000,
-       the 250th anniversary of the death of J.S. Bach.
-     Copyright (c) 1997-2000 University of Cambridge.
diff --git a/pcre/doc/pcregrep.1 b/pcre/doc/pcregrep.1
deleted file mode 100644 (file)
index ec733fa..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-.TH PCREGREP 1\r
-.SH NAME\r
-pcregrep - a grep with Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B pcregrep [-Vchilnsvx] pattern [file] ...\r
-\r
-\r
-.SH DESCRIPTION\r
-\fBpcregrep\fR searches files for character patterns, in the same way as other\r
-grep commands do, but it uses the PCRE regular expression library to support\r
-patterns that are compatible with the regular expressions of Perl 5. See\r
-\fBpcre(3)\fR for a full description of syntax and semantics.\r
-\r
-If no files are specified, \fBpcregrep\fR reads the standard input. By default,\r
-each line that matches the pattern is copied to the standard output, and if\r
-there is more than one file, the file name is printed before each line of\r
-output. However, there are options that can change how \fBpcregrep\fR behaves.\r
-\r
-Lines are limited to BUFSIZ characters. BUFSIZ is defined in \fB<stdio.h>\fR.\r
-The newline character is removed from the end of each line before it is matched\r
-against the pattern.\r
-\r
-\r
-.SH OPTIONS\r
-.TP 10\r
-\fB-V\fR\r
-Write the version number of the PCRE library being used to the standard error\r
-stream.\r
-.TP\r
-\fB-c\fR\r
-Do not print individual lines; instead just print a count of the number of\r
-lines that would otherwise have been printed. If several files are given, a\r
-count is printed for each of them.\r
-.TP\r
-\fB-h\fR\r
-Suppress printing of filenames when searching multiple files.\r
-.TP\r
-\fB-i\fR\r
-Ignore upper/lower case distinctions during comparisons.\r
-.TP\r
-\fB-l\fR\r
-Instead of printing lines from the files, just print the names of the files\r
-containing lines that would have been printed. Each file name is printed\r
-once, on a separate line.\r
-.TP\r
-\fB-n\fR\r
-Precede each line by its line number in the file.\r
-.TP\r
-\fB-s\fR\r
-Work silently, that is, display nothing except error messages.\r
-The exit status indicates whether any matches were found.\r
-.TP\r
-\fB-v\fR\r
-Invert the sense of the match, so that lines which do \fInot\fR match the\r
-pattern are now the ones that are found.\r
-.TP\r
-\fB-x\fR\r
-Force the pattern to be anchored (it must start matching at the beginning of\r
-the line) and in addition, require it to match the entire line. This is\r
-equivalent to having ^ and $ characters at the start and end of each\r
-alternative branch in the regular expression.\r
-\r
-\r
-.SH SEE ALSO\r
-\fBpcre(3)\fR, Perl 5 documentation\r
-\r
-\r
-.SH DIAGNOSTICS\r
-Exit status is 0 if any matches were found, 1 if no matches were found, and 2\r
-for syntax errors or inacessible files (even if matches were found).\r
-\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcregrep.html b/pcre/doc/pcregrep.html
deleted file mode 100644 (file)
index 19f733c..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-<HTML>\r
-<HEAD>\r
-<TITLE>pcregrep specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcregrep specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">OPTIONS</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">SEE ALSO</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">DIAGNOSTICS</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcregrep - a grep with Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>pcregrep [-Vchilnsvx] pattern [file] ...</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-<B>pcregrep</B> searches files for character patterns, in the same way as other\r
-grep commands do, but it uses the PCRE regular expression library to support\r
-patterns that are compatible with the regular expressions of Perl 5. See\r
-<B>pcre(3)</B> for a full description of syntax and semantics.\r
-</P>\r
-<P>\r
-If no files are specified, <B>pcregrep</B> reads the standard input. By default,\r
-each line that matches the pattern is copied to the standard output, and if\r
-there is more than one file, the file name is printed before each line of\r
-output. However, there are options that can change how <B>pcregrep</B> behaves.\r
-</P>\r
-<P>\r
-Lines are limited to BUFSIZ characters. BUFSIZ is defined in <B>&#60;stdio.h&#62;</B>.\r
-The newline character is removed from the end of each line before it is matched\r
-against the pattern.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">OPTIONS</A>\r
-<P>\r
-<B>-V</B>\r
-Write the version number of the PCRE library being used to the standard error\r
-stream.\r
-</P>\r
-<P>\r
-<B>-c</B>\r
-Do not print individual lines; instead just print a count of the number of\r
-lines that would otherwise have been printed. If several files are given, a\r
-count is printed for each of them.\r
-</P>\r
-<P>\r
-<B>-h</B>\r
-Suppress printing of filenames when searching multiple files.\r
-</P>\r
-<P>\r
-<B>-i</B>\r
-Ignore upper/lower case distinctions during comparisons.\r
-</P>\r
-<P>\r
-<B>-l</B>\r
-Instead of printing lines from the files, just print the names of the files\r
-containing lines that would have been printed. Each file name is printed\r
-once, on a separate line.\r
-</P>\r
-<P>\r
-<B>-n</B>\r
-Precede each line by its line number in the file.\r
-</P>\r
-<P>\r
-<B>-s</B>\r
-Work silently, that is, display nothing except error messages.\r
-The exit status indicates whether any matches were found.\r
-</P>\r
-<P>\r
-<B>-v</B>\r
-Invert the sense of the match, so that lines which do <I>not</I> match the\r
-pattern are now the ones that are found.\r
-</P>\r
-<P>\r
-<B>-x</B>\r
-Force the pattern to be anchored (it must start matching at the beginning of\r
-the line) and in addition, require it to match the entire line. This is\r
-equivalent to having ^ and $ characters at the start and end of each\r
-alternative branch in the regular expression.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">SEE ALSO</A>\r
-<P>\r
-<B>pcre(3)</B>, Perl 5 documentation\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">DIAGNOSTICS</A>\r
-<P>\r
-Exit status is 0 if any matches were found, 1 if no matches were found, and 2\r
-for syntax errors or inacessible files (even if matches were found).\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel &#60;ph10@cam.ac.uk&#62;\r
-<BR>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcregrep.txt b/pcre/doc/pcregrep.txt
deleted file mode 100644 (file)
index 871350c..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-NAME\r
-     pcregrep - a grep with Perl-compatible regular expressions.\r
-\r
-\r
-\r
-SYNOPSIS\r
-     pcregrep [-Vchilnsvx] pattern [file] ...\r
-\r
-\r
-\r
-DESCRIPTION\r
-     pcregrep searches files for character patterns, in the  same\r
-     way  as other grep commands do, but it uses the PCRE regular\r
-     expression library to support patterns that  are  compatible\r
-     with  the  regular  expressions of Perl 5. See pcre(3) for a\r
-     full description of syntax and semantics.\r
-\r
-     If no files  are  specified,  pcregrep  reads  the  standard\r
-     input.  By  default,  each  line that matches the pattern is\r
-     copied to the standard output, and if there is more than one\r
-     file,  the  file name is printed before each line of output.\r
-     However, there are options  that  can  change  how  pcregrep\r
-     behaves.\r
-\r
-     Lines are limited to BUFSIZ characters. BUFSIZ is defined in\r
-     <stdio.h>.  The newline character is removed from the end of\r
-     each line before it is matched against the pattern.\r
-\r
-\r
-\r
-OPTIONS\r
-     -V        Write the version number of the PCRE library being\r
-               used to the standard error stream.\r
-\r
-     -c        Do not print individual lines; instead just  print\r
-               a  count  of the number of lines that would other-\r
-               wise have  been  printed.  If  several  files  are\r
-               given, a count is printed for each of them.\r
-\r
-     -h        Suppress printing of filenames when searching mul-\r
-               tiple files.\r
-\r
-     -i        Ignore upper/lower case distinctions  during  com-\r
-               parisons.\r
-\r
-     -l        Instead of printing lines  from  the  files,  just\r
-               print the names of the files containing lines that\r
-               would have been printed. Each file name is printed\r
-               once, on a separate line.\r
-\r
-     -n        Precede each line by its line number in the file.\r
-\r
-     -s        Work silently, that  is,  display  nothing  except\r
-               error messages.  The exit status indicates whether\r
-               any matches were found.\r
-\r
-     -v        Invert the sense of the match, so that lines which\r
-               do not match the pattern are now the ones that are\r
-               found.\r
-\r
-     -x        Force the pattern to be anchored  (it  must  start\r
-               matching  at  the  beginning  of  the line) and in\r
-               addition, require it to  match  the  entire  line.\r
-               This is equivalent to having ^ and $ characters at\r
-               the start and end of each  alternative  branch  in\r
-               the regular expression.\r
-\r
-\r
-\r
-SEE ALSO\r
-     pcre(3), Perl 5 documentation\r
-\r
-\r
-\r
-\r
-\r
-DIAGNOSTICS\r
-     Exit status is 0 if any matches were found, 1 if no  matches\r
-     were  found,  and  2  for syntax errors or inacessible files\r
-     (even if matches were found).\r
-\r
-\r
-\r
-AUTHOR\r
-     Philip Hazel <ph10@cam.ac.uk>\r
-     Copyright (c) 1997-2000 University of Cambridge.\r
-\r
diff --git a/pcre/doc/pcreposix.3 b/pcre/doc/pcreposix.3
deleted file mode 100644 (file)
index 4853a97..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-.TH PCRE 3\r
-.SH NAME\r
-pcreposix - POSIX API for Perl-compatible regular expressions.\r
-.SH SYNOPSIS\r
-.B #include <pcreposix.h>\r
-.PP\r
-.SM\r
-.br\r
-.B int regcomp(regex_t *\fIpreg\fR, const char *\fIpattern\fR,\r
-.ti +5n\r
-.B int \fIcflags\fR);\r
-.PP\r
-.br\r
-.B int regexec(regex_t *\fIpreg\fR, const char *\fIstring\fR,\r
-.ti +5n\r
-.B size_t \fInmatch\fR, regmatch_t \fIpmatch\fR[], int \fIeflags\fR);\r
-.PP\r
-.br\r
-.B size_t regerror(int \fIerrcode\fR, const regex_t *\fIpreg\fR,\r
-.ti +5n\r
-.B char *\fIerrbuf\fR, size_t \fIerrbuf_size\fR);\r
-.PP\r
-.br\r
-.B void regfree(regex_t *\fIpreg\fR);\r
-\r
-\r
-.SH DESCRIPTION\r
-This set of functions provides a POSIX-style API to the PCRE regular expression\r
-package. See the \fBpcre\fR documentation for a description of the native API,\r
-which contains additional functionality.\r
-\r
-The functions described here are just wrapper functions that ultimately call\r
-the native API. Their prototypes are defined in the \fBpcreposix.h\fR header\r
-file, and on Unix systems the library itself is called \fBpcreposix.a\fR, so\r
-can be accessed by adding \fB-lpcreposix\fR to the command for linking an\r
-application which uses them. Because the POSIX functions call the native ones,\r
-it is also necessary to add \fR-lpcre\fR.\r
-\r
-I have implemented only those option bits that can be reasonably mapped to PCRE\r
-native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined\r
-with the value zero. They have no effect, but since programs that are written\r
-to the POSIX interface often use them, this makes it easier to slot in PCRE as\r
-a replacement library. Other POSIX options are not even defined.\r
-\r
-When PCRE is called via these functions, it is only the API that is POSIX-like\r
-in style. The syntax and semantics of the regular expressions themselves are\r
-still those of Perl, subject to the setting of various PCRE options, as\r
-described below.\r
-\r
-The header for these functions is supplied as \fBpcreposix.h\fR to avoid any\r
-potential clash with other POSIX libraries. It can, of course, be renamed or\r
-aliased as \fBregex.h\fR, which is the "correct" name. It provides two\r
-structure types, \fIregex_t\fR for compiled internal forms, and\r
-\fIregmatch_t\fR for returning captured substrings. It also defines some\r
-constants whose names start with "REG_"; these are used for setting options and\r
-identifying error codes.\r
-\r
-\r
-.SH COMPILING A PATTERN\r
-\r
-The function \fBregcomp()\fR is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument \fIpattern\fR. The \fIpreg\fR argument is a pointer\r
-to a regex_t structure which is used as a base for storing information about\r
-the compiled expression.\r
-\r
-The argument \fIcflags\fR is either zero, or contains one or more of the bits\r
-defined by the following macros:\r
-\r
-  REG_ICASE\r
-\r
-The PCRE_CASELESS option is set when the expression is passed for compilation\r
-to the native function.\r
-\r
-  REG_NEWLINE\r
-\r
-The PCRE_MULTILINE option is set when the expression is passed for compilation\r
-to the native function.\r
-\r
-In the absence of these flags, no options are passed to the native function.\r
-This means the the regex is compiled with PCRE default semantics. In\r
-particular, the way it handles newline characters in the subject string is the\r
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\r
-\fIsome\fR of the effects specified for REG_NEWLINE. It does not affect the way\r
-newlines are matched by . (they aren't) or a negative class such as [^a] (they\r
-are).\r
-\r
-The yield of \fBregcomp()\fR is zero on success, and non-zero otherwise. The\r
-\fIpreg\fR structure is filled in on success, and one member of the structure\r
-is publicized: \fIre_nsub\fR contains the number of capturing subpatterns in\r
-the regular expression. Various error codes are defined in the header file.\r
-\r
-\r
-.SH MATCHING A PATTERN\r
-The function \fBregexec()\fR is called to match a pre-compiled pattern\r
-\fIpreg\fR against a given \fIstring\fR, which is terminated by a zero byte,\r
-subject to the options in \fIeflags\fR. These can be:\r
-\r
-  REG_NOTBOL\r
-\r
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching\r
-function.\r
-\r
-  REG_NOTEOL\r
-\r
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching\r
-function.\r
-\r
-The portion of the string that was matched, and also any captured substrings,\r
-are returned via the \fIpmatch\fR argument, which points to an array of\r
-\fInmatch\fR structures of type \fIregmatch_t\fR, containing the members\r
-\fIrm_so\fR and \fIrm_eo\fR. These contain the offset to the first character of\r
-each substring and the offset to the first character after the end of each\r
-substring, respectively. The 0th element of the vector relates to the entire\r
-portion of \fIstring\fR that was matched; subsequent elements relate to the\r
-capturing subpatterns of the regular expression. Unused entries in the array\r
-have both structure members set to -1.\r
-\r
-A successful match yields a zero return; various error codes are defined in the\r
-header file, of which REG_NOMATCH is the "expected" failure code.\r
-\r
-\r
-.SH ERROR MESSAGES\r
-The \fBregerror()\fR function maps a non-zero errorcode from either\r
-\fBregcomp\fR or \fBregexec\fR to a printable message. If \fIpreg\fR is not\r
-NULL, the error should have arisen from the use of that structure. A message\r
-terminated by a binary zero is placed in \fIerrbuf\fR. The length of the\r
-message, including the zero, is limited to \fIerrbuf_size\fR. The yield of the\r
-function is the size of buffer needed to hold the whole message.\r
-\r
-\r
-.SH STORAGE\r
-Compiling a regular expression causes memory to be allocated and associated\r
-with the \fIpreg\fR structure. The function \fBregfree()\fR frees all such\r
-memory, after which \fIpreg\fR may no longer be used as a compiled expression.\r
-\r
-\r
-.SH AUTHOR\r
-Philip Hazel <ph10@cam.ac.uk>\r
-.br\r
-University Computing Service,\r
-.br\r
-New Museums Site,\r
-.br\r
-Cambridge CB2 3QG, England.\r
-.br\r
-Phone: +44 1223 334714\r
-\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcreposix.html b/pcre/doc/pcreposix.html
deleted file mode 100644 (file)
index 79ff544..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-<HTML>\r
-<HEAD>\r
-<TITLE>pcreposix specification</TITLE>\r
-</HEAD>\r
-<body bgcolor="#FFFFFF" text="#00005A">\r
-<H1>pcreposix specification</H1>\r
-This HTML document has been generated automatically from the original man page.\r
-If there is any nonsense in it, please consult the man page in case the\r
-conversion went wrong.\r
-<UL>\r
-<LI><A NAME="TOC1" HREF="#SEC1">NAME</A>\r
-<LI><A NAME="TOC2" HREF="#SEC2">SYNOPSIS</A>\r
-<LI><A NAME="TOC3" HREF="#SEC3">DESCRIPTION</A>\r
-<LI><A NAME="TOC4" HREF="#SEC4">COMPILING A PATTERN</A>\r
-<LI><A NAME="TOC5" HREF="#SEC5">MATCHING A PATTERN</A>\r
-<LI><A NAME="TOC6" HREF="#SEC6">ERROR MESSAGES</A>\r
-<LI><A NAME="TOC7" HREF="#SEC7">STORAGE</A>\r
-<LI><A NAME="TOC8" HREF="#SEC8">AUTHOR</A>\r
-</UL>\r
-<LI><A NAME="SEC1" HREF="#TOC1">NAME</A>\r
-<P>\r
-pcreposix - POSIX API for Perl-compatible regular expressions.\r
-</P>\r
-<LI><A NAME="SEC2" HREF="#TOC1">SYNOPSIS</A>\r
-<P>\r
-<B>#include &#60;pcreposix.h&#62;</B>\r
-</P>\r
-<P>\r
-<B>int regcomp(regex_t *<I>preg</I>, const char *<I>pattern</I>,</B>\r
-<B>int <I>cflags</I>);</B>\r
-</P>\r
-<P>\r
-<B>int regexec(regex_t *<I>preg</I>, const char *<I>string</I>,</B>\r
-<B>size_t <I>nmatch</I>, regmatch_t <I>pmatch</I>[], int <I>eflags</I>);</B>\r
-</P>\r
-<P>\r
-<B>size_t regerror(int <I>errcode</I>, const regex_t *<I>preg</I>,</B>\r
-<B>char *<I>errbuf</I>, size_t <I>errbuf_size</I>);</B>\r
-</P>\r
-<P>\r
-<B>void regfree(regex_t *<I>preg</I>);</B>\r
-</P>\r
-<LI><A NAME="SEC3" HREF="#TOC1">DESCRIPTION</A>\r
-<P>\r
-This set of functions provides a POSIX-style API to the PCRE regular expression\r
-package. See the <B>pcre</B> documentation for a description of the native API,\r
-which contains additional functionality.\r
-</P>\r
-<P>\r
-The functions described here are just wrapper functions that ultimately call\r
-the native API. Their prototypes are defined in the <B>pcreposix.h</B> header\r
-file, and on Unix systems the library itself is called <B>pcreposix.a</B>, so\r
-can be accessed by adding <B>-lpcreposix</B> to the command for linking an\r
-application which uses them. Because the POSIX functions call the native ones,\r
-it is also necessary to add \fR-lpcre\fR.\r
-</P>\r
-<P>\r
-I have implemented only those option bits that can be reasonably mapped to PCRE\r
-native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined\r
-with the value zero. They have no effect, but since programs that are written\r
-to the POSIX interface often use them, this makes it easier to slot in PCRE as\r
-a replacement library. Other POSIX options are not even defined.\r
-</P>\r
-<P>\r
-When PCRE is called via these functions, it is only the API that is POSIX-like\r
-in style. The syntax and semantics of the regular expressions themselves are\r
-still those of Perl, subject to the setting of various PCRE options, as\r
-described below.\r
-</P>\r
-<P>\r
-The header for these functions is supplied as <B>pcreposix.h</B> to avoid any\r
-potential clash with other POSIX libraries. It can, of course, be renamed or\r
-aliased as <B>regex.h</B>, which is the "correct" name. It provides two\r
-structure types, <I>regex_t</I> for compiled internal forms, and\r
-<I>regmatch_t</I> for returning captured substrings. It also defines some\r
-constants whose names start with "REG_"; these are used for setting options and\r
-identifying error codes.\r
-</P>\r
-<LI><A NAME="SEC4" HREF="#TOC1">COMPILING A PATTERN</A>\r
-<P>\r
-The function <B>regcomp()</B> is called to compile a pattern into an\r
-internal form. The pattern is a C string terminated by a binary zero, and\r
-is passed in the argument <I>pattern</I>. The <I>preg</I> argument is a pointer\r
-to a regex_t structure which is used as a base for storing information about\r
-the compiled expression.\r
-</P>\r
-<P>\r
-The argument <I>cflags</I> is either zero, or contains one or more of the bits\r
-defined by the following macros:\r
-</P>\r
-<P>\r
-<PRE>\r
-  REG_ICASE\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_CASELESS option is set when the expression is passed for compilation\r
-to the native function.\r
-</P>\r
-<P>\r
-<PRE>\r
-  REG_NEWLINE\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_MULTILINE option is set when the expression is passed for compilation\r
-to the native function.\r
-</P>\r
-<P>\r
-In the absence of these flags, no options are passed to the native function.\r
-This means the the regex is compiled with PCRE default semantics. In\r
-particular, the way it handles newline characters in the subject string is the\r
-Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only\r
-<I>some</I> of the effects specified for REG_NEWLINE. It does not affect the way\r
-newlines are matched by . (they aren't) or a negative class such as [^a] (they\r
-are).\r
-</P>\r
-<P>\r
-The yield of <B>regcomp()</B> is zero on success, and non-zero otherwise. The\r
-<I>preg</I> structure is filled in on success, and one member of the structure\r
-is publicized: <I>re_nsub</I> contains the number of capturing subpatterns in\r
-the regular expression. Various error codes are defined in the header file.\r
-</P>\r
-<LI><A NAME="SEC5" HREF="#TOC1">MATCHING A PATTERN</A>\r
-<P>\r
-The function <B>regexec()</B> is called to match a pre-compiled pattern\r
-<I>preg</I> against a given <I>string</I>, which is terminated by a zero byte,\r
-subject to the options in <I>eflags</I>. These can be:\r
-</P>\r
-<P>\r
-<PRE>\r
-  REG_NOTBOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_NOTBOL option is set when calling the underlying PCRE matching\r
-function.\r
-</P>\r
-<P>\r
-<PRE>\r
-  REG_NOTEOL\r
-</PRE>\r
-</P>\r
-<P>\r
-The PCRE_NOTEOL option is set when calling the underlying PCRE matching\r
-function.\r
-</P>\r
-<P>\r
-The portion of the string that was matched, and also any captured substrings,\r
-are returned via the <I>pmatch</I> argument, which points to an array of\r
-<I>nmatch</I> structures of type <I>regmatch_t</I>, containing the members\r
-<I>rm_so</I> and <I>rm_eo</I>. These contain the offset to the first character of\r
-each substring and the offset to the first character after the end of each\r
-substring, respectively. The 0th element of the vector relates to the entire\r
-portion of <I>string</I> that was matched; subsequent elements relate to the\r
-capturing subpatterns of the regular expression. Unused entries in the array\r
-have both structure members set to -1.\r
-</P>\r
-<P>\r
-A successful match yields a zero return; various error codes are defined in the\r
-header file, of which REG_NOMATCH is the "expected" failure code.\r
-</P>\r
-<LI><A NAME="SEC6" HREF="#TOC1">ERROR MESSAGES</A>\r
-<P>\r
-The <B>regerror()</B> function maps a non-zero errorcode from either\r
-<B>regcomp</B> or <B>regexec</B> to a printable message. If <I>preg</I> is not\r
-NULL, the error should have arisen from the use of that structure. A message\r
-terminated by a binary zero is placed in <I>errbuf</I>. The length of the\r
-message, including the zero, is limited to <I>errbuf_size</I>. The yield of the\r
-function is the size of buffer needed to hold the whole message.\r
-</P>\r
-<LI><A NAME="SEC7" HREF="#TOC1">STORAGE</A>\r
-<P>\r
-Compiling a regular expression causes memory to be allocated and associated\r
-with the <I>preg</I> structure. The function <B>regfree()</B> frees all such\r
-memory, after which <I>preg</I> may no longer be used as a compiled expression.\r
-</P>\r
-<LI><A NAME="SEC8" HREF="#TOC1">AUTHOR</A>\r
-<P>\r
-Philip Hazel &#60;ph10@cam.ac.uk&#62;\r
-<BR>\r
-University Computing Service,\r
-<BR>\r
-New Museums Site,\r
-<BR>\r
-Cambridge CB2 3QG, England.\r
-<BR>\r
-Phone: +44 1223 334714\r
-</P>\r
-<P>\r
-Copyright (c) 1997-2000 University of Cambridge.\r
diff --git a/pcre/doc/pcreposix.txt b/pcre/doc/pcreposix.txt
deleted file mode 100644 (file)
index 2d76f7c..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-NAME
-     pcreposix - POSIX API for  Perl-compatible  regular  expres-
-     sions.
-
-
-
-SYNOPSIS
-     #include <pcreposix.h>
-
-     int regcomp(regex_t *preg, const char *pattern,
-          int cflags);
-
-     int regexec(regex_t *preg, const char *string,
-          size_t nmatch, regmatch_t pmatch[], int eflags);
-
-     size_t regerror(int errcode, const regex_t *preg,
-          char *errbuf, size_t errbuf_size);
-
-     void regfree(regex_t *preg);
-
-
-
-DESCRIPTION
-     This set of functions provides a POSIX-style API to the PCRE
-     regular expression package. See the pcre documentation for a
-     description of the native  API,  which  contains  additional
-     functionality.
-
-     The functions described here are just wrapper functions that
-     ultimately call the native API. Their prototypes are defined
-     in the pcreposix.h header file,  and  on  Unix  systems  the
-     library  itself is called pcreposix.a, so can be accessed by
-     adding -lpcreposix to the command for linking an application
-     which uses them. Because the POSIX functions call the native
-     ones, it is also necessary to add -lpcre.
-
-     I have implemented only those option bits that can  be  rea-
-     sonably  mapped  to  PCRE  native  options. In addition, the
-     options REG_EXTENDED and  REG_NOSUB  are  defined  with  the
-     value zero. They have no effect, but since programs that are
-     written to the POSIX interface often use them, this makes it
-     easier to slot in PCRE as a replacement library. Other POSIX
-     options are not even defined.
-
-     When PCRE is called via these functions, it is only the  API
-     that is POSIX-like in style. The syntax and semantics of the
-     regular expressions themselves are still those of Perl, sub-
-     ject  to  the  setting of various PCRE options, as described
-     below.
-
-     The header for these functions is supplied as pcreposix.h to
-     avoid  any  potential  clash  with other POSIX libraries. It
-     can, of course, be renamed or aliased as regex.h,  which  is
-     the "correct" name. It provides two structure types, regex_t
-     for compiled internal forms, and  regmatch_t  for  returning
-     captured  substrings.  It  also defines some constants whose
-     names start with "REG_"; these are used for setting  options
-     and identifying error codes.
-
-
-
-COMPILING A PATTERN
-     The function regcomp() is called to compile a  pattern  into
-     an  internal form. The pattern is a C string terminated by a
-     binary zero, and is passed in the argument pattern. The preg
-     argument  is  a pointer to a regex_t structure which is used
-     as a base for storing information about the compiled expres-
-     sion.
-
-     The argument cflags is either zero, or contains one or  more
-     of the bits defined by the following macros:
-
-       REG_ICASE
-
-     The PCRE_CASELESS option  is  set  when  the  expression  is
-     passed for compilation to the native function.
-
-       REG_NEWLINE
-
-     The PCRE_MULTILINE option is  set  when  the  expression  is
-     passed for compilation to the native function.
-
-     In the absence of these flags, no options are passed to  the
-     native  function.  This means the the regex is compiled with
-     PCRE default semantics. In particular, the  way  it  handles
-     newline  characters  in  the subject string is the Perl way,
-     not the POSIX way. Note that setting PCRE_MULTILINE has only
-     some  of  the effects specified for REG_NEWLINE. It does not
-     affect the way newlines are matched by . (they aren't) or  a
-     negative class such as [^a] (they are).
-
-     The yield of regcomp() is zero on success, and non-zero oth-
-     erwise.  The preg structure is filled in on success, and one
-     member of the structure is publicized: re_nsub contains  the
-     number  of  capturing subpatterns in the regular expression.
-     Various error codes are defined in the header file.
-
-
-
-MATCHING A PATTERN
-     The function regexec() is called  to  match  a  pre-compiled
-     pattern  preg against a given string, which is terminated by
-     a zero byte, subject to the options in eflags. These can be:
-
-       REG_NOTBOL
-
-     The PCRE_NOTBOL option is set when  calling  the  underlying
-     PCRE matching function.
-
-       REG_NOTEOL
-
-     The PCRE_NOTEOL option is set when  calling  the  underlying
-     PCRE matching function.
-
-     The portion of the string that was  matched,  and  also  any
-     captured  substrings,  are returned via the pmatch argument,
-     which points to  an  array  of  nmatch  structures  of  type
-     regmatch_t,  containing  the  members rm_so and rm_eo. These
-     contain the offset to the first character of each  substring
-     and  the offset to the first character after the end of each
-     substring, respectively.  The  0th  element  of  the  vector
-     relates  to  the  entire portion of string that was matched;
-     subsequent elements relate to the capturing  subpatterns  of
-     the  regular  expression.  Unused  entries in the array have
-     both structure members set to -1.
-
-     A successful match yields a zero return; various error codes
-     are  defined in the header file, of which REG_NOMATCH is the
-     "expected" failure code.
-
-
-
-ERROR MESSAGES
-     The regerror()  function  maps  a  non-zero  errorcode  from
-     either regcomp or regexec to a printable message. If preg is
-     not NULL, the error should have arisen from the use of  that
-     structure.  A  message terminated by a binary zero is placed
-     in errbuf. The length of the message, including the zero, is
-     limited  to  errbuf_size.  The  yield of the function is the
-     size of buffer needed to hold the whole message.
-
-
-
-STORAGE
-     Compiling a regular expression causes memory to be allocated
-     and  associated  with  the preg structure. The function reg-
-     free() frees all such memory, after which preg may no longer
-     be used as a compiled expression.
-
-
-
-AUTHOR
-     Philip Hazel <ph10@cam.ac.uk>
-     University Computing Service,
-     New Museums Site,
-     Cambridge CB2 3QG, England.
-     Phone: +44 1223 334714
-
-     Copyright (c) 1997-2000 University of Cambridge.
diff --git a/pcre/doc/pcretest.txt b/pcre/doc/pcretest.txt
deleted file mode 100644 (file)
index 722e6b8..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-The pcretest program\r
---------------------\r
-\r
-This program is intended for testing PCRE, but it can also be used for\r
-experimenting with regular expressions.\r
-\r
-If it is given two filename arguments, it reads from the first and writes to\r
-the second. If it is given only one filename argument, it reads from that file\r
-and writes to stdout. Otherwise, it reads from stdin and writes to stdout, and\r
-prompts for each line of input, using "re>" to prompt for regular expressions,\r
-and "data>" to prompt for data lines.\r
-\r
-The program handles any number of sets of input on a single input file. Each\r
-set starts with a regular expression, and continues with any number of data\r
-lines to be matched against the pattern. An empty line signals the end of the\r
-data lines, at which point a new regular expression is read. The regular\r
-expressions are given enclosed in any non-alphameric delimiters other than\r
-backslash, for example\r
-\r
-  /(a|bc)x+yz/\r
-\r
-White space before the initial delimiter is ignored. A regular expression may\r
-be continued over several input lines, in which case the newline characters are\r
-included within it. See the test input files in the testdata directory for many\r
-examples. It is possible to include the delimiter within the pattern by\r
-escaping it, for example\r
-\r
-  /abc\/def/\r
-\r
-If you do so, the escape and the delimiter form part of the pattern, but since\r
-delimiters are always non-alphameric, this does not affect its interpretation.\r
-If the terminating delimiter is immediately followed by a backslash, for\r
-example,\r
-\r
-  /abc/\\r
-\r
-then a backslash is added to the end of the pattern. This is done to provide a\r
-way of testing the error condition that arises if a pattern finishes with a\r
-backslash, because\r
-\r
-  /abc\/\r
-\r
-is interpreted as the first line of a pattern that starts with "abc/", causing\r
-pcretest to read the next line as a continuation of the regular expression.\r
-\r
-\r
-PATTERN MODIFIERS\r
------------------\r
-\r
-The pattern may be followed by i, m, s, or x to set the PCRE_CASELESS,\r
-PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively. For\r
-example:\r
-\r
-  /caseless/i\r
-\r
-These modifier letters have the same effect as they do in Perl. There are\r
-others which set PCRE options that do not correspond to anything in Perl: /A,\r
-/E, and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respectively.\r
-\r
-Searching for all possible matches within each subject string can be requested\r
-by the /g or /G modifier. After finding a match, PCRE is called again to search\r
-the remainder of the subject string. The difference between /g and /G is that\r
-the former uses the startoffset argument to pcre_exec() to start searching at\r
-a new point within the entire string (which is in effect what Perl does),\r
-whereas the latter passes over a shortened substring. This makes a difference\r
-to the matching process if the pattern begins with a lookbehind assertion\r
-(including \b or \B).\r
-\r
-If any call to pcre_exec() in a /g or /G sequence matches an empty string, the\r
-next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set in order\r
-to search for another, non-empty, match at the same point. If this second match\r
-fails, the start offset is advanced by one, and the normal match is retried.\r
-This imitates the way Perl handles such cases when using the /g modifier or the\r
-split() function.\r
-\r
-There are a number of other modifiers for controlling the way pcretest\r
-operates.\r
-\r
-The /+ modifier requests that as well as outputting the substring that matched\r
-the entire pattern, pcretest should in addition output the remainder of the\r
-subject string. This is useful for tests where the subject contains multiple\r
-copies of the same substring.\r
-\r
-The /L modifier must be followed directly by the name of a locale, for example,\r
-\r
-  /pattern/Lfr\r
-\r
-For this reason, it must be the last modifier letter. The given locale is set,\r
-pcre_maketables() is called to build a set of character tables for the locale,\r
-and this is then passed to pcre_compile() when compiling the regular\r
-expression. Without an /L modifier, NULL is passed as the tables pointer; that\r
-is, /L applies only to the expression on which it appears.\r
-\r
-The /I modifier requests that pcretest output information about the compiled\r
-expression (whether it is anchored, has a fixed first character, and so on). It\r
-does this by calling pcre_fullinfo() after compiling an expression, and\r
-outputting the information it gets back. If the pattern is studied, the results\r
-of that are also output.\r
-\r
-The /D modifier is a PCRE debugging feature, which also assumes /I. It causes\r
-the internal form of compiled regular expressions to be output after\r
-compilation.\r
-\r
-The /S modifier causes pcre_study() to be called after the expression has been\r
-compiled, and the results used when the expression is matched.\r
-\r
-The /M modifier causes the size of memory block used to hold the compiled\r
-pattern to be output.\r
-\r
-The /P modifier causes pcretest to call PCRE via the POSIX wrapper API rather\r
-than its native API. When this is done, all other modifiers except /i, /m, and\r
-/+ are ignored. REG_ICASE is set if /i is present, and REG_NEWLINE is set if /m\r
-is present. The wrapper functions force PCRE_DOLLAR_ENDONLY always, and\r
-PCRE_DOTALL unless REG_NEWLINE is set.\r
-\r
-The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8 option set.\r
-This turns on the (currently incomplete) support for UTF-8 character handling\r
-in PCRE, provided that it was compiled with this support enabled. This modifier\r
-also causes any non-printing characters in output strings to be printed using\r
-the \x{hh...} notation if they are valid UTF-8 sequences.\r
-\r
-\r
-DATA LINES\r
-----------\r
-\r
-Before each data line is passed to pcre_exec(), leading and trailing whitespace\r
-is removed, and it is then scanned for \ escapes. The following are recognized:\r
-\r
-  \a         alarm (= BEL)\r
-  \b         backspace\r
-  \e         escape\r
-  \f         formfeed\r
-  \n         newline\r
-  \r         carriage return\r
-  \t         tab\r
-  \v         vertical tab\r
-  \nnn       octal character (up to 3 octal digits)\r
-  \xhh       hexadecimal character (up to 2 hex digits)\r
-  \x{hh...}  hexadecimal UTF-8 character\r
-\r
-  \A         pass the PCRE_ANCHORED option to pcre_exec()\r
-  \B         pass the PCRE_NOTBOL option to pcre_exec()\r
-  \Cdd       call pcre_copy_substring() for substring dd after a successful\r
-               match (any decimal number less than 32)\r
-  \Gdd       call pcre_get_substring() for substring dd after a successful\r
-               match (any decimal number less than 32)\r
-  \L         call pcre_get_substringlist() after a successful match\r
-  \N         pass the PCRE_NOTEMPTY option to pcre_exec()\r
-  \Odd       set the size of the output vector passed to pcre_exec() to dd\r
-               (any number of decimal digits)\r
-  \Z         pass the PCRE_NOTEOL option to pcre_exec()\r
-\r
-A backslash followed by anything else just escapes the anything else. If the\r
-very last character is a backslash, it is ignored. This gives a way of passing\r
-an empty line as data, since a real empty line terminates the data input.\r
-\r
-If /P was present on the regex, causing the POSIX wrapper API to be used, only\r
-\B, and \Z have any effect, causing REG_NOTBOL and REG_NOTEOL to be passed to\r
-regexec() respectively.\r
-\r
-The use of \x{hh...} to represent UTF-8 characters is not dependent on the use\r
-of the /8 modifier on the pattern. It is recognized always. There may be any\r
-number of hexadecimal digits inside the braces. The result is from one to six\r
-bytes, encoded according to the UTF-8 rules.\r
-\r
-\r
-OUTPUT FROM PCRETEST\r
---------------------\r
-\r
-When a match succeeds, pcretest outputs the list of captured substrings that\r
-pcre_exec() returns, starting with number 0 for the string that matched the\r
-whole pattern. Here is an example of an interactive pcretest run.\r
-\r
-  $ pcretest\r
-  PCRE version 2.06 08-Jun-1999\r
-\r
-    re> /^abc(\d+)/\r
-  data> abc123\r
-   0: abc123\r
-   1: 123\r
-  data> xyz\r
-  No match\r
-\r
-If the strings contain any non-printing characters, they are output as \0x\r
-escapes, or as \x{...} escapes if the /8 modifier was present on the pattern.\r
-If the pattern has the /+ modifier, then the output for substring 0 is followed\r
-by the the rest of the subject string, identified by "0+" like this:\r
-\r
-    re> /cat/+\r
-  data> cataract\r
-   0: cat\r
-   0+ aract\r
-\r
-If the pattern has the /g or /G modifier, the results of successive matching\r
-attempts are output in sequence, like this:\r
-\r
-    re> /\Bi(\w\w)/g\r
-  data> Mississippi\r
-   0: iss\r
-   1: ss\r
-   0: iss\r
-   1: ss\r
-   0: ipp\r
-   1: pp\r
-\r
-"No match" is output only if the first match attempt fails.\r
-\r
-If any of \C, \G, or \L are present in a data line that is successfully\r
-matched, the substrings extracted by the convenience functions are output with\r
-C, G, or L after the string number instead of a colon. This is in addition to\r
-the normal full list. The string length (that is, the return from the\r
-extraction function) is given in parentheses after each string for \C and \G.\r
-\r
-Note that while patterns can be continued over several lines (a plain ">"\r
-prompt is used for continuations), data lines may not. However newlines can be\r
-included in data by means of the \n escape.\r
-\r
-\r
-COMMAND LINE OPTIONS\r
---------------------\r
-\r
-If the -p option is given to pcretest, it is equivalent to adding /P to each\r
-regular expression: the POSIX wrapper API is used to call PCRE. None of the\r
-following flags has any effect in this case.\r
-\r
-If the option -d is given to pcretest, it is equivalent to adding /D to each\r
-regular expression: the internal form is output after compilation.\r
-\r
-If the option -i is given to pcretest, it is equivalent to adding /I to each\r
-regular expression: information about the compiled pattern is given after\r
-compilation.\r
-\r
-If the option -m is given to pcretest, it outputs the size of each compiled\r
-pattern after it has been compiled. It is equivalent to adding /M to each\r
-regular expression. For compatibility with earlier versions of pcretest, -s is\r
-a synonym for -m.\r
-\r
-If the -t option is given, each compile, study, and match is run 20000 times\r
-while being timed, and the resulting time per compile or match is output in\r
-milliseconds. Do not set -t with -m, because you will then get the size output\r
-20000 times and the timing will be distorted. If you want to change the number\r
-of repetitions used for timing, edit the definition of LOOPREPEAT at the top of\r
-pcretest.c\r
-\r
-Philip Hazel <ph10@cam.ac.uk>\r
-August 2000\r
diff --git a/pcre/doc/perltest.txt b/pcre/doc/perltest.txt
deleted file mode 100644 (file)
index 33155c1..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-The perltest program\r
---------------------\r
-\r
-The perltest program tests Perl's regular expressions; it has the same\r
-specification as pcretest, and so can be given identical input, except that\r
-input patterns can be followed only by Perl's lower case modifiers and /+ (as\r
-used by pcretest), which is recognized and handled by the program.\r
-\r
-The data lines are processed as Perl double-quoted strings, so if they contain\r
-" \ $ or @ characters, these have to be escaped. For this reason, all such\r
-characters in testinput1 and testinput3 are escaped so that they can be used\r
-for perltest as well as for pcretest, and the special upper case modifiers such\r
-as /A that pcretest recognizes are not used in these files. The output should\r
-be identical, apart from the initial identifying banner.\r
-\r
-For testing UTF-8 features, an alternative form of perltest, called perltest8,\r
-is supplied. This requires Perl 5.6 or higher. It recognizes the special\r
-modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput5\r
-file can be fed to perltest8.\r
-\r
-The testinput2 and testinput4 files are not suitable for feeding to perltest,\r
-since they do make use of the special upper case modifiers and escapes that\r
-pcretest uses to test some features of PCRE. The first of these files also\r
-contains malformed regular expressions, in order to check that PCRE diagnoses\r
-them correctly. Similarly, testinput6 tests UTF-8 features that do not relate\r
-to Perl.\r
-\r
-Philip Hazel <ph10@cam.ac.uk>\r
-August 2000\r
diff --git a/pcre/doc/readme b/pcre/doc/readme
deleted file mode 100644 (file)
index d124ee0..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-README file for PCRE (Perl-compatible regular expression library)
------------------------------------------------------------------
-
-The latest release of PCRE is always available from
-
-  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
-
-Please read the NEWS file if you are upgrading from a previous release.
-
-PCRE has its own native API, but a set of "wrapper" functions that are based on
-the POSIX API are also supplied in the library libpcreposix. Note that this
-just provides a POSIX calling interface to PCRE: the regular expressions
-themselves still follow Perl syntax and semantics. The header file
-for the POSIX-style functions is called pcreposix.h. The official POSIX name is
-regex.h, but I didn't want to risk possible problems with existing files of
-that name by distributing it that way. To use it with an existing program that
-uses the POSIX API, it will have to be renamed or pointed at by a link.
-
-
-Building PCRE on a Unix system
-------------------------------
-
-To build PCRE on a Unix system, run the "configure" command in the PCRE
-distribution directory. This is a standard GNU "autoconf" configuration script,
-for which generic instructions are supplied in INSTALL. On many systems just
-running "./configure" is sufficient, but the usual methods of changing standard
-defaults are available. For example,
-
-CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
-
-specifies that the C compiler should be run with the flags '-O2 -Wall' instead
-of the default, and that "make install" should install PCRE under /opt/local
-instead of the default /usr/local.
-
-If you want to make use of the experimential, incomplete support for UTF-8
-character strings in PCRE, you must add --enable-utf8 to the "configure"
-command. Without it, the code for handling UTF-8 is not included in the
-library. (Even when included, it still has to be enabled by an option at run
-time.)
-
-The "configure" script builds four files:
-
-. Makefile is built by copying Makefile.in and making substitutions.
-. config.h is built by copying config.in and making substitutions.
-. pcre-config is built by copying pcre-config.in and making substitutions.
-. RunTest is a script for running tests
-
-Once "configure" has run, you can run "make". It builds two libraries called
-libpcre and libpcreposix, a test program called pcretest, and the pcregrep
-command. You can use "make install" to copy these, and the public header file
-pcre.h, to appropriate live directories on your system, in the normal way.
-
-Running "make install" also installs the command pcre-config, which can be used
-to recall information about the PCRE configuration and installation. For
-example,
-
-  pcre-config --version
-
-prints the version number, and
-
- pcre-config --libs
-
-outputs information about where the library is installed. This command can be
-included in makefiles for programs that use PCRE, saving the programmer from
-having to remember too many details.
-
-
-Shared libraries on Unix systems
---------------------------------
-
-The default distribution builds PCRE as two shared libraries. This support is
-new and experimental and may not work on all systems. It relies on the
-"libtool" scripts - these are distributed with PCRE. It should build a
-"libtool" script and use this to compile and link shared libraries, which are
-placed in a subdirectory called .libs. The programs pcretest and pcregrep are
-built to use these uninstalled libraries by means of wrapper scripts. When you
-use "make install" to install shared libraries, pcregrep and pcretest are
-automatically re-built to use the newly installed libraries. However, only
-pcregrep is installed, as pcretest is really just a test program.
-
-To build PCRE using static libraries you must use --disable-shared when
-configuring it. For example
-
-./configure --prefix=/usr/gnu --disable-shared
-
-Then run "make" in the usual way.
-
-
-Building on non-Unix systems
-----------------------------
-
-For a non-Unix system, read the comments in the file NON-UNIX-USE. PCRE has
-been compiled on Windows systems and on Macintoshes, but I don't know the
-details because I don't use those systems. It should be straightforward to
-build PCRE on any system that has a Standard C compiler, because it uses only
-Standard C functions.
-
-
-Testing PCRE
-------------
-
-To test PCRE on a Unix system, run the RunTest script in the pcre directory.
-(This can also be run by "make runtest", "make check", or "make test".) For
-other systems, see the instruction in NON-UNIX-USE.
-
-The script runs the pcretest test program (which is documented in
-doc/pcretest.txt) on each of the testinput files (in the testdata directory) in
-turn, and compares the output with the contents of the corresponding testoutput
-file. A file called testtry is used to hold the output from pcretest. To run
-pcretest on just one of the test files, give its number as an argument to
-RunTest, for example:
-
-  RunTest 3
-
-The first and third test files can also be fed directly into the perltest
-script to check that Perl gives the same results. The third file requires the
-additional features of release 5.005, which is why it is kept separate from the
-main test input, which needs only Perl 5.004. In the long run, when 5.005 (or
-higher) is widespread, these two test files may get amalgamated.
-
-The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(),
-pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
-detection, and run-time flags that are specific to PCRE, as well as the POSIX
-wrapper API. It also uses the debugging flag to check some of the internals of
-pcre_compile().
-
-If you build PCRE with a locale setting that is not the standard C locale, the
-character tables may be different (see next paragraph). In some cases, this may
-cause failures in the second set of tests. For example, in a locale where the
-isprint() function yields TRUE for characters in the range 128-255, the use of
-[:isascii:] inside a character class defines a different set of characters, and
-this shows up in this test as a difference in the compiled code, which is being
-listed for checking. Where the comparison test output contains [\x00-\x7f] the
-test will contain [\x00-\xff], and similarly in some other cases. This is not a
-bug in PCRE.
-
-The fourth set of tests checks pcre_maketables(), the facility for building a
-set of character tables for a specific locale and using them instead of the
-default tables. The tests make use of the "fr" (French) locale. Before running
-the test, the script checks for the presence of this locale by running the
-"locale" command. If that command fails, or if it doesn't include "fr" in the
-list of available locales, the fourth test cannot be run, and a comment is
-output to say why. If running this test produces instances of the error
-
-  ** Failed to set locale "fr"
-
-in the comparison output, it means that locale is not available on your system,
-despite being listed by "locale". This does not mean that PCRE is broken.
-
-The fifth test checks the experimental, incomplete UTF-8 support. It is not run
-automatically unless PCRE is built with UTF-8 support. This file can be fed
-directly to the perltest8 script, which requires Perl 5.6 or higher. The sixth
-file tests internal UTF-8 features of PCRE that are not relevant to Perl.
-
-
-Character tables
-----------------
-
-PCRE uses four tables for manipulating and identifying characters. The final
-argument of the pcre_compile() function is a pointer to a block of memory
-containing the concatenated tables. A call to pcre_maketables() can be used to
-generate a set of tables in the current locale. If the final argument for
-pcre_compile() is passed as NULL, a set of default tables that is built into
-the binary is used.
-
-The source file called chartables.c contains the default set of tables. This is
-not supplied in the distribution, but is built by the program dftables
-(compiled from dftables.c), which uses the ANSI C character handling functions
-such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table
-sources. This means that the default C locale which is set for your system will
-control the contents of these default tables. You can change the default tables
-by editing chartables.c and then re-building PCRE. If you do this, you should
-probably also edit Makefile to ensure that the file doesn't ever get
-re-generated.
-
-The first two 256-byte tables provide lower casing and case flipping functions,
-respectively. The next table consists of three 32-byte bit maps which identify
-digits, "word" characters, and white space, respectively. These are used when
-building 32-byte bit maps that represent character classes.
-
-The final 256-byte table has bits indicating various character types, as
-follows:
-
-    1   white space character
-    2   letter
-    4   decimal digit
-    8   hexadecimal digit
-   16   alphanumeric or '_'
-  128   regular expression metacharacter or binary zero
-
-You should not alter the set of characters that contain the 128 bit, as that
-will cause PCRE to malfunction.
-
-
-Manifest
---------
-
-The distribution should contain the following files:
-
-(A) The actual source files of the PCRE library functions and their
-    headers:
-
-  dftables.c            auxiliary program for building chartables.c
-  get.c                 )
-  maketables.c          )
-  study.c               ) source of
-  pcre.c                )   the functions
-  pcreposix.c           )
-  pcre.in               "source" for the header for the external API; pcre.h
-                          is built from this by "configure"
-  pcreposix.h           header for the external POSIX wrapper API
-  internal.h            header for internal use
-  config.in             template for config.h, which is built by configure
-
-(B) Auxiliary files:
-
-  AUTHORS               information about the author of PCRE
-  ChangeLog             log of changes to the code
-  INSTALL               generic installation instructions
-  LICENCE               conditions for the use of PCRE
-  COPYING               the same, using GNU's standard name
-  Makefile.in           template for Unix Makefile, which is built by configure
-  NEWS                  important changes in this release
-  NON-UNIX-USE          notes on building PCRE on non-Unix systems
-  README                this file
-  RunTest.in            template for a Unix shell script for running tests
-  config.guess          ) files used by libtool,
-  config.sub            )   used only when building a shared library
-  configure             a configuring shell script (built by autoconf)
-  configure.in          the autoconf input used to build configure
-  doc/Tech.Notes        notes on the encoding
-  doc/pcre.3            man page source for the PCRE functions
-  doc/pcre.html         HTML version
-  doc/pcre.txt          plain text version
-  doc/pcreposix.3       man page source for the POSIX wrapper API
-  doc/pcreposix.html    HTML version
-  doc/pcreposix.txt     plain text version
-  doc/pcretest.txt      documentation of test program
-  doc/perltest.txt      documentation of Perl test program
-  doc/pcregrep.1        man page source for the pcregrep utility
-  doc/pcregrep.html     HTML version
-  doc/pcregrep.txt      plain text version
-  install-sh            a shell script for installing files
-  ltconfig              ) files used to build "libtool",
-  ltmain.sh             )   used only when building a shared library
-  pcretest.c            test program
-  perltest              Perl test program
-  perltest8             Perl test program for UTF-8 tests
-  pcregrep.c            source of a grep utility that uses PCRE
-  pcre-config.in        source of script which retains PCRE information
-  testdata/testinput1   test data, compatible with Perl 5.004 and 5.005
-  testdata/testinput2   test data for error messages and non-Perl things
-  testdata/testinput3   test data, compatible with Perl 5.005
-  testdata/testinput4   test data for locale-specific tests
-  testdata/testinput5   test data for UTF-8 tests compatible with Perl 5.6
-  testdata/testinput6   test data for other UTF-8 tests
-  testdata/testoutput1  test results corresponding to testinput1
-  testdata/testoutput2  test results corresponding to testinput2
-  testdata/testoutput3  test results corresponding to testinput3
-  testdata/testoutput4  test results corresponding to testinput4
-  testdata/testoutput5  test results corresponding to testinput5
-  testdata/testoutput6  test results corresponding to testinput6
-
-(C) Auxiliary files for Win32 DLL
-
-  dll.mk
-  pcre.def
-
-Philip Hazel <ph10@cam.ac.uk>
-August 2000
diff --git a/pcre/get.c b/pcre/get.c
deleted file mode 100644 (file)
index 42e9bd4..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This module contains some convenience functions for extracting substrings
-from the subject string after a regex match has succeeded. The original idea
-for these functions came from Scott Wimer <scottw@cgibuilder.com>. */
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-
-/*************************************************
-*      Copy captured string to given buffer      *
-*************************************************/
-
-/* This function copies a single captured substring into a given buffer.
-Note that we use memcpy() rather than strncpy() in case there are binary zeros
-in the string.
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringnumber   the number of the required substring
-  buffer         where to put the substring
-  size           the size of the buffer
-
-Returns:         if successful:
-                   the length of the copied string, not including the zero
-                   that is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) buffer too small
-                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
-*/
-
-int
-pcre_copy_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, char *buffer, int size)
-{
-int yield;
-if (stringnumber < 0 || stringnumber >= stringcount)
-  return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
-memcpy(buffer, subject + ovector[stringnumber], yield);
-buffer[yield] = 0;
-return yield;
-}
-
-
-
-/*************************************************
-*      Copy all captured strings to new store    *
-*************************************************/
-
-/* This function gets one chunk of store and builds a list of pointers and all
-of the captured substrings in it. A NULL pointer is put on the end of the list.
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  listptr        set to point to the list of pointers
-
-Returns:         if successful: 0
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) failed to get store
-*/
-
-int
-pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
-  const char ***listptr)
-{
-int i;
-int size = sizeof(char *);
-int double_count = stringcount * 2;
-char **stringlist;
-char *p;
-
-for (i = 0; i < double_count; i += 2)
-  size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
-
-stringlist = (char **)(pcre_malloc)(size);
-if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
-
-*listptr = (const char **)stringlist;
-p = (char *)(stringlist + stringcount + 1);
-
-for (i = 0; i < double_count; i += 2)
-  {
-  int len = ovector[i+1] - ovector[i];
-  memcpy(p, subject + ovector[i], len);
-  *stringlist++ = p;
-  p += len;
-  *p++ = 0;
-  }
-
-*stringlist = NULL;
-return 0;
-}
-
-
-
-/*************************************************
-*   Free store obtained by get_substring_list    *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument:   the result of a previous pcre_get_substring_list()
-Returns:    nothing
-*/
-
-void
-pcre_free_substring_list(const char **pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-
-
-/*************************************************
-*      Copy captured string to new store         *
-*************************************************/
-
-/* This function copies a single captured substring into a piece of new
-store
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringnumber   the number of the required substring
-  stringptr      where to put a pointer to the substring
-
-Returns:         if successful:
-                   the length of the string, not including the zero that
-                   is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) failed to get store
-                   PCRE_ERROR_NOSUBSTRING (-7) substring not present
-*/
-
-int
-pcre_get_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, const char **stringptr)
-{
-int yield;
-char *substring;
-if (stringnumber < 0 || stringnumber >= stringcount)
-  return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-substring = (char *)(pcre_malloc)(yield + 1);
-if (substring == NULL) return PCRE_ERROR_NOMEMORY;
-memcpy(substring, subject + ovector[stringnumber], yield);
-substring[yield] = 0;
-*stringptr = substring;
-return yield;
-}
-
-
-
-/*************************************************
-*       Free store obtained by get_substring     *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument:   the result of a previous pcre_get_substring()
-Returns:    nothing
-*/
-
-void
-pcre_free_substring(const char *pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-/* End of get.c */
diff --git a/pcre/install b/pcre/install
deleted file mode 100644 (file)
index 0880281..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-Basic Installation
-==================
-
-   These are generic installation instructions that apply to systems that
-can run the `configure' shell script - Unix systems and any that imitate
-it. They are not specific to PCRE. There are PCRE-specific instructions
-for non-Unix systems in the file NON-UNIX-USE.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
-   The file `configure.in' is used to create `configure' by a program
-called `autoconf'.  You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  You can give `configure'
-initial values for variables by setting them in the environment.  Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
-     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
-     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not supports the `VPATH'
-variable, you have to compile the package for one architecture at a time
-in the source code directory.  After you have installed the package for
-one architecture, use `make distclean' before reconfiguring for another
-architecture.
-
-Installation Names
-==================
-
-   By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on.  Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
-     CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
-   If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
-     Use and save the results of the tests in FILE instead of
-     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
-     debugging `configure'.
-
-`--help'
-     Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--version'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
diff --git a/pcre/install-sh b/pcre/install-sh
deleted file mode 100644 (file)
index e9de238..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-           shift
-           continue;;
-
-       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-           shift
-           continue;;
-
-       *)  if [ x"$src" = x ]
-           then
-               src=$1
-           else
-               # this colon is to work around a 386BSD /bin/sh bug
-               :
-               dst=$1
-           fi
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-       echo "install:  no input file specified"
-       exit 1
-else
-       true
-fi
-
-if [ x"$dir_arg" != x ]; then
-       dst=$src
-       src=""
-       
-       if [ -d $dst ]; then
-               instcmd=:
-               chmodcmd=""
-       else
-               instcmd=mkdir
-       fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f $src -o -d $src ]
-       then
-               true
-       else
-               echo "install:  $src does not exist"
-               exit 1
-       fi
-       
-       if [ x"$dst" = x ]
-       then
-               echo "install:  no destination specified"
-               exit 1
-       else
-               true
-       fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-       if [ -d $dst ]
-       then
-               dst="$dst"/`basename $src`
-       else
-               true
-       fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='   
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
-
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $mkdirprog "${pathcomp}"
-       else
-               true
-       fi
-
-       pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-       $doit $instcmd $dst &&
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-       if [ x"$transformarg" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               dstfile=`basename $dst $transformbasename | 
-                       sed $transformarg`$transformbasename
-       fi
-
-# don't allow the sed command to completely eliminate the filename
-
-       if [ x"$dstfile" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               true
-       fi
-
-# Make a temp file name in the proper directory.
-
-       dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-       $doit $instcmd $src $dsttmp &&
-
-       trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-       $doit $rmcmd -f $dstdir/$dstfile &&
-       $doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff --git a/pcre/internal.h b/pcre/internal.h
deleted file mode 100644 (file)
index 25bb7f8..0000000
+++ /dev/null
@@ -1,381 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-
-/* This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This header contains definitions that are shared between the different
-modules, but which are not relevant to the outside. */
-
-/* Get the definitions provided by running "configure" */
-
-#include "config.h"
-
-/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
-define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
-is set. Otherwise, include an emulating function for those systems that have
-neither (there some non-Unix environments where this is the case). This assumes
-that all calls to memmove are moving strings upwards in store, which is the
-case in PCRE. */
-
-#if ! HAVE_MEMMOVE
-#undef  memmove        /* some systems may have a macro */
-#if HAVE_BCOPY
-#define memmove(a, b, c) bcopy(b, a, c)
-#else
-void *
-pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
-{
-int i;
-dest += n;
-src += n;
-for (i = 0; i < n; ++i) *(--dest) =  *(--src);
-}
-#define memmove(a, b, c) pcre_memmove(a, b, c)
-#endif
-#endif
-
-/* Standard C headers plus the external interface definition */
-
-#include <ctype.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "pcre.h"
-
-/* In case there is no definition of offsetof() provided - though any proper
-Standard C system should have one. */
-
-#ifndef offsetof
-#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
-#endif
-
-/* These are the public options that can change during matching. */
-
-#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
-
-/* Private options flags start at the most significant end of the four bytes,
-but skip the top bit so we can use ints for convenience without getting tangled
-with negative values. The public options defined in pcre.h start at the least
-significant end. Make sure they don't overlap, though now that we have expanded
-to four bytes there is plenty of space. */
-
-#define PCRE_FIRSTSET      0x40000000  /* first_char is set */
-#define PCRE_REQCHSET      0x20000000  /* req_char is set */
-#define PCRE_STARTLINE     0x10000000  /* start after \n for multiline */
-#define PCRE_INGROUP       0x08000000  /* compiling inside a group */
-#define PCRE_ICHANGED      0x04000000  /* i option changes within regex */
-
-/* Options for the "extra" block produced by pcre_study(). */
-
-#define PCRE_STUDY_MAPPED   0x01     /* a map of starting chars exists */
-
-/* Masks for identifying the public options which are permitted at compile
-time, run time or study time, respectively. */
-
-#define PUBLIC_OPTIONS \
-  (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
-   PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8)
-
-#define PUBLIC_EXEC_OPTIONS \
-  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY)
-
-#define PUBLIC_STUDY_OPTIONS 0   /* None defined */
-
-/* Magic number to provide a small check against being handed junk. */
-
-#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
-
-/* Miscellaneous definitions */
-
-typedef int BOOL;
-
-#define FALSE   0
-#define TRUE    1
-
-/* These are escaped items that aren't just an encoding of a particular data
-value such as \n. They must have non-zero values, as check_escape() returns
-their negation. Also, they must appear in the same order as in the opcode
-definitions below, up to ESC_z. The final one must be ESC_REF as subsequent
-values are used for \1, \2, \3, etc. There is a test in the code for an escape
-greater than ESC_b and less than ESC_X to detect the types that may be
-repeated. If any new escapes are put in-between that don't consume a character,
-that code will have to change. */
-
-enum { ESC_A = 1, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w,
-       ESC_Z, ESC_z, ESC_REF };
-
-/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
-that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
-OP_EOD must correspond in order to the list of escapes immediately above. */
-
-enum {
-  OP_END,            /* End of pattern */
-
-  /* Values corresponding to backslashed metacharacters */
-
-  OP_SOD,            /* Start of data: \A */
-  OP_NOT_WORD_BOUNDARY,  /* \B */
-  OP_WORD_BOUNDARY,      /* \b */
-  OP_NOT_DIGIT,          /* \D */
-  OP_DIGIT,              /* \d */
-  OP_NOT_WHITESPACE,     /* \S */
-  OP_WHITESPACE,         /* \s */
-  OP_NOT_WORDCHAR,       /* \W */
-  OP_WORDCHAR,           /* \w */
-  OP_EODN,           /* End of data or \n at end of data: \Z. */
-  OP_EOD,            /* End of data: \z */
-
-  OP_OPT,            /* Set runtime options */
-  OP_CIRC,           /* Start of line - varies with multiline switch */
-  OP_DOLL,           /* End of line - varies with multiline switch */
-  OP_ANY,            /* Match any character */
-  OP_CHARS,          /* Match string of characters */
-  OP_NOT,            /* Match anything but the following char */
-
-  OP_STAR,           /* The maximizing and minimizing versions of */
-  OP_MINSTAR,        /* all these opcodes must come in pairs, with */
-  OP_PLUS,           /* the minimizing one second. */
-  OP_MINPLUS,        /* This first set applies to single characters */
-  OP_QUERY,
-  OP_MINQUERY,
-  OP_UPTO,           /* From 0 to n matches */
-  OP_MINUPTO,
-  OP_EXACT,          /* Exactly n matches */
-
-  OP_NOTSTAR,        /* The maximizing and minimizing versions of */
-  OP_NOTMINSTAR,     /* all these opcodes must come in pairs, with */
-  OP_NOTPLUS,        /* the minimizing one second. */
-  OP_NOTMINPLUS,     /* This first set applies to "not" single characters */
-  OP_NOTQUERY,
-  OP_NOTMINQUERY,
-  OP_NOTUPTO,        /* From 0 to n matches */
-  OP_NOTMINUPTO,
-  OP_NOTEXACT,       /* Exactly n matches */
-
-  OP_TYPESTAR,       /* The maximizing and minimizing versions of */
-  OP_TYPEMINSTAR,    /* all these opcodes must come in pairs, with */
-  OP_TYPEPLUS,       /* the minimizing one second. These codes must */
-  OP_TYPEMINPLUS,    /* be in exactly the same order as those above. */
-  OP_TYPEQUERY,      /* This set applies to character types such as \d */
-  OP_TYPEMINQUERY,
-  OP_TYPEUPTO,       /* From 0 to n matches */
-  OP_TYPEMINUPTO,
-  OP_TYPEEXACT,      /* Exactly n matches */
-
-  OP_CRSTAR,         /* The maximizing and minimizing versions of */
-  OP_CRMINSTAR,      /* all these opcodes must come in pairs, with */
-  OP_CRPLUS,         /* the minimizing one second. These codes must */
-  OP_CRMINPLUS,      /* be in exactly the same order as those above. */
-  OP_CRQUERY,        /* These are for character classes and back refs */
-  OP_CRMINQUERY,
-  OP_CRRANGE,        /* These are different to the three seta above. */
-  OP_CRMINRANGE,
-
-  OP_CLASS,          /* Match a character class */
-  OP_REF,            /* Match a back reference */
-  OP_RECURSE,        /* Match this pattern recursively */
-
-  OP_ALT,            /* Start of alternation */
-  OP_KET,            /* End of group that doesn't have an unbounded repeat */
-  OP_KETRMAX,        /* These two must remain together and in this */
-  OP_KETRMIN,        /* order. They are for groups the repeat for ever. */
-
-  /* The assertions must come before ONCE and COND */
-
-  OP_ASSERT,         /* Positive lookahead */
-  OP_ASSERT_NOT,     /* Negative lookahead */
-  OP_ASSERTBACK,     /* Positive lookbehind */
-  OP_ASSERTBACK_NOT, /* Negative lookbehind */
-  OP_REVERSE,        /* Move pointer back - used in lookbehind assertions */
-
-  /* ONCE and COND must come after the assertions, with ONCE first, as there's
-  a test for >= ONCE for a subpattern that isn't an assertion. */
-
-  OP_ONCE,           /* Once matched, don't back up into the subpattern */
-  OP_COND,           /* Conditional group */
-  OP_CREF,           /* Used to hold an extraction string number */
-
-  OP_BRAZERO,        /* These two must remain together and in this */
-  OP_BRAMINZERO,     /* order. */
-
-  OP_BRA             /* This and greater values are used for brackets that
-                        extract substrings. */
-};
-
-/* The highest extraction number. This is limited by the number of opcodes
-left after OP_BRA, i.e. 255 - OP_BRA. We actually set it somewhat lower. */
-
-#define EXTRACT_MAX  99
-
-/* The texts of compile-time error messages are defined as macros here so that
-they can be accessed by the POSIX wrapper and converted into error codes.  Yes,
-I could have used error codes in the first place, but didn't feel like changing
-just to accommodate the POSIX wrapper. */
-
-#define ERR1  "\\ at end of pattern"
-#define ERR2  "\\c at end of pattern"
-#define ERR3  "unrecognized character follows \\"
-#define ERR4  "numbers out of order in {} quantifier"
-#define ERR5  "number too big in {} quantifier"
-#define ERR6  "missing terminating ] for character class"
-#define ERR7  "invalid escape sequence in character class"
-#define ERR8  "range out of order in character class"
-#define ERR9  "nothing to repeat"
-#define ERR10 "operand of unlimited repeat could match the empty string"
-#define ERR11 "internal error: unexpected repeat"
-#define ERR12 "unrecognized character after (?"
-#define ERR13 "too many capturing parenthesized sub-patterns"
-#define ERR14 "missing )"
-#define ERR15 "back reference to non-existent subpattern"
-#define ERR16 "erroffset passed as NULL"
-#define ERR17 "unknown option bit(s) set"
-#define ERR18 "missing ) after comment"
-#define ERR19 "too many sets of parentheses"
-#define ERR20 "regular expression too large"
-#define ERR21 "failed to get memory"
-#define ERR22 "unmatched parentheses"
-#define ERR23 "internal error: code overflow"
-#define ERR24 "unrecognized character after (?<"
-#define ERR25 "lookbehind assertion is not fixed length"
-#define ERR26 "malformed number after (?("
-#define ERR27 "conditional group contains more than two branches"
-#define ERR28 "assertion expected after (?("
-#define ERR29 "(?p must be followed by )"
-#define ERR30 "unknown POSIX class name"
-#define ERR31 "POSIX collating elements are not supported"
-#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support"
-#define ERR33 "characters with values > 255 are not yet supported in classes"
-#define ERR34 "character value in \\x{...} sequence is too large"
-#define ERR35 "invalid condition (?(0)"
-
-/* All character handling must be done as unsigned characters. Otherwise there
-are problems with top-bit-set characters and functions such as isspace().
-However, we leave the interface to the outside world as char *, because that
-should make things easier for callers. We define a short type for unsigned char
-to save lots of typing. I tried "uchar", but it causes problems on Digital
-Unix, where it is defined in sys/types, so use "uschar" instead. */
-
-typedef unsigned char uschar;
-
-/* The real format of the start of the pcre block; the actual code vector
-runs on as long as necessary after the end. */
-
-typedef struct real_pcre {
-  unsigned long int magic_number;
-  size_t size;
-  const unsigned char *tables;
-  unsigned long int options;
-  uschar top_bracket;
-  uschar top_backref;
-  uschar first_char;
-  uschar req_char;
-  uschar code[1];
-} real_pcre;
-
-/* The real format of the extra block returned by pcre_study(). */
-
-typedef struct real_pcre_extra {
-  uschar options;
-  uschar start_bits[32];
-} real_pcre_extra;
-
-
-/* Structure for passing "static" information around between the functions
-doing the compiling, so that they are thread-safe. */
-
-typedef struct compile_data {
-  const uschar *lcc;            /* Points to lower casing table */
-  const uschar *fcc;            /* Points to case-flipping table */
-  const uschar *cbits;          /* Points to character type table */
-  const uschar *ctypes;         /* Points to table of type maps */
-} compile_data;
-
-/* Structure for passing "static" information around between the functions
-doing the matching, so that they are thread-safe. */
-
-typedef struct match_data {
-  int    errorcode;             /* As it says */
-  int   *offset_vector;         /* Offset vector */
-  int    offset_end;            /* One past the end */
-  int    offset_max;            /* The maximum usable for return data */
-  const uschar *lcc;            /* Points to lower casing table */
-  const uschar *ctypes;         /* Points to table of type maps */
-  BOOL   offset_overflow;       /* Set if too many extractions */
-  BOOL   notbol;                /* NOTBOL flag */
-  BOOL   noteol;                /* NOTEOL flag */
-  BOOL   utf8;                  /* UTF8 flag */
-  BOOL   endonly;               /* Dollar not before final \n */
-  BOOL   notempty;              /* Empty string match not wanted */
-  const uschar *start_pattern;  /* For use when recursing */
-  const uschar *start_subject;  /* Start of the subject string */
-  const uschar *end_subject;    /* End of the subject string */
-  const uschar *start_match;    /* Start of this match attempt */
-  const uschar *end_match_ptr;  /* Subject position at end match */
-  int    end_offset_top;        /* Highwater mark at end of match */
-} match_data;
-
-/* Bit definitions for entries in the pcre_ctypes table. */
-
-#define ctype_space   0x01
-#define ctype_letter  0x02
-#define ctype_digit   0x04
-#define ctype_xdigit  0x08
-#define ctype_word    0x10   /* alphameric or '_' */
-#define ctype_meta    0x80   /* regexp meta char or zero (end pattern) */
-
-/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
-of bits for a class map. Some classes are built by combining these tables. */
-
-#define cbit_space     0      /* [:space:] or \s */
-#define cbit_xdigit   32      /* [:xdigit:] */
-#define cbit_digit    64      /* [:digit:] or \d */
-#define cbit_upper    96      /* [:upper:] */
-#define cbit_lower   128      /* [:lower:] */
-#define cbit_word    160      /* [:word:] or \w */
-#define cbit_graph   192      /* [:graph:] */
-#define cbit_print   224      /* [:print:] */
-#define cbit_punct   256      /* [:punct:] */
-#define cbit_cntrl   288      /* [:cntrl:] */
-#define cbit_length  320      /* Length of the cbits table */
-
-/* Offsets of the various tables from the base tables pointer, and
-total length. */
-
-#define lcc_offset      0
-#define fcc_offset    256
-#define cbits_offset  512
-#define ctypes_offset (cbits_offset + cbit_length)
-#define tables_length (ctypes_offset + 256)
-
-/* End of internal.h */
diff --git a/pcre/licence b/pcre/licence
deleted file mode 100644 (file)
index 34d20db..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-PCRE LICENCE
-------------
-
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-University of Cambridge Computing Service,
-Cambridge, England. Phone: +44 1223 334714.
-
-Copyright (c) 1997-2000 University of Cambridge
-
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission. In practice, this means that if you use
-   PCRE in software which you distribute to others, commercially or
-   otherwise, you must put a sentence like this
-
-     Regular expression support is provided by the PCRE library package,
-     which is open source software, written by Philip Hazel, and copyright
-     by the University of Cambridge, England.
-
-   somewhere reasonably visible in your documentation and in any relevant
-   files or online help data or similar. A reference to the ftp site for
-   the source, that is, to
-
-     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
-   should also be given in the documentation.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
-
-End
diff --git a/pcre/ltconfig b/pcre/ltconfig
deleted file mode 100644 (file)
index a01334f..0000000
+++ /dev/null
@@ -1,3078 +0,0 @@
-#! /bin/sh
-
-# ltconfig - Create a system-specific libtool.
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# A lot of this script is taken from autoconf-2.10.
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-echo=echo
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell.
-  exec "$SHELL" "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit 0
-fi
-
-# Find the correct PATH separator.  Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
-  UNAME=${UNAME-`uname 2>/dev/null`}
-  case X$UNAME in
-    *-DOS) PATH_SEPARATOR=';' ;;
-    *)     PATH_SEPARATOR=':' ;;
-  esac
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-if test "X${echo_test_string+set}" != Xset; then
-  # find a string as large as possible, as long as the shell can cope with it
-  for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-    # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-    if (echo_test_string="`eval $cmd`") 2>/dev/null &&
-       echo_test_string="`eval $cmd`" &&
-       (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
-      break
-    fi
-  done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
-   test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
-  # The Solaris, AIX, and Digital Unix default echo programs unquote
-  # backslashes.  This makes it impossible to quote backslashes using
-  #   echo "$something" | sed 's/\\/\\\\/g'
-  #
-  # So, first we look for a working echo in the user's PATH.
-
-  IFS="${IFS=  }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-  for dir in $PATH /usr/ucb; do
-    if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-       test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-       test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
-      echo="$dir/echo"
-      break
-    fi
-  done
-  IFS="$save_ifs"
-
-  if test "X$echo" = Xecho; then
-    # We didn't find a better echo, so look for alternatives.
-    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-       test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
-      # This shell has a builtin print -r that does the trick.
-      echo='print -r'
-    elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-        test "X$CONFIG_SHELL" != X/bin/ksh; then
-      # If we have ksh, try running ltconfig again with it.
-      ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
-      export ORIGINAL_CONFIG_SHELL
-      CONFIG_SHELL=/bin/ksh
-      export CONFIG_SHELL
-      exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
-    else
-      # Try using printf.
-      echo='printf "%s\n"'
-      if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-        test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
-       # Cool, printf works
-       :
-      elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
-          test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
-       CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
-       export CONFIG_SHELL
-       SHELL="$CONFIG_SHELL"
-       export SHELL
-       echo="$CONFIG_SHELL $0 --fallback-echo"
-      elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
-          test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
-       echo="$CONFIG_SHELL $0 --fallback-echo"
-      else
-       # maybe with a smaller string...
-       prev=:
-
-       for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-         if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
-           break
-         fi
-         prev="$cmd"
-       done
-
-       if test "$prev" != 'sed 50q "$0"'; then
-         echo_test_string=`eval $prev`
-         export echo_test_string
-         exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
-       else
-         # Oops.  We lost completely, so just stick with echo.
-         echo=echo
-       fi
-      fi
-    fi
-  fi
-fi
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# The name of this program.
-progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
-
-# Constants:
-PROGRAM=ltconfig
-PACKAGE=libtool
-VERSION=1.3.4
-TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)"
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-rm="rm -f"
-
-help="Try \`$progname --help' for more information."
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-enable_shared=yes
-# All known linkers require a `.a' archive for static linking (except M$VC,
-# which needs '.lib').
-enable_static=yes
-enable_fast_install=yes
-enable_dlopen=unknown
-enable_win32_dll=no
-ltmain=
-silent=
-srcdir=
-ac_config_guess=
-ac_config_sub=
-host=
-nonopt=
-ofile="$default_ofile"
-verify_host=yes
-with_gcc=no
-with_gnu_ld=no
-need_locks=yes
-ac_ext=c
-objext=o
-libext=a
-exeext=
-cache_file=
-
-old_AR="$AR"
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-old_CPPFLAGS="$CPPFLAGS"
-old_LDFLAGS="$LDFLAGS"
-old_LD="$LD"
-old_LN_S="$LN_S"
-old_LIBS="$LIBS"
-old_NM="$NM"
-old_RANLIB="$RANLIB"
-old_DLLTOOL="$DLLTOOL"
-old_OBJDUMP="$OBJDUMP"
-old_AS="$AS"
-
-# Parse the command line options.
-args=
-prev=
-for option
-do
-  case "$option" in
-  -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$prev"; then
-    eval "$prev=\$option"
-    prev=
-    continue
-  fi
-
-  case "$option" in
-  --help) cat <<EOM
-Usage: $progname [OPTION]... [HOST [LTMAIN]]
-
-Generate a system-specific libtool script.
-
-    --debug                enable verbose shell tracing
-    --disable-shared       do not build shared libraries
-    --disable-static       do not build static libraries
-    --disable-fast-install do not optimize for fast installation
-    --enable-dlopen        enable dlopen support
-    --enable-win32-dll     enable building dlls on win32 hosts
-    --help                 display this help and exit
-    --no-verify            do not verify that HOST is a valid host type
--o, --output=FILE          specify the output file [default=$default_ofile]
-    --quiet                same as \`--silent'
-    --silent               do not print informational messages
-    --srcdir=DIR           find \`config.guess' in DIR
-    --version              output version information and exit
-    --with-gcc             assume that the GNU C compiler will be used
-    --with-gnu-ld          assume that the C compiler uses the GNU linker
-    --disable-lock         disable file locking
-    --cache-file=FILE      configure cache file
-
-LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
-that provides basic libtool functionality.
-
-HOST is the canonical host system name [default=guessed].
-EOM
-  exit 0
-  ;;
-
-  --debug)
-    echo "$progname: enabling shell trace mode"
-    set -x
-    ;;
-
-  --disable-shared) enable_shared=no ;;
-
-  --disable-static) enable_static=no ;;
-
-  --disable-fast-install) enable_fast_install=no ;;
-
-  --enable-dlopen) enable_dlopen=yes ;;
-
-  --enable-win32-dll) enable_win32_dll=yes ;;
-
-  --quiet | --silent) silent=yes ;;
-
-  --srcdir) prev=srcdir ;;
-  --srcdir=*) srcdir="$optarg" ;;
-
-  --no-verify) verify_host=no ;;
-
-  --output | -o) prev=ofile ;;
-  --output=*) ofile="$optarg" ;;
-
-  --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"; exit 0 ;;
-
-  --with-gcc) with_gcc=yes ;;
-  --with-gnu-ld) with_gnu_ld=yes ;;
-
-  --disable-lock) need_locks=no ;;
-
-  --cache-file=*) cache_file="$optarg" ;;
-
-  -*)
-    echo "$progname: unrecognized option \`$option'" 1>&2
-    echo "$help" 1>&2
-    exit 1
-    ;;
-
-  *)
-    if test -z "$ltmain"; then
-      ltmain="$option"
-    elif test -z "$host"; then
-# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
-#      if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
-#        echo "$progname: warning \`$option' is not a valid host type" 1>&2
-#      fi
-      host="$option"
-    else
-      echo "$progname: too many arguments" 1>&2
-      echo "$help" 1>&2
-      exit 1
-    fi ;;
-  esac
-done
-
-if test -z "$ltmain"; then
-  echo "$progname: you must specify a LTMAIN file" 1>&2
-  echo "$help" 1>&2
-  exit 1
-fi
-
-if test ! -f "$ltmain"; then
-  echo "$progname: \`$ltmain' does not exist" 1>&2
-  echo "$help" 1>&2
-  exit 1
-fi
-
-# Quote any args containing shell metacharacters.
-ltconfig_args=
-for arg
-do
-  case "$arg" in
-  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ltconfig_args="$ltconfig_args '$arg'" ;;
-  *) ltconfig_args="$ltconfig_args $arg" ;;
-  esac
-done
-
-# A relevant subset of AC_INIT.
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 5 compiler messages saved in config.log
-# 6 checking for... messages and results
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>>./config.log
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi
-if test "X${LANG+set}"   = Xset; then LANG=C;   export LANG;   fi
-
-if test -n "$cache_file" && test -r "$cache_file"; then
-  echo "loading cache $cache_file within ltconfig"
-  . $cache_file
-fi
-
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='       '
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-if test -z "$srcdir"; then
-  # Assume the source directory is the same one as the path to LTMAIN.
-  srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'`
-  test "$srcdir" = "$ltmain" && srcdir=.
-fi
-
-trap "$rm conftest*; exit 1" 1 2 15
-if test "$verify_host" = yes; then
-  # Check for config.guess and config.sub.
-  ac_aux_dir=
-  for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-    if test -f $ac_dir/config.guess; then
-      ac_aux_dir=$ac_dir
-      break
-    fi
-  done
-  if test -z "$ac_aux_dir"; then
-    echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
-    echo "$help" 1>&2
-    exit 1
-  fi
-  ac_config_guess=$ac_aux_dir/config.guess
-  ac_config_sub=$ac_aux_dir/config.sub
-
-  # Make sure we can run config.sub.
-  if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
-  else
-    echo "$progname: cannot run $ac_config_sub" 1>&2
-    echo "$help" 1>&2
-    exit 1
-  fi
-
-  echo $ac_n "checking host system type""... $ac_c" 1>&6
-
-  host_alias=$host
-  case "$host_alias" in
-  "")
-    if host_alias=`$SHELL $ac_config_guess`; then :
-    else
-      echo "$progname: cannot guess host type; you must specify one" 1>&2
-      echo "$help" 1>&2
-      exit 1
-    fi ;;
-  esac
-  host=`$SHELL $ac_config_sub $host_alias`
-  echo "$ac_t$host" 1>&6
-
-  # Make sure the host verified.
-  test -z "$host" && exit 1
-
-elif test -z "$host"; then
-  echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
-  echo "$help" 1>&2
-  exit 1
-else
-  host_alias=$host
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case "$host_os" in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-case "$host_os" in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR cru $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-# Set a sane default for `AR'.
-test -z "$AR" && AR=ar
-
-# Set a sane default for `OBJDUMP'.
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-# If RANLIB is not set, then run the test.
-if test "${RANLIB+set}" != "set"; then
-  result=no
-
-  echo $ac_n "checking for ranlib... $ac_c" 1>&6
-  IFS="${IFS=  }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-  for dir in $PATH; do
-    test -z "$dir" && dir=.
-    if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then
-      RANLIB="ranlib"
-      result="ranlib"
-      break
-    fi
-  done
-  IFS="$save_ifs"
-
-  echo "$ac_t$result" 1>&6
-fi
-
-if test -n "$RANLIB"; then
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-  old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
-fi
-
-# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin.
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$AS" && AS=as
-
-# Check to see if we are using GCC.
-if test "$with_gcc" != yes || test -z "$CC"; then
-  # If CC is not set, then try to find GCC or a usable CC.
-  if test -z "$CC"; then
-    echo $ac_n "checking for gcc... $ac_c" 1>&6
-    IFS="${IFS=        }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-    for dir in $PATH; do
-      test -z "$dir" && dir=.
-      if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then
-       CC="gcc"
-       break
-      fi
-    done
-    IFS="$save_ifs"
-
-    if test -n "$CC"; then
-      echo "$ac_t$CC" 1>&6
-    else
-      echo "$ac_t"no 1>&6
-    fi
-  fi
-
-  # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
-  if test -z "$CC"; then
-    echo $ac_n "checking for cc... $ac_c" 1>&6
-    IFS="${IFS=        }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-    cc_rejected=no
-    for dir in $PATH; do
-      test -z "$dir" && dir=.
-      if test -f $dir/cc || test -f $dir/cc$ac_exeext; then
-       if test "$dir/cc" = "/usr/ucb/cc"; then
-         cc_rejected=yes
-         continue
-       fi
-       CC="cc"
-       break
-      fi
-    done
-    IFS="$save_ifs"
-    if test $cc_rejected = yes; then
-      # We found a bogon in the path, so make sure we never use it.
-      set dummy $CC
-      shift
-      if test $# -gt 0; then
-       # We chose a different compiler from the bogus one.
-       # However, it has the same name, so the bogon will be chosen
-       # first if we set CC to just the name; use the full file name.
-       shift
-       set dummy "$dir/cc" "$@"
-       shift
-       CC="$@"
-      fi
-    fi
-
-    if test -n "$CC"; then
-      echo "$ac_t$CC" 1>&6
-    else
-      echo "$ac_t"no 1>&6
-    fi
-
-    if test -z "$CC"; then
-      echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
-      exit 1
-    fi
-  fi
-
-  # Now see if the compiler is really GCC.
-  with_gcc=no
-  echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
-  echo "$progname:581: checking whether we are using GNU C" >&5
-
-  $rm conftest.c
-  cat > conftest.c <<EOF
-#ifdef __GNUC__
-  yes;
-#endif
-EOF
-  if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:589: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-    with_gcc=yes
-  fi
-  $rm conftest.c
-  echo "$ac_t$with_gcc" 1>&6
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="$2"
-
-echo $ac_n "checking for object suffix... $ac_c" 1>&6
-$rm conftest*
-echo 'int i = 1;' > conftest.c
-echo "$progname:603: checking for object suffix" >& 5
-if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
-  # Append any warnings to the config.log.
-  cat conftest.err 1>&5
-
-  for ac_file in conftest.*; do
-    case $ac_file in
-    *.c) ;;
-    *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
-    esac
-  done
-else
-  cat conftest.err 1>&5
-  echo "$progname: failed program was:" >&5
-  cat conftest.c >&5
-fi
-$rm conftest*
-echo "$ac_t$objext" 1>&6
-
-echo $ac_n "checking for executable suffix... $ac_c" 1>&6
-if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_cv_exeext="no"
-  $rm conftest*
-  echo 'main () { return 0; }' > conftest.c
-  echo "$progname:629: checking for executable suffix" >& 5
-  if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then
-    # Append any warnings to the config.log.
-    cat conftest.err 1>&5
-
-    for ac_file in conftest.*; do
-      case $ac_file in
-      *.c | *.err | *.$objext ) ;;
-      *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;;
-      esac
-    done
-  else
-    cat conftest.err 1>&5
-    echo "$progname: failed program was:" >&5
-    cat conftest.c >&5
-  fi
-  $rm conftest*
-fi
-if test "X$ac_cv_exeext" = Xno; then
-  exeext=""
-else
-  exeext="$ac_cv_exeext"
-fi
-echo "$ac_t$ac_cv_exeext" 1>&6
-
-echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
-pic_flag=
-special_shlib_compile_flags=
-wl=
-link_static_flag=
-no_builtin_flag=
-
-if test "$with_gcc" = yes; then
-  wl='-Wl,'
-  link_static_flag='-static'
-
-  case "$host_os" in
-  beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
-    # PIC is the default for these OSes.
-    ;;
-  aix*)
-    # Below there is a dirty hack to force normal static linking with -ldl
-    # The problem is because libdl dynamically linked with both libc and
-    # libC (AIX C++ library), which obviously doesn't included in libraries
-    # list by gcc. This cause undefined symbols with -static flags.
-    # This hack allows C programs to be linked with "-static -ldl", but
-    # we not sure about C++ programs.
-    link_static_flag="$link_static_flag ${wl}-lC"
-    ;;
-  cygwin* | mingw* | os2*)
-    # We can build DLLs from non-PIC.
-    ;;
-  amigaos*)
-    # FIXME: we need at least 68020 code to build shared libraries, but
-    # adding the `-m68020' flag to GCC prevents building anything better,
-    # like `-m68040'.
-    pic_flag='-m68020 -resident32 -malways-restore-a4'
-    ;;
-  sysv4*MP*)
-    if test -d /usr/nec; then
-       pic_flag=-Kconform_pic
-    fi
-    ;;
-  *)
-    pic_flag='-fPIC'
-    ;;
-  esac
-else
-  # PORTME Check for PIC flags for the system compiler.
-  case "$host_os" in
-  aix3* | aix4*)
-    # All AIX code is PIC.
-    link_static_flag='-bnso -bI:/lib/syscalls.exp'
-    ;;
-
-  hpux9* | hpux10* | hpux11*)
-    # Is there a better link_static_flag that works with the bundled CC?
-    wl='-Wl,'
-    link_static_flag="${wl}-a ${wl}archive"
-    pic_flag='+Z'
-    ;;
-
-  irix5* | irix6*)
-    wl='-Wl,'
-    link_static_flag='-non_shared'
-    # PIC (with -KPIC) is the default.
-    ;;
-
-  cygwin* | mingw* | os2*)
-    # We can build DLLs from non-PIC.
-    ;;
-
-  osf3* | osf4* | osf5*)
-    # All OSF/1 code is PIC.
-    wl='-Wl,'
-    link_static_flag='-non_shared'
-    ;;
-
-  sco3.2v5*)
-    pic_flag='-Kpic'
-    link_static_flag='-dn'
-    special_shlib_compile_flags='-belf'
-    ;;
-
-  solaris*)
-    pic_flag='-KPIC'
-    link_static_flag='-Bstatic'
-    wl='-Wl,'
-    ;;
-
-  sunos4*)
-    pic_flag='-PIC'
-    link_static_flag='-Bstatic'
-    wl='-Qoption ld '
-    ;;
-
-  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-    pic_flag='-KPIC'
-    link_static_flag='-Bstatic'
-    wl='-Wl,'
-    ;;
-
-  uts4*)
-    pic_flag='-pic'
-    link_static_flag='-Bstatic'
-    ;;
-  sysv4*MP*)
-    if test -d /usr/nec ;then
-      pic_flag='-Kconform_pic'
-      link_static_flag='-Bstatic'
-    fi
-    ;;
-  *)
-    can_build_shared=no
-    ;;
-  esac
-fi
-
-if test -n "$pic_flag"; then
-  echo "$ac_t$pic_flag" 1>&6
-
-  # Check to make sure the pic_flag actually works.
-  echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
-  $rm conftest*
-  echo "int some_variable = 0;" > conftest.c
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS $pic_flag -DPIC"
-  echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5
-  if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
-    # Append any warnings to the config.log.
-    cat conftest.err 1>&5
-    
-    case "$host_os" in
-    hpux9* | hpux10* | hpux11*)
-      # On HP-UX, both CC and GCC only warn that PIC is supported... then they
-      # create non-PIC objects.  So, if there were any warnings, we assume that
-      # PIC is not supported.
-      if test -s conftest.err; then
-       echo "$ac_t"no 1>&6
-       can_build_shared=no
-       pic_flag=
-      else
-       echo "$ac_t"yes 1>&6
-       pic_flag=" $pic_flag"
-      fi
-      ;;
-    *)
-      echo "$ac_t"yes 1>&6
-      pic_flag=" $pic_flag"
-      ;;
-    esac
-  else
-    # Append any errors to the config.log.
-    cat conftest.err 1>&5
-    can_build_shared=no
-    pic_flag=
-    echo "$ac_t"no 1>&6
-  fi
-  CFLAGS="$save_CFLAGS"
-  $rm conftest*
-else
-  echo "$ac_t"none 1>&6
-fi
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
-$rm -r conftest 2>/dev/null
-mkdir conftest
-cd conftest
-$rm conftest*
-echo "int some_variable = 0;" > conftest.c
-mkdir out
-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
-# that will create temporary files in the current directory regardless of
-# the output directory.  Thus, making CWD read-only will cause this test
-# to fail, enabling locking or at least warning the user not to do parallel
-# builds.
-chmod -w .
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -o out/conftest2.o"
-echo "$progname:829: checking if $compiler supports -c -o file.o" >&5
-if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then
-
-  # The compiler can only warn and ignore the option if not recognized
-  # So say no if there are warnings
-    if test -s out/conftest.err; then
-      echo "$ac_t"no 1>&6
-      compiler_c_o=no
-    else
-      echo "$ac_t"yes 1>&6
-      compiler_c_o=yes
-    fi
-else
-  # Append any errors to the config.log.
-  cat out/conftest.err 1>&5
-  compiler_c_o=no
-  echo "$ac_t"no 1>&6
-fi
-CFLAGS="$save_CFLAGS"
-chmod u+w .
-$rm conftest* out/*
-rmdir out
-cd ..
-rmdir conftest
-$rm -r conftest 2>/dev/null
-
-if test x"$compiler_c_o" = x"yes"; then
-  # Check to see if we can write to a .lo
-  echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
-  $rm conftest*
-  echo "int some_variable = 0;" > conftest.c
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -c -o conftest.lo"
-  echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5
-if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
-
-    # The compiler can only warn and ignore the option if not recognized
-    # So say no if there are warnings
-      if test -s conftest.err; then
-       echo "$ac_t"no 1>&6
-       compiler_o_lo=no
-      else
-       echo "$ac_t"yes 1>&6
-       compiler_o_lo=yes
-      fi
-  else
-    # Append any errors to the config.log.
-    cat conftest.err 1>&5
-    compiler_o_lo=no
-    echo "$ac_t"no 1>&6
-  fi
-  CFLAGS="$save_CFLAGS"
-  $rm conftest*
-else
-  compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
-  hard_links=yes
-  $rm conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  echo "$ac_t$hard_links" 1>&6
-  $rm conftest*
-  if test "$hard_links" = no; then
-    echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-if test "$with_gcc" = yes; then
-  # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
-  echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
-  $rm conftest*
-  echo "int some_variable = 0;" > conftest.c
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
-  echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-  if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
-
-    # The compiler can only warn and ignore the option if not recognized
-    # So say no if there are warnings
-      if test -s conftest.err; then
-       echo "$ac_t"no 1>&6
-       compiler_rtti_exceptions=no
-      else
-       echo "$ac_t"yes 1>&6
-       compiler_rtti_exceptions=yes
-      fi
-  else
-    # Append any errors to the config.log.
-    cat conftest.err 1>&5
-    compiler_rtti_exceptions=no
-    echo "$ac_t"no 1>&6
-  fi
-  CFLAGS="$save_CFLAGS"
-  $rm conftest*
-
-  if test "$compiler_rtti_exceptions" = "yes"; then
-    no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
-  else
-    no_builtin_flag=' -fno-builtin'
-  fi
-  
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$special_shlib_compile_flags"; then
-  echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
-  if echo "$old_CC $old_CFLAGS " | egrep -e "[         ]$special_shlib_compile_flags[  ]" >/dev/null; then :
-  else
-    echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
-    can_build_shared=no
-  fi
-fi
-
-echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
-$rm conftest*
-echo 'main(){return(0);}' > conftest.c
-save_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS $link_static_flag"
-echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5
-if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  echo "$ac_t$link_static_flag" 1>&6
-else
-  echo "$ac_t"none 1>&6
-  link_static_flag=
-fi
-LDFLAGS="$save_LDFLAGS"
-$rm conftest*
-
-if test -z "$LN_S"; then
-  # Check to see if we can use ln -s, or we need hard links.
-  echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
-  $rm conftest.dat
-  if ln -s X conftest.dat 2>/dev/null; then
-    $rm conftest.dat
-    LN_S="ln -s"
-  else
-    LN_S=ln
-  fi
-  if test "$LN_S" = "ln -s"; then
-    echo "$ac_t"yes 1>&6
-  else
-    echo "$ac_t"no 1>&6
-  fi
-fi
-
-# Make sure LD is an absolute path.
-if test -z "$LD"; then
-  ac_prog=ld
-  if test "$with_gcc" = yes; then
-    # Check if gcc -print-prog-name=ld gives a path.
-    echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
-    echo "$progname:991: checking for ld used by GCC" >&5
-    ac_prog=`($CC -print-prog-name=ld) 2>&5`
-    case "$ac_prog" in
-    # Accept absolute paths.
-    [\\/]* | [A-Za-z]:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the path of ld
-      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
-      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
-       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-    "")
-      # If it fails, then pretend we are not using GCC.
-      ac_prog=ld
-      ;;
-    *)
-      # If it is relative, then search for the first ld in PATH.
-      with_gnu_ld=unknown
-      ;;
-    esac
-  elif test "$with_gnu_ld" = yes; then
-    echo $ac_n "checking for GNU ld... $ac_c" 1>&6
-    echo "$progname:1015: checking for GNU ld" >&5
-  else
-    echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-    echo "$progname:1018: checking for non-GNU ld" >&5
-  fi
-
-  if test -z "$LD"; then
-    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-    for ac_dir in $PATH; do
-      test -z "$ac_dir" && ac_dir=.
-      if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-       LD="$ac_dir/$ac_prog"
-       # Check to see if the program is GNU ld.  I'd rather use --version,
-       # but apparently some GNU ld's only accept -v.
-       # Break only if it was the GNU/non-GNU ld that we prefer.
-       if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
-         test "$with_gnu_ld" != no && break
-       else
-         test "$with_gnu_ld" != yes && break
-       fi
-      fi
-    done
-    IFS="$ac_save_ifs"
-  fi
-
-  if test -n "$LD"; then
-    echo "$ac_t$LD" 1>&6
-  else
-    echo "$ac_t"no 1>&6
-  fi
-
-  if test -z "$LD"; then
-    echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
-    exit 1
-  fi
-fi
-
-# Check to see if it really is or is not GNU ld.
-echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
-# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
-  with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-echo "$ac_t$with_gnu_ld" 1>&6
-
-# See if the linker supports building shared libraries.
-echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
-
-allow_undefined_flag=
-no_undefined_flag=
-need_lib_prefix=unknown
-need_version=unknown
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-archive_cmds=
-archive_expsym_cmds=
-old_archive_from_new_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-thread_safe_flag_spec=
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-always_export_symbols=no
-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
-# include_expsyms should be a list of space-separated symbols to be *always*
-# included in the symbol list
-include_expsyms=
-# exclude_expsyms can be an egrep regular expression of symbols to exclude
-# it will be wrapped by ` (' and `)$', so one must not match beginning or
-# end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-# as well as any symbol that contains `d'.
-exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-# platforms (ab)use it in PIC code, but their linkers get confused if
-# the symbol is explicitly referenced.  Since portable code cannot
-# rely on this symbol name, it's probably fine to never include it in
-# preloaded symbol tables.
-
-case "$host_os" in
-cygwin* | mingw*)
-  # FIXME: the MSVC++ port hasn't been tested in a loooong time
-  # When not using gcc, we currently assume that we are using
-  # Microsoft Visual C++.
-  if test "$with_gcc" != yes; then
-    with_gnu_ld=no
-  fi
-  ;;
-
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
-  # If archive_cmds runs LD, not CC, wlarc should be empty
-  wlarc='${wl}'
-
-  # See if GNU ld supports shared libraries.
-  case "$host_os" in
-  aix3* | aix4*)
-    # On AIX, the GNU linker is very broken
-    ld_shlibs=no
-    cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
-    ;;
-
-  amigaos*)
-    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_minus_L=yes
-
-    # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
-    # that the semantics of dynamic libraries on AmigaOS, at least up
-    # to version 4, is to share data among multiple programs linked
-    # with the same dynamic library.  Since this doesn't match the
-    # behavior of shared libraries on other platforms, we can use
-    # them.
-    ld_shlibs=no
-    ;;
-
-  beos*)
-    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
-      allow_undefined_flag=unsupported
-      # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-      # support --undefined.  This deserves some investigation.  FIXME
-      archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
-    else
-      ld_shlibs=no
-    fi
-    ;;
-
-  cygwin* | mingw*)
-    # hardcode_libdir_flag_spec is actually meaningless, as there is
-    # no search path for DLLs.
-    hardcode_libdir_flag_spec='-L$libdir'
-    allow_undefined_flag=unsupported
-    always_export_symbols=yes
-
-    # Extract the symbol export list from an `--export-all' def file,
-    # then regenerate the def file from the symbol export list, so that
-    # the compiled dll only exports the symbol export list.
-    export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
-      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
-      $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def  $objdir/$soname-ltdll.$objext $libobjs $convenience~
-      sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols'
-
-    archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~
-      _lt_hint=1;
-      for symbol in `cat $export_symbols`; do
-       echo "  \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def;
-       _lt_hint=`expr 1 + \$_lt_hint`;
-      done~
-      test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~
-      test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~
-      $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
-      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
-      $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~
-      $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~
-      $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts'
-
-      old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' 
-    ;;
-
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
-      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-    else
-      archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib'
-      # can we support soname and/or expsyms with a.out? -oliva
-    fi
-    ;;
-
-  solaris* | sysv5*)
-    if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
-      ld_shlibs=no
-      cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
-    elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
-      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
-      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-    else
-      ld_shlibs=no
-    fi
-    ;;      
-
-  sunos4*)
-    archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts'
-    wlarc=
-    hardcode_direct=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  *)
-    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
-      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib'
-      archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-    else
-      ld_shlibs=no
-    fi
-    ;;
-  esac
-
-  if test "$ld_shlibs" = yes; then
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    case $host_os in
-    cygwin* | mingw*)
-      # dlltool doesn't understand --whole-archive et. al.
-      whole_archive_flag_spec=
-      ;;
-    *)
-      # ancient GNU ld didn't support --whole-archive et. al.
-      if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
-        whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-      else
-        whole_archive_flag_spec=
-      fi
-      ;;
-    esac
-  fi
-else
-  # PORTME fill in a description of your system's linker (not GNU ld)
-  case "$host_os" in
-  aix3*)
-    allow_undefined_flag=unsupported
-    always_export_symbols=yes
-    archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
-    # Note: this linker hardcodes the directories in LIBPATH if there
-    # are no directories specified by -L.
-    hardcode_minus_L=yes
-    if test "$with_gcc" = yes && test -z "$link_static_flag"; then
-      # Neither direct hardcoding nor static linking is supported with a
-      # broken collect2.
-      hardcode_direct=unsupported
-    fi
-    ;;
-
-  aix4*)
-    hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib'
-    hardcode_libdir_separator=':'
-    if test "$with_gcc" = yes; then
-      collect2name=`${CC} -print-prog-name=collect2`
-      if test -f "$collect2name" && \
-        strings "$collect2name" | grep resolve_lib_name >/dev/null
-      then
-       # We have reworked collect2
-       hardcode_direct=yes
-      else
-       # We have old collect2
-       hardcode_direct=unsupported
-       # It fails to find uninstalled libraries when the uninstalled
-       # path is not listed in the libpath.  Setting hardcode_minus_L
-       # to unsupported forces relinking
-       hardcode_minus_L=yes
-       hardcode_libdir_flag_spec='-L$libdir'
-       hardcode_libdir_separator=
-      fi
-      shared_flag='-shared'
-    else
-      shared_flag='${wl}-bM:SRE'
-      hardcode_direct=yes
-    fi
-    allow_undefined_flag=' ${wl}-berok'
-    archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}'
-    archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}'
-    case "$host_os" in aix4.[01]|aix4.[01].*)
-      # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on
-      always_export_symbols=yes ;;
-    esac
-   ;;
-
-  amigaos*)
-    archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_minus_L=yes
-    # see comment about different semantics on the GNU ld section
-    ld_shlibs=no
-    ;;
-
-  cygwin* | mingw*)
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    # hardcode_libdir_flag_spec is actually meaningless, as there is
-    # no search path for DLLs.
-    hardcode_libdir_flag_spec=' '
-    allow_undefined_flag=unsupported
-    # Tell ltmain to make .lib files, not .a files.
-    libext=lib
-    # FIXME: Setting linknames here is a bad hack.
-    archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-    # The linker will automatically build a .lib file if we build a DLL.
-    old_archive_from_new_cmds='true'
-    # FIXME: Should let the user specify the lib program.
-    old_archive_cmds='lib /OUT:$oldlib$oldobjs'
-    fix_srcfile_path='`cygpath -w $srcfile`'
-    ;;
-
-  freebsd1*)
-    ld_shlibs=no
-    ;;
-
-  # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-  # support.  Future versions do this automatically, but an explicit c++rt0.o
-  # does not break anything, and helps significantly (at the cost of a little
-  # extra space).
-  freebsd2.2*)
-    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o'
-    hardcode_libdir_flag_spec='-R$libdir'
-    hardcode_direct=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-  freebsd2*)
-    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
-    hardcode_direct=yes
-    hardcode_minus_L=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-  freebsd*)
-    archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts'
-    hardcode_libdir_flag_spec='-R$libdir'
-    hardcode_direct=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  hpux9* | hpux10* | hpux11*)
-    case "$host_os" in
-    hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;;
-    *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;;
-    esac
-    hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-    hardcode_libdir_separator=:
-    hardcode_direct=yes
-    hardcode_minus_L=yes # Not in the search PATH, but as the default
-                        # location of the library.
-    export_dynamic_flag_spec='${wl}-E'
-    ;;
-
-  irix5* | irix6*)
-    if test "$with_gcc" = yes; then
-      archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
-    else
-      archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
-    fi
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    hardcode_libdir_separator=:
-    ;;
-
-  netbsd*)
-    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'  # a.out
-    else
-      archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts'      # ELF
-    fi
-    hardcode_libdir_flag_spec='${wl}-R$libdir'
-    hardcode_direct=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  openbsd*)
-    archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts'
-    hardcode_libdir_flag_spec='-R$libdir'
-    hardcode_direct=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  os2*)
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_minus_L=yes
-    allow_undefined_flag=unsupported
-    archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def'
-    old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
-    ;;
-
-  osf3*)
-    if test "$with_gcc" = yes; then
-      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
-    else
-      allow_undefined_flag=' -expect_unresolved \*'
-      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
-    fi
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    hardcode_libdir_separator=:
-    ;;
-
-  osf4* | osf5*)  # As osf3* with the addition of the -msym flag
-    if test "$with_gcc" = yes; then
-      allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-      archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
-    else
-      allow_undefined_flag=' -expect_unresolved \*'
-      archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
-    fi
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    hardcode_libdir_separator=:
-    ;;
-
-  sco3.2v5*)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    hardcode_shlibpath_var=no
-    runpath_var=LD_RUN_PATH
-    hardcode_runpath_var=yes
-    ;;
-
-  solaris*)
-    no_undefined_flag=' -z text'
-    # $CC -shared without GNU ld will not create a library from C++
-    # object files and a static libstdc++, better avoid it by now
-    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
-    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
-    hardcode_libdir_flag_spec='-R$libdir'
-    hardcode_shlibpath_var=no
-    case "$host_os" in
-    solaris2.[0-5] | solaris2.[0-5].*) ;;
-    *) # Supported since Solaris 2.6 (maybe 2.5.1?)
-      whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
-    esac
-    ;;
-
-  sunos4*)
-    archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts'
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_direct=yes
-    hardcode_minus_L=yes
-    hardcode_shlibpath_var=no
-    ;;
-
-  sysv4)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    runpath_var='LD_RUN_PATH'
-    hardcode_shlibpath_var=no
-    hardcode_direct=no #Motorola manual says yes, but my tests say they lie 
-    ;;  
-
-  sysv4.3*)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    hardcode_shlibpath_var=no
-    export_dynamic_flag_spec='-Bexport'
-    ;;
-
-  sysv5*)
-    no_undefined_flag=' -z text'
-    # $CC -shared without GNU ld will not create a library from C++
-    # object files and a static libstdc++, better avoid it by now
-    archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts'
-    archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
-               $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp'
-    hardcode_libdir_flag_spec=
-    hardcode_shlibpath_var=no
-    runpath_var='LD_RUN_PATH'
-    ;;
-
-  uts4*)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_shlibpath_var=no
-    ;;
-
-  dgux*)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    hardcode_libdir_flag_spec='-L$libdir'
-    hardcode_shlibpath_var=no
-    ;;
-
-  sysv4*MP*)
-    if test -d /usr/nec; then
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-      hardcode_shlibpath_var=no
-      runpath_var=LD_RUN_PATH
-      hardcode_runpath_var=yes
-      ld_shlibs=yes
-    fi
-    ;;
-
-  sysv4.2uw2*)
-    archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts'
-    hardcode_direct=yes
-    hardcode_minus_L=no
-    hardcode_shlibpath_var=no
-    hardcode_runpath_var=yes
-    runpath_var=LD_RUN_PATH
-    ;;
-
-  unixware7*)
-    archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts'
-    runpath_var='LD_RUN_PATH'
-    hardcode_shlibpath_var=no
-    ;;
-
-  *)
-    ld_shlibs=no
-    ;;
-  esac
-fi
-echo "$ac_t$ld_shlibs" 1>&6
-test "$ld_shlibs" = no && can_build_shared=no
-
-if test -z "$NM"; then
-  echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
-  case "$NM" in
-  [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path.
-  *)
-    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}"
-    for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do
-      test -z "$ac_dir" && ac_dir=.
-      if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then
-       # Check to see if the nm accepts a BSD-compat flag.
-       # Adding the `sed 1q' prevents false positives on HP-UX, which says:
-       #   nm: unknown option "B" ignored
-       if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-         NM="$ac_dir/nm -B"
-         break
-       elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
-         NM="$ac_dir/nm -p"
-         break
-       else
-         NM=${NM="$ac_dir/nm"} # keep the first match, but
-         continue # so that we can try to find one that supports BSD flags
-       fi
-      fi
-    done
-    IFS="$ac_save_ifs"
-    test -z "$NM" && NM=nm
-    ;;
-  esac
-  echo "$ac_t$NM" 1>&6
-fi
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \2\3 \3'
-
-# Transform an extracted symbol line into a proper C declaration
-global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
-
-# Define system-specific variables.
-case "$host_os" in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*) # Its linker distinguishes data from code symbols
-  global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'"
-  ;;
-irix*)
-  symcode='[BCDEGRST]'
-  ;;
-solaris*)
-  symcode='[BDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
-  symcode='[ABCDGISTW]'
-fi
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Write the raw and C identifiers.
-  global_symbol_pipe="sed -n -e 's/^.*[        ]\($symcode\)[  ][      ]*\($ac_symprfx\)$sympat$/$symxfrm/p'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-  $rm conftest*
-  cat > conftest.c <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-  echo "$progname:1635: checking if global_symbol_pipe works" >&5
-  if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
-
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-       mv -f "$nlist"T "$nlist"
-      else
-       rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if egrep ' nm_test_var$' "$nlist" >/dev/null; then
-       if egrep ' nm_test_func$' "$nlist" >/dev/null; then
-         cat <<EOF > conftest.c
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
-         # Now generate the symbol file.
-         eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c'
-
-         cat <<EOF >> conftest.c
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
-         sed 's/^. \(.*\) \(.*\)$/  {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c
-         cat <<\EOF >> conftest.c
-  {0, (lt_ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
-         # Now try linking the two files.
-         mv conftest.$objext conftstm.$objext
-         save_LIBS="$LIBS"
-         save_CFLAGS="$CFLAGS"
-         LIBS="conftstm.$objext"
-         CFLAGS="$CFLAGS$no_builtin_flag"
-         if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-           pipe_works=yes
-         else
-           echo "$progname: failed program was:" >&5
-           cat conftest.c >&5
-         fi
-         LIBS="$save_LIBS"
-       else
-         echo "cannot find nm_test_func in $nlist" >&5
-       fi
-      else
-       echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.c >&5
-  fi
-  $rm conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    global_symbol_pipe=
-  fi
-done
-if test "$pipe_works" = yes; then
-  echo "${ac_t}ok" 1>&6
-else
-  echo "${ac_t}failed" 1>&6
-fi
-
-if test -z "$global_symbol_pipe"; then
-  global_symbol_to_cdecl=
-fi
-
-# Check hardcoding attributes.
-echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
-   test -n "$runpath_var"; then
-
-  # We can hardcode non-existant directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$hardcode_shlibpath_var" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-echo "$ac_t$hardcode_action" 1>&6
-
-
-reload_flag=
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
-# PORTME Some linkers may need a different reload flag.
-reload_flag='-r'
-echo "$ac_t$reload_flag" 1>&6
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-
-# PORTME Fill in your ld.so characteristics
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-file_magic_cmd=
-file_magic_test_file=
-deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [regex]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given egrep regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
-case "$host_os" in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}.so$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}.so$major'
-  ;;
-
-aix4*)
-  version_type=linux
-  # AIX has no versioning support, so currently we can not hardcode correct
-  # soname into executable. Probably we can add versioning support to
-  # collect2, so additional links can be useful in future.
-  # We preserve .a as extension for shared libraries though AIX4.2
-  # and later linker supports .so
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a'
-  shlibpath_var=LIBPATH
-  deplibs_check_method=pass_all
-  ;;
-
-amigaos*)
-  library_names_spec='$libname.ixlibrary $libname.a'
-  # Create ${libname}_ixlibrary.a entries in /sys/libs.
-  finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
-  ;;
-
-beos*)
-  library_names_spec='${libname}.so'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  deplibs_check_method=pass_all
-  lt_cv_dlopen="load_add_on"
-  lt_cv_dlopen_libs=
-  lt_cv_dlopen_self=yes
-  ;;
-
-bsdi4*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  file_magic_cmd=/usr/bin/file
-  file_magic_test_file=/shlib/libc.so
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  export_dynamic_flag_spec=-rdynamic
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw*)
-  version_type=windows
-  need_version=no
-  need_lib_prefix=no
-  if test "$with_gcc" = yes; then
-    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
-  else
-    library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
-  fi
-  dynamic_linker='Win32 ld.exe'
-  deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-  file_magic_cmd='${OBJDUMP} -f'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  lt_cv_dlopen="LoadLibrary"
-  lt_cv_dlopen_libs=
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-  
-freebsd*)
-  objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
-  version_type=freebsd-$objformat
-  case "$version_type" in
-    freebsd-elf*)
-      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
-      file_magic_cmd=/usr/bin/file
-      file_magic_test_file=`echo /usr/lib/libc.so*`
-      library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      deplibs_check_method=unknown
-      library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case "$host_os" in
-  freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  *) # from 3.2 on
-    shlibpath_overrides_runpath=no
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
-  soname_spec='${libname}${release}.so$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  dynamic_linker="$host_os dld.sl"
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  shlibpath_var=SHLIB_PATH
-  shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
-  soname_spec='${libname}${release}.sl$major'
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-irix5* | irix6*)
-  version_type=irix
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}.so.$major'
-  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so'
-  case "$host_os" in
-  irix5*)
-    libsuff= shlibsuff=
-    # this will be overridden with pass_all, but let us keep it just in case
-    deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
-    ;;
-  *)
-    case "$LD" in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  file_magic_cmd=/usr/bin/file
-  file_magic_test_file=`echo /lib${libsuff}/libc.so*`
-  deplibs_check_method='pass_all'
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-  file_magic_cmd=/usr/bin/file
-  file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
-
-  if test -f /lib/ld.so.1; then
-    dynamic_linker='GNU ld.so'
-  else
-    # Only the GNU ld.so supports shared libraries on MkLinux.
-    case "$host_cpu" in
-    powerpc*) dynamic_linker=no ;;
-    *) dynamic_linker='Linux ld.so' ;;
-    esac
-  fi
-  ;;
-
-netbsd*)
-  version_type=sunos
-  if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
-    soname_spec='${libname}${release}.so$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-openbsd*)
-  version_type=sunos
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-    need_version=no
-  fi
-  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-os2*)
-  libname_spec='$name'
-  need_lib_prefix=no
-  library_names_spec='$libname.dll $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_version=no
-  soname_spec='${libname}${release}.so'
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
-  shlibpath_var=LD_LIBRARY_PATH
-  # this will be overridden with pass_all, but let us keep it just in case
-  deplibs_check_method='file_magic COFF format alpha shared library'
-  file_magic_cmd=/usr/bin/file
-  file_magic_test_file=/shlib/libc.so
-  deplibs_check_method='pass_all'
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-sco3.2v5*)
-  version_type=osf
-  soname_spec='${libname}${release}.so$major'
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib"
-  file_magic_cmd=/usr/bin/file
-  file_magic_test_file=/lib/libc.so
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-  version_type=linux
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case "$host_vendor" in
-    ncr)
-      deplibs_check_method='pass_all'
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-      file_magic_cmd=/usr/bin/file
-      file_magic_test_file=`echo /usr/lib/libc.so*`
-      ;;
-  esac
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-  soname_spec='${libname}${release}.so$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
-    soname_spec='$libname.so.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-echo "$ac_t$dynamic_linker" 1>&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
-
-# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in
-# configure.in, otherwise build static only libraries.
-case "$host_os" in
-cygwin* | mingw* | os2*)
-  if test x$can_build_shared = xyes; then
-    test x$enable_win32_dll = xno && can_build_shared=no
-    echo "checking if package supports dlls... $can_build_shared" 1>&6
-  fi
-;;
-esac
-
-if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then
-  case "$deplibs_check_method" in
-  "file_magic "*)
-    file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
-    if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-       egrep "$file_magic_regex" > /dev/null; then
-      :
-    else
-      cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
-    fi ;;
-  esac
-fi
-
-echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix3*)
-  test "$enable_shared" = yes && enable_static=no
-  if test -n "$RANLIB"; then
-    archive_cmds="$archive_cmds~\$RANLIB \$lib"
-    postinstall_cmds='$RANLIB $lib'
-  fi
-  ;;
-
-aix4*)
-  test "$enable_shared" = yes && enable_static=no
-  ;;
-esac
-
-echo "$ac_t$enable_shared" 1>&6
-
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-
-echo "checking whether to build static libraries... $enable_static" 1>&6
-
-if test "$hardcode_action" = relink; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-echo $ac_n "checking for objdir... $ac_c" 1>&6
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-echo "$ac_t$objdir" 1>&6
-
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then
-  lt_cv_dlopen=no lt_cv_dlopen_libs=
-echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "$progname:2212: checking for dlopen in -ldl" >&5
-ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-ldl  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2220 "ltconfig"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen();
-
-int main() {
-dlopen()
-; return 0; }
-EOF
-if { (eval echo $progname:2233: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  echo "$ac_t""no" 1>&6
-echo $ac_n "checking for dlopen""... $ac_c" 1>&6
-echo "$progname:2252: checking for dlopen" >&5
-if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2257 "ltconfig"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char dlopen(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-dlopen();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_func_dlopen=yes"
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_dlopen=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  lt_cv_dlopen="dlopen"
-else
-  echo "$ac_t""no" 1>&6
-echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
-echo "$progname:2299: checking for dld_link in -ldld" >&5
-ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-ldld  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2307 "ltconfig"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link();
-
-int main() {
-dld_link()
-; return 0; }
-EOF
-if { (eval echo $progname:2320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-else
-  echo "$ac_t""no" 1>&6
-echo $ac_n "checking for shl_load""... $ac_c" 1>&6
-echo "$progname:2339: checking for shl_load" >&5
-if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2344 "ltconfig"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shl_load(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-shl_load();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_func_shl_load=yes"
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_shl_load=no"
-fi
-rm -f conftest*
-fi
-
-if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  lt_cv_dlopen="shl_load"
-else
-  echo "$ac_t""no" 1>&6
-echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "$progname:2387: checking for shl_load in -ldld" >&5
-ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-ldld  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2395 "ltconfig"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load();
-
-int main() {
-shl_load()
-; return 0; }
-EOF
-if { (eval echo $progname:2409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-fi
-
-    
-fi
-
-  
-fi
-
-
-fi
-
-fi
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  fi
-
-  case "$lt_cv_dlopen" in
-  dlopen)
-for ac_hdr in dlfcn.h; do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "$progname:2452: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 2457 "ltconfig"
-#include <$ac_hdr>
-int fnord = 0;
-EOF
-ac_try="$ac_compile >/dev/null 2>conftest.out"
-{ (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-    if test "x$ac_cv_header_dlfcn_h" = xyes; then
-      CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-    fi
-    eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-  echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2490: checking whether a program can dlopen itself" >&5
-if test "${lt_cv_dlopen_self+set}" = set; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-    lt_cv_dlopen_self=cross
-  else
-    cat > conftest.c <<EOF
-#line 2498 "ltconfig"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL   RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-#  define LTDL_GLOBAL  DL_GLOBAL
-# else
-#  define LTDL_GLOBAL  0
-# endif
-#endif
-
-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LTDL_LAZY_OR_NOW
-# ifdef RTLD_LAZY
-#  define LTDL_LAZY_OR_NOW     RTLD_LAZY
-# else
-#  ifdef DL_LAZY
-#   define LTDL_LAZY_OR_NOW    DL_LAZY
-#  else
-#   ifdef RTLD_NOW
-#    define LTDL_LAZY_OR_NOW   RTLD_NOW
-#   else
-#    ifdef DL_NOW
-#     define LTDL_LAZY_OR_NOW  DL_NOW
-#    else
-#     define LTDL_LAZY_OR_NOW  0
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-fnord() { int i=42;}
-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
-    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
-              if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
-
-EOF
-if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
-  lt_cv_dlopen_self=yes
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  lt_cv_dlopen_self=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$lt_cv_dlopen_self" 1>&6
-
-  if test "$lt_cv_dlopen_self" = yes; then
-    LDFLAGS="$LDFLAGS $link_static_flag"
-  echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6
-echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5
-if test "${lt_cv_dlopen_self_static+set}" = set; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-    lt_cv_dlopen_self_static=cross
-  else
-    cat > conftest.c <<EOF
-#line 2571 "ltconfig"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LTDL_GLOBAL   RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-#  define LTDL_GLOBAL  DL_GLOBAL
-# else
-#  define LTDL_GLOBAL  0
-# endif
-#endif
-
-/* We may have to define LTDL_LAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LTDL_LAZY_OR_NOW
-# ifdef RTLD_LAZY
-#  define LTDL_LAZY_OR_NOW     RTLD_LAZY
-# else
-#  ifdef DL_LAZY
-#   define LTDL_LAZY_OR_NOW    DL_LAZY
-#  else
-#   ifdef RTLD_NOW
-#    define LTDL_LAZY_OR_NOW   RTLD_NOW
-#   else
-#    ifdef DL_NOW
-#     define LTDL_LAZY_OR_NOW  DL_NOW
-#    else
-#     define LTDL_LAZY_OR_NOW  0
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-fnord() { int i=42;}
-main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW);
-    if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
-    if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } 
-
-EOF
-if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
-then
-  lt_cv_dlopen_self_static=yes
-else
-  echo "$progname: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  lt_cv_dlopen_self_static=no
-fi
-rm -fr conftest*
-fi
-
-fi
-
-echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6
-fi
-    ;;
-  esac
-
-  case "$lt_cv_dlopen_self" in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case "$lt_cv_dlopen_self_static" in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-# Copy echo and quote the copy, instead of the original, because it is
-# used later.
-ltecho="$echo"
-if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   ltecho="$CONFIG_SHELL \$0 --fallback-echo"
-fi
-LTSHELL="$SHELL"
-
-LTCONFIG_VERSION="$VERSION"
-
-# Only quote variables if we're using ltmain.sh.
-case "$ltmain" in
-*.sh)
-  # Now quote all the things that may contain metacharacters.
-  for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \
-    old_LD old_LDFLAGS old_LIBS \
-    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \
-    AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \
-    reload_flag reload_cmds wl \
-    pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
-    thread_safe_flag_spec whole_archive_flag_spec libname_spec \
-    library_names_spec soname_spec \
-    RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
-    old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \
-    file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \
-    finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
-    hardcode_libdir_flag_spec hardcode_libdir_separator  \
-    sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
-    compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
-
-    case "$var" in
-    reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
-    old_postinstall_cmds | old_postuninstall_cmds | \
-    export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
-    postinstall_cmds | postuninstall_cmds | \
-    finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
-      # Double-quote double-evaled strings.
-      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
-      ;;
-    *)
-      eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
-      ;;
-    esac
-  done
-
-  case "$ltecho" in
-  *'\$0 --fallback-echo"')
-    ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
-    ;;
-  esac
-
-  trap "$rm \"$ofile\"; exit 1" 1 2 15
-  echo "creating $ofile"
-  $rm "$ofile"
-  cat <<EOF > "$ofile"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
-#
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-### BEGIN LIBTOOL CONFIG
-EOF
-  cfgfile="$ofile"
-  ;;
-
-*)
-  # Double-quote the variables that need it (for aesthetics).
-  for var in old_CC old_CFLAGS old_CPPFLAGS \
-    old_LD old_LDFLAGS old_LIBS \
-    old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do
-    eval "$var=\\\"\$var\\\""
-  done
-
-  # Just create a config file.
-  cfgfile="$ofile.cfg"
-  trap "$rm \"$cfgfile\"; exit 1" 1 2 15
-  echo "creating $cfgfile"
-  $rm "$cfgfile"
-  cat <<EOF > "$cfgfile"
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-EOF
-  ;;
-esac
-
-cat <<EOF >> "$cfgfile"
-# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
-# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\
-# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
-# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\
-#   $0$ltconfig_args
-#
-# Compiler and other test output produced by $progname, useful for
-# debugging $progname, is in ./config.log if it exists.
-
-# The version of $progname that generated this script.
-LTCONFIG_VERSION=$LTCONFIG_VERSION
-
-# Shell to use when invoking shell scripts.
-SHELL=$LTSHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$ltecho
-
-# The archiver.
-AR=$AR
-
-# The default C compiler.
-CC=$CC
-
-# The linker used to build libraries.
-LD=$LD
-
-# Whether we need hard or soft links.
-LN_S=$LN_S
-
-# A BSD-compatible nm program.
-NM=$NM
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$reload_flag
-reload_cmds=$reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$wl
-
-# Object file suffix (normally "o").
-objext="$objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$pic_flag
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$whole_archive_flag_spec
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$thread_safe_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$RANLIB
-old_archive_cmds=$old_archive_cmds
-old_postinstall_cmds=$old_postinstall_cmds
-old_postuninstall_cmds=$old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$old_archive_from_new_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$archive_cmds
-archive_expsym_cmds=$archive_expsym_cmds
-postinstall_cmds=$postinstall_cmds
-postuninstall_cmds=$postuninstall_cmds
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$global_symbol_to_cdecl
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$include_expsyms
-
-EOF
-
-case "$ltmain" in
-*.sh)
-  echo '### END LIBTOOL CONFIG' >> "$ofile"
-  echo >> "$ofile"
-  case "$host_os" in
-  aix3*)
-    cat <<\EOF >> "$ofile"
-
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-EOF
-    ;;
-  esac
-
-  # Append the ltmain.sh script.
-  sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-
-  chmod +x "$ofile"
-  ;;
-
-*)
-  # Compile the libtool program.
-  echo "FIXME: would compile $ltmain"
-  ;;
-esac
-
-test -n "$cache_file" || exit 0
-
-# AC_CACHE_SAVE
-trap '' 1 2 15
-cat > confcache <<\EOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs.  It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
-#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already.  You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
-#
-EOF
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
-  case `(ac_space=' '; set | grep ac_space) 2>&1` in
-  *ac_space=\ *)
-    # `set' does not quote correctly, so add quotes (double-quote substitution
-    # turns \\\\ into \\, and sed turns \\ into \).
-    sed -n \
-      -e "s/'/'\\\\''/g" \
-      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
-    ;;
-  *)
-    # `set' quotes correctly as required by POSIX, so do not add quotes.
-    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
-    ;;
-  esac >> confcache
-if cmp -s $cache_file confcache; then
-  :
-else
-  if test -w $cache_file; then
-    echo "updating cache $cache_file"
-    cat confcache > $cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
diff --git a/pcre/ltmain.sh b/pcre/ltmain.sh
deleted file mode 100644 (file)
index ab65054..0000000
+++ /dev/null
@@ -1,4012 +0,0 @@
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun ltconfig.
-#
-# Copyright (C) 1996-1999 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-  # Yippee, $echo works!
-  :
-else
-  # Restart under the correct shell, and then maybe $echo will work.
-  exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit 0
-fi
-
-# The name of this program.
-progname=`$echo "$0" | sed 's%^.*/%%'`
-modename="$progname"
-
-# Constants.
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.3.4
-TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)"
-
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-SP2NL='tr \040 \012'
-NL2SP='tr \015\012 \040\040'
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-if test "${LC_ALL+set}" = set; then
-  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-fi
-if test "${LANG+set}" = set; then
-  save_LANG="$LANG"; LANG=C; export LANG
-fi
-
-if test "$LTCONFIG_VERSION" != "$VERSION"; then
-  echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
-  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit 1
-fi
-
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-  echo "$modename: not configured to build any kind of library" 1>&2
-  echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-  exit 1
-fi
-
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-
-# Parse our command line options once, thoroughly.
-while test $# -gt 0
-do
-  arg="$1"
-  shift
-
-  case "$arg" in
-  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$prev"; then
-    case "$prev" in
-    execute_dlfiles)
-      eval "$prev=\"\$$prev \$arg\""
-      ;;
-    *)
-      eval "$prev=\$arg"
-      ;;
-    esac
-
-    prev=
-    prevopt=
-    continue
-  fi
-
-  # Have we seen a non-optional argument yet?
-  case "$arg" in
-  --help)
-    show_help=yes
-    ;;
-
-  --version)
-    echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
-    exit 0
-    ;;
-
-  --config)
-    sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
-    exit 0
-    ;;
-
-  --debug)
-    echo "$progname: enabling shell trace mode"
-    set -x
-    ;;
-
-  --dry-run | -n)
-    run=:
-    ;;
-
-  --features)
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-    exit 0
-    ;;
-
-  --finish) mode="finish" ;;
-
-  --mode) prevopt="--mode" prev=mode ;;
-  --mode=*) mode="$optarg" ;;
-
-  --quiet | --silent)
-    show=:
-    ;;
-
-  -dlopen)
-    prevopt="-dlopen"
-    prev=execute_dlfiles
-    ;;
-
-  -*)
-    $echo "$modename: unrecognized option \`$arg'" 1>&2
-    $echo "$help" 1>&2
-    exit 1
-    ;;
-
-  *)
-    nonopt="$arg"
-    break
-    ;;
-  esac
-done
-
-if test -n "$prevopt"; then
-  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
-  $echo "$help" 1>&2
-  exit 1
-fi
-
-if test -z "$show_help"; then
-
-  # Infer the operation mode.
-  if test -z "$mode"; then
-    case "$nonopt" in
-    *cc | *++ | gcc* | *-gcc*)
-      mode=link
-      for arg
-      do
-       case "$arg" in
-       -c)
-          mode=compile
-          break
-          ;;
-       esac
-      done
-      ;;
-    *db | *dbx | *strace | *truss)
-      mode=execute
-      ;;
-    *install*|cp|mv)
-      mode=install
-      ;;
-    *rm)
-      mode=uninstall
-      ;;
-    *)
-      # If we have no mode, but dlfiles were specified, then do execute mode.
-      test -n "$execute_dlfiles" && mode=execute
-
-      # Just use the default operation mode.
-      if test -z "$mode"; then
-       if test -n "$nonopt"; then
-         $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
-       else
-         $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
-       fi
-      fi
-      ;;
-    esac
-  fi
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
-    $echo "$help" 1>&2
-    exit 1
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$modename --help --mode=$mode' for more information."
-
-  # These modes are in order of execution frequency so that they run quickly.
-  case "$mode" in
-  # libtool compile mode
-  compile)
-    modename="$modename: compile"
-    # Get the compilation command and the source file.
-    base_compile=
-    lastarg=
-    srcfile="$nonopt"
-    suppress_output=
-
-    user_target=no
-    for arg
-    do
-      # Accept any command-line options.
-      case "$arg" in
-      -o)
-       if test "$user_target" != "no"; then
-         $echo "$modename: you cannot specify \`-o' more than once" 1>&2
-         exit 1
-       fi
-       user_target=next
-       ;;
-
-      -static)
-       build_old_libs=yes
-       continue
-       ;;
-      esac
-
-      case "$user_target" in
-      next)
-       # The next one is the -o target name
-       user_target=yes
-       continue
-       ;;
-      yes)
-       # We got the output file
-       user_target=set
-       libobj="$arg"
-       continue
-       ;;
-      esac
-
-      # Accept the current argument as the source file.
-      lastarg="$srcfile"
-      srcfile="$arg"
-
-      # Aesthetically quote the previous argument.
-
-      # Backslashify any backslashes, double quotes, and dollar signs.
-      # These are the only characters that are still specially
-      # interpreted inside of double-quoted scrings.
-      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
-      # Double-quote args containing other shell metacharacters.
-      # Many Bourne shells cannot handle close brackets correctly in scan
-      # sets, so we specify it separately.
-      case "$lastarg" in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*)
-       lastarg="\"$lastarg\""
-       ;;
-      esac
-
-      # Add the previous argument to base_compile.
-      if test -z "$base_compile"; then
-       base_compile="$lastarg"
-      else
-       base_compile="$base_compile $lastarg"
-      fi
-    done
-
-    case "$user_target" in
-    set)
-      ;;
-    no)
-      # Get the name of the library object.
-      libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
-      ;;
-    *)
-      $echo "$modename: you must specify a target with \`-o'" 1>&2
-      exit 1
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    xform='[cCFSfmso]'
-    case "$libobj" in
-    *.ada) xform=ada ;;
-    *.adb) xform=adb ;;
-    *.ads) xform=ads ;;
-    *.asm) xform=asm ;;
-    *.c++) xform=c++ ;;
-    *.cc) xform=cc ;;
-    *.cpp) xform=cpp ;;
-    *.cxx) xform=cxx ;;
-    *.f90) xform=f90 ;;
-    *.for) xform=for ;;
-    esac
-
-    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
-    case "$libobj" in
-    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
-    *)
-      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
-      exit 1
-      ;;
-    esac
-
-    if test -z "$base_compile"; then
-      $echo "$modename: you must specify a compilation command" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $libobj"
-    else
-      removelist="$libobj"
-    fi
-
-    $run $rm $removelist
-    trap "$run $rm $removelist; exit 1" 1 2 15
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-      removelist="$removelist $output_obj $lockfile"
-      trap "$run $rm $removelist; exit 1" 1 2 15
-    else
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until ln "$0" "$lockfile" 2>/dev/null; do
-       $show "Waiting for $lockfile to be removed"
-       sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-       echo "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-       $run $rm $removelist
-       exit 1
-      fi
-      echo $srcfile > "$lockfile"
-    fi
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      # All platforms use -DPIC, to notify preprocessed assembler code.
-      command="$base_compile $srcfile $pic_flag -DPIC"
-      if test "$build_old_libs" = yes; then
-       lo_libobj="$libobj"
-       dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
-       if test "X$dir" = "X$libobj"; then
-         dir="$objdir"
-       else
-         dir="$dir/$objdir"
-       fi
-       libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
-
-       if test -d "$dir"; then
-         $show "$rm $libobj"
-         $run $rm $libobj
-       else
-         $show "$mkdir $dir"
-         $run $mkdir $dir
-         status=$?
-         if test $status -ne 0 && test ! -d $dir; then
-           exit $status
-         fi
-       fi
-      fi
-      if test "$compiler_o_lo" = yes; then
-       output_obj="$libobj"
-       command="$command -o $output_obj"
-      elif test "$compiler_c_o" = yes; then
-       output_obj="$obj"
-       command="$command -o $output_obj"
-      fi
-
-      $run $rm "$output_obj"
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-       test -n "$output_obj" && $run $rm $removelist
-       exit 1
-      fi
-
-      if test "$need_locks" = warn &&
-        test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
-       echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-       $run $rm $removelist
-       exit 1
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test x"$output_obj" != x"$libobj"; then
-       $show "$mv $output_obj $libobj"
-       if $run $mv $output_obj $libobj; then :
-       else
-         error=$?
-         $run $rm $removelist
-         exit $error
-       fi
-      fi
-
-      # If we have no pic_flag, then copy the object into place and finish.
-      if test -z "$pic_flag" && test "$build_old_libs" = yes; then
-       # Rename the .lo from within objdir to obj
-       if test -f $obj; then
-         $show $rm $obj
-         $run $rm $obj
-       fi
-
-       $show "$mv $libobj $obj"
-       if $run $mv $libobj $obj; then :
-       else
-         error=$?
-         $run $rm $removelist
-         exit $error
-       fi
-
-       xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
-       if test "X$xdir" = "X$obj"; then
-         xdir="."
-       else
-         xdir="$xdir"
-       fi
-       baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
-       libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
-       # Now arrange that obj and lo_libobj become the same file
-       $show "(cd $xdir && $LN_S $baseobj $libobj)"
-       if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
-         exit 0
-       else
-         error=$?
-         $run $rm $removelist
-         exit $error
-       fi
-      fi
-
-      # Allow error messages only from the first compilation.
-      suppress_output=' >/dev/null 2>&1'
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      command="$base_compile $srcfile"
-      if test "$compiler_c_o" = yes; then
-       command="$command -o $obj"
-       output_obj="$obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      $run $rm "$output_obj"
-      $show "$command"
-      if $run eval "$command"; then :
-      else
-       $run $rm $removelist
-       exit 1
-      fi
-
-      if test "$need_locks" = warn &&
-        test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
-       echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-       $run $rm $removelist
-       exit 1
-      fi
-
-      # Just move the object if needed
-      if test x"$output_obj" != x"$obj"; then
-       $show "$mv $output_obj $obj"
-       if $run $mv $output_obj $obj; then :
-       else
-         error=$?
-         $run $rm $removelist
-         exit $error
-       fi
-      fi
-
-      # Create an invalid libtool object if no PIC, so that we do not
-      # accidentally link it into a program.
-      if test "$build_libtool_libs" != yes; then
-       $show "echo timestamp > $libobj"
-       $run eval "echo timestamp > \$libobj" || exit $?
-      else
-       # Move the .lo from within objdir
-       $show "$mv $libobj $lo_libobj"
-       if $run $mv $libobj $lo_libobj; then :
-       else
-         error=$?
-         $run $rm $removelist
-         exit $error
-       fi
-      fi
-    fi
-
-    # Unlock the critical section if it was locked
-    if test "$need_locks" != no; then
-      $rm "$lockfile"
-    fi
-
-    exit 0
-    ;;
-
-  # libtool link mode
-  link)
-    modename="$modename: link"
-    case "$host" in
-    *-*-cygwin* | *-*-mingw* | *-*-os2*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invokation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-
-      # This is a source program that is used to create dlls on Windows
-      # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# #  ifdef __CYGWIN32__
-# #    define __CYGWIN__ __CYGWIN32__
-# #  endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-#   __hDllInstance_base = hInst;
-#   return TRUE;
-# }
-# /* ltdll.c ends here */
-      # This is a source program that is used to create import libraries
-      # on Windows for dlls which lack them. Don't remove nor modify the
-      # starting and closing comments
-# /* impgen.c starts here */
-# /*   Copyright (C) 1999 Free Software Foundation, Inc.
-# 
-#  This file is part of GNU libtool.
-# 
-#  This program is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; either version 2 of the License, or
-#  (at your option) any later version.
-# 
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-# 
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#  */
-# 
-#  #include <stdio.h>          /* for printf() */
-#  #include <unistd.h>         /* for open(), lseek(), read() */
-#  #include <fcntl.h>          /* for O_RDONLY, O_BINARY */
-#  #include <string.h>         /* for strdup() */
-# 
-#  static unsigned int
-#  pe_get16 (fd, offset)
-#       int fd;
-#       int offset;
-#  {
-#    unsigned char b[2];
-#    lseek (fd, offset, SEEK_SET);
-#    read (fd, b, 2);
-#    return b[0] + (b[1]<<8);
-#  }
-# 
-#  static unsigned int
-#  pe_get32 (fd, offset)
-#      int fd;
-#      int offset;
-#  {
-#    unsigned char b[4];
-#    lseek (fd, offset, SEEK_SET);
-#    read (fd, b, 4);
-#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-#  }
-# 
-#  static unsigned int
-#  pe_as32 (ptr)
-#       void *ptr;
-#  {
-#    unsigned char *b = ptr;
-#    return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-#  }
-# 
-#  int
-#  main (argc, argv)
-#      int argc;
-#      char *argv[];
-#  {
-#      int dll;
-#      unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-#      unsigned long export_rva, export_size, nsections, secptr, expptr;
-#      unsigned long name_rvas, nexp;
-#      unsigned char *expdata, *erva;
-#      char *filename, *dll_name;
-# 
-#      filename = argv[1];
-# 
-#      dll = open(filename, O_RDONLY|O_BINARY);
-#      if (!dll)
-#      return 1;
-# 
-#      dll_name = filename;
-#    
-#      for (i=0; filename[i]; i++)
-#      if (filename[i] == '/' || filename[i] == '\\'  || filename[i] == ':')
-#          dll_name = filename + i +1;
-# 
-#      pe_header_offset = pe_get32 (dll, 0x3c);
-#      opthdr_ofs = pe_header_offset + 4 + 20;
-#      num_entries = pe_get32 (dll, opthdr_ofs + 92);
-# 
-#      if (num_entries < 1) /* no exports */
-#      return 1;
-# 
-#      export_rva = pe_get32 (dll, opthdr_ofs + 96);
-#      export_size = pe_get32 (dll, opthdr_ofs + 100);
-#      nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-#      secptr = (pe_header_offset + 4 + 20 +
-#            pe_get16 (dll, pe_header_offset + 4 + 16));
-# 
-#      expptr = 0;
-#      for (i = 0; i < nsections; i++)
-#      {
-#      char sname[8];
-#      unsigned long secptr1 = secptr + 40 * i;
-#      unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-#      unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-#      unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-#      lseek(dll, secptr1, SEEK_SET);
-#      read(dll, sname, 8);
-#      if (vaddr <= export_rva && vaddr+vsize > export_rva)
-#      {
-#          expptr = fptr + (export_rva - vaddr);
-#          if (export_rva + export_size > vaddr + vsize)
-#              export_size = vsize - (export_rva - vaddr);
-#          break;
-#      }
-#      }
-# 
-#      expdata = (unsigned char*)malloc(export_size);
-#      lseek (dll, expptr, SEEK_SET);
-#      read (dll, expdata, export_size);
-#      erva = expdata - export_rva;
-# 
-#      nexp = pe_as32 (expdata+24);
-#      name_rvas = pe_as32 (expdata+32);
-# 
-#      printf ("EXPORTS\n");
-#      for (i = 0; i<nexp; i++)
-#      {
-#      unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-#      printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-#      }
-# 
-#      return 0;
-#  }
-# /* impgen.c ends here */
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    compile_command="$nonopt"
-    finalize_command="$nonopt"
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    linkopts=
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval lib_search_path=\`\$echo \"X \${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      lib_search_path=
-    fi
-    # now prepend the system-specific ones
-    eval lib_search_path=\"$sys_lib_search_path_spec\$lib_search_path\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-    
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    link_against_libtool_libs=
-    ltlibs=
-    module=no
-    objs=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case "$arg" in
-      -all-static | -static)
-       if test "X$arg" = "X-all-static"; then
-         if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-           $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
-         fi
-         if test -n "$link_static_flag"; then
-           dlopen_self=$dlopen_self_static
-         fi
-       else
-         if test -z "$pic_flag" && test -n "$link_static_flag"; then
-           dlopen_self=$dlopen_self_static
-         fi
-       fi
-       build_libtool_libs=no
-       build_old_libs=yes
-       prefer_static_libs=yes
-       break
-       ;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test $# -gt 0; do
-      arg="$1"
-      shift
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-       case "$prev" in
-       output)
-         compile_command="$compile_command @OUTPUT@"
-         finalize_command="$finalize_command @OUTPUT@"
-         ;;
-       esac
-
-       case "$prev" in
-       dlfiles|dlprefiles)
-         if test "$preload" = no; then
-           # Add the symbol object into the linking commands.
-           compile_command="$compile_command @SYMFILE@"
-           finalize_command="$finalize_command @SYMFILE@"
-           preload=yes
-         fi
-         case "$arg" in
-         *.la | *.lo) ;;  # We handle these cases below.
-         force)
-           if test "$dlself" = no; then
-             dlself=needless
-             export_dynamic=yes
-           fi
-           prev=
-           continue
-           ;;
-         self)
-           if test "$prev" = dlprefiles; then
-             dlself=yes
-           elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-             dlself=yes
-           else
-             dlself=needless
-             export_dynamic=yes
-           fi
-           prev=
-           continue
-           ;;
-         *)
-           if test "$prev" = dlfiles; then
-             dlfiles="$dlfiles $arg"
-           else
-             dlprefiles="$dlprefiles $arg"
-           fi
-           prev=
-           ;;
-         esac
-         ;;
-       expsyms)
-         export_symbols="$arg"
-         if test ! -f "$arg"; then
-           $echo "$modename: symbol file \`$arg' does not exist"
-           exit 1
-         fi
-         prev=
-         continue
-         ;;
-       expsyms_regex)
-         export_symbols_regex="$arg"
-         prev=
-         continue
-         ;;
-       release)
-         release="-$arg"
-         prev=
-         continue
-         ;;
-       rpath | xrpath)
-         # We need an absolute path.
-         case "$arg" in
-         [\\/]* | [A-Za-z]:[\\/]*) ;;
-         *)
-           $echo "$modename: only absolute run-paths are allowed" 1>&2
-           exit 1
-           ;;
-         esac
-         if test "$prev" = rpath; then
-           case "$rpath " in
-           *" $arg "*) ;;
-           *) rpath="$rpath $arg" ;;
-           esac
-         else
-           case "$xrpath " in
-           *" $arg "*) ;;
-           *) xrpath="$xrpath $arg" ;;
-           esac
-         fi
-         prev=
-         continue
-         ;;
-       *)
-         eval "$prev=\"\$arg\""
-         prev=
-         continue
-         ;;
-       esac
-      fi
-
-      prevarg="$arg"
-
-      case "$arg" in
-      -all-static)
-       if test -n "$link_static_flag"; then
-         compile_command="$compile_command $link_static_flag"
-         finalize_command="$finalize_command $link_static_flag"
-       fi
-       continue
-       ;;
-
-      -allow-undefined)
-       # FIXME: remove this flag sometime in the future.
-       $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
-       continue
-       ;;
-
-      -avoid-version)
-       avoid_version=yes
-       continue
-       ;;
-
-      -dlopen)
-       prev=dlfiles
-       continue
-       ;;
-
-      -dlpreopen)
-       prev=dlprefiles
-       continue
-       ;;
-
-      -export-dynamic)
-       export_dynamic=yes
-       continue
-       ;;
-
-      -export-symbols | -export-symbols-regex)
-       if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-         $echo "$modename: not more than one -exported-symbols argument allowed"
-         exit 1
-       fi
-       if test "X$arg" = "X-export-symbols"; then
-         prev=expsyms
-       else
-         prev=expsyms_regex
-       fi
-       continue
-       ;;
-
-      -L*)
-       dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
-       # We need an absolute path.
-       case "$dir" in
-       [\\/]* | [A-Za-z]:[\\/]*) ;;
-       *)
-         absdir=`cd "$dir" && pwd`
-         if test -z "$absdir"; then
-           $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-           $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-           absdir="$dir"
-         fi
-         dir="$absdir"
-         ;;
-       esac
-       case " $deplibs " in
-       *" $arg "*) ;;
-       *) deplibs="$deplibs $arg";;
-       esac
-       case " $lib_search_path " in
-       *" $dir "*) ;;
-       *) lib_search_path="$lib_search_path $dir";;
-       esac
-       case "$host" in
-       *-*-cygwin* | *-*-mingw* | *-*-os2*)
-         dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
-         case ":$dllsearchpath:" in
-         ::) dllsearchpath="$dllsearchdir";;
-         *":$dllsearchdir:"*) ;;
-         *) dllsearchpath="$dllsearchpath:$dllsearchdir";;
-         esac
-         ;;
-       esac
-       ;;
-
-      -l*)
-       if test "$arg" = "-lc"; then
-         case "$host" in
-         *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
-           # These systems don't actually have c library (as such)
-           continue
-           ;;
-         esac
-       elif test "$arg" = "-lm"; then
-         case "$host" in
-         *-*-cygwin* | *-*-beos*)
-           # These systems don't actually have math library (as such)
-           continue
-           ;;
-         esac
-       fi
-       deplibs="$deplibs $arg"
-       ;;
-
-      -module)
-       module=yes
-       continue
-       ;;
-
-      -no-undefined)
-       allow_undefined=no
-       continue
-       ;;
-
-      -o) prev=output ;;
-
-      -release)
-       prev=release
-       continue
-       ;;
-
-      -rpath)
-       prev=rpath
-       continue
-       ;;
-
-      -R)
-       prev=xrpath
-       continue
-       ;;
-
-      -R*)
-       dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
-       # We need an absolute path.
-       case "$dir" in
-       [\\/]* | [A-Za-z]:[\\/]*) ;;
-       *)
-         $echo "$modename: only absolute run-paths are allowed" 1>&2
-         exit 1
-         ;;
-       esac
-       case "$xrpath " in
-       *" $dir "*) ;;
-       *) xrpath="$xrpath $dir" ;;
-       esac
-       continue
-       ;;
-
-      -static)
-       # If we have no pic_flag, then this is the same as -all-static.
-       if test -z "$pic_flag" && test -n "$link_static_flag"; then
-         compile_command="$compile_command $link_static_flag"
-         finalize_command="$finalize_command $link_static_flag"
-       fi
-       continue
-       ;;
-
-      -thread-safe)
-       thread_safe=yes
-       continue
-       ;;
-
-      -version-info)
-       prev=vinfo
-       continue
-       ;;
-
-      # Some other compiler flag.
-      -* | +*)
-       # Unknown arguments in both finalize_command and compile_command need
-       # to be aesthetically quoted because they are evaled later.
-       arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-       case "$arg" in
-       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \   ]*|*]*)
-         arg="\"$arg\""
-         ;;
-       esac
-       ;;
-
-      *.o | *.obj | *.a | *.lib)
-       # A standard object.
-       objs="$objs $arg"
-       ;;
-
-      *.lo)
-       # A library object.
-       if test "$prev" = dlfiles; then
-         dlfiles="$dlfiles $arg"
-         if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then
-           prev=
-           continue
-         else
-           # If libtool objects are unsupported, then we need to preload.
-           prev=dlprefiles
-         fi
-       fi
-
-       if test "$prev" = dlprefiles; then
-         # Preload the old-style object.
-         dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
-         prev=
-       fi
-       libobjs="$libobjs $arg"
-       ;;
-
-      *.la)
-       # A libtool-controlled library.
-
-       dlname=
-       libdir=
-       library_names=
-       old_library=
-
-       # Check to see that this really is a libtool archive.
-       if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-       else
-         $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
-         exit 1
-       fi
-
-       # If the library was installed with an old release of libtool,
-       # it will not redefine variable installed.
-       installed=yes
-
-       # Read the .la file
-       # If there is no directory component, then add one.
-       case "$arg" in
-       */* | *\\*) . $arg ;;
-       *) . ./$arg ;;
-       esac
-
-       # Get the name of the library we link against.
-       linklib=
-       for l in $old_library $library_names; do
-         linklib="$l"
-       done
-
-       if test -z "$linklib"; then
-         $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
-         exit 1
-       fi
-
-       # Find the relevant object directory and library name.
-       name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
-
-       if test "X$installed" = Xyes; then
-         dir="$libdir"
-       else
-         dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
-         if test "X$dir" = "X$arg"; then
-           dir="$objdir"
-         else
-           dir="$dir/$objdir"
-         fi
-       fi
-
-       if test -n "$dependency_libs"; then
-         # Extract -R and -L from dependency_libs
-         temp_deplibs=
-         for deplib in $dependency_libs; do
-           case "$deplib" in
-           -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
-                case " $rpath $xrpath " in
-                *" $temp_xrpath "*) ;;
-                *) xrpath="$xrpath $temp_xrpath";;
-                esac;;
-           -L*) case "$compile_command $temp_deplibs " in
-                *" $deplib "*) ;;
-                *) temp_deplibs="$temp_deplibs $deplib";;
-                esac
-                temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'`
-                case " $lib_search_path " in
-                *" $temp_dir "*) ;;
-                *) lib_search_path="$lib_search_path $temp_dir";;
-                esac
-                ;;
-           *) temp_deplibs="$temp_deplibs $deplib";;
-           esac
-         done
-         dependency_libs="$temp_deplibs"
-       fi
-
-       if test -z "$libdir"; then
-         # It is a libtool convenience library, so add in its objects.
-         convenience="$convenience $dir/$old_library"
-         old_convenience="$old_convenience $dir/$old_library"
-         deplibs="$deplibs$dependency_libs"
-         compile_command="$compile_command $dir/$old_library$dependency_libs"
-         finalize_command="$finalize_command $dir/$old_library$dependency_libs"
-         continue
-       fi
-
-       # This library was specified with -dlopen.
-       if test "$prev" = dlfiles; then
-         dlfiles="$dlfiles $arg"
-         if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then
-           # If there is no dlname, no dlopen support or we're linking statically,
-           # we need to preload.
-           prev=dlprefiles
-         else
-           # We should not create a dependency on this library, but we
-           # may need any libraries it requires.
-           compile_command="$compile_command$dependency_libs"
-           finalize_command="$finalize_command$dependency_libs"
-           prev=
-           continue
-         fi
-       fi
-
-       # The library was specified with -dlpreopen.
-       if test "$prev" = dlprefiles; then
-         # Prefer using a static library (so that no silly _DYNAMIC symbols
-         # are required to link).
-         if test -n "$old_library"; then
-           dlprefiles="$dlprefiles $dir/$old_library"
-         else
-           dlprefiles="$dlprefiles $dir/$linklib"
-         fi
-         prev=
-       fi
-
-       if test -n "$library_names" &&
-          { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
-         link_against_libtool_libs="$link_against_libtool_libs $arg"
-         if test -n "$shlibpath_var"; then
-           # Make sure the rpath contains only unique directories.
-           case "$temp_rpath " in
-           *" $dir "*) ;;
-           *) temp_rpath="$temp_rpath $dir" ;;
-           esac
-         fi
-
-         # We need an absolute path.
-         case "$dir" in
-         [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-         *)
-           absdir=`cd "$dir" && pwd`
-           if test -z "$absdir"; then
-             $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
-             $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
-             absdir="$dir"
-           fi
-           ;;
-         esac
-         
-         # This is the magic to use -rpath.
-         # Skip directories that are in the system default run-time
-         # search path, unless they have been requested with -R.
-         case " $sys_lib_dlsearch_path " in
-         *" $absdir "*) ;;
-         *)
-           case "$compile_rpath " in
-           *" $absdir "*) ;;
-           *) compile_rpath="$compile_rpath $absdir" 
-           esac
-           ;;
-         esac
-
-         case " $sys_lib_dlsearch_path " in
-         *" $libdir "*) ;;
-         *)
-           case "$finalize_rpath " in
-           *" $libdir "*) ;;
-           *) finalize_rpath="$finalize_rpath $libdir"
-           esac
-           ;;
-         esac
-
-         lib_linked=yes
-         case "$hardcode_action" in
-         immediate | unsupported)
-           if test "$hardcode_direct" = no; then
-             compile_command="$compile_command $dir/$linklib"
-             deplibs="$deplibs $dir/$linklib"
-             case "$host" in
-             *-*-cygwin* | *-*-mingw* | *-*-os2*)
-               dllsearchdir=`cd "$dir" && pwd || echo "$dir"`
-               if test -n "$dllsearchpath"; then
-                 dllsearchpath="$dllsearchpath:$dllsearchdir"
-               else
-                 dllsearchpath="$dllsearchdir"
-               fi
-               ;;
-             esac
-           elif test "$hardcode_minus_L" = no; then
-             case "$host" in
-             *-*-sunos*)
-               compile_shlibpath="$compile_shlibpath$dir:"
-               ;;
-             esac
-             case "$compile_command " in
-             *" -L$dir "*) ;;
-             *) compile_command="$compile_command -L$dir";;
-             esac
-             compile_command="$compile_command -l$name"
-             deplibs="$deplibs -L$dir -l$name"
-           elif test "$hardcode_shlibpath_var" = no; then
-             case ":$compile_shlibpath:" in
-             *":$dir:"*) ;;
-             *) compile_shlibpath="$compile_shlibpath$dir:";;
-             esac
-             compile_command="$compile_command -l$name"
-             deplibs="$deplibs -l$name"
-           else
-             lib_linked=no
-           fi
-           ;;
-
-         relink)
-           if test "$hardcode_direct" = yes; then
-             compile_command="$compile_command $absdir/$linklib"
-             deplibs="$deplibs $absdir/$linklib"
-           elif test "$hardcode_minus_L" = yes; then
-             case "$compile_command " in
-             *" -L$absdir "*) ;;
-             *) compile_command="$compile_command -L$absdir";;
-             esac
-             compile_command="$compile_command -l$name"
-             deplibs="$deplibs -L$absdir -l$name"
-           elif test "$hardcode_shlibpath_var" = yes; then
-             case ":$compile_shlibpath:" in
-             *":$absdir:"*) ;;
-             *) compile_shlibpath="$compile_shlibpath$absdir:";;
-             esac
-             compile_command="$compile_command -l$name"
-             deplibs="$deplibs -l$name"
-           else
-             lib_linked=no
-           fi
-           ;;
-
-         *)
-           lib_linked=no
-           ;;
-         esac
-
-         if test "$lib_linked" != yes; then
-           $echo "$modename: configuration error: unsupported hardcode properties"
-           exit 1
-         fi
-
-         # Finalize command for both is simple: just hardcode it.
-         if test "$hardcode_direct" = yes; then
-           finalize_command="$finalize_command $libdir/$linklib"
-         elif test "$hardcode_minus_L" = yes; then
-           case "$finalize_command " in
-           *" -L$libdir "*) ;;
-           *) finalize_command="$finalize_command -L$libdir";;
-           esac
-           finalize_command="$finalize_command -l$name"
-         elif test "$hardcode_shlibpath_var" = yes; then
-           case ":$finalize_shlibpath:" in
-           *":$libdir:"*) ;;
-           *) finalize_shlibpath="$finalize_shlibpath$libdir:";;
-           esac
-           finalize_command="$finalize_command -l$name"
-         else
-           # We cannot seem to hardcode it, guess we'll fake it.
-           case "$finalize_command " in
-           *" -L$dir "*) ;;
-           *) finalize_command="$finalize_command -L$libdir";;
-           esac
-           finalize_command="$finalize_command -l$name"
-         fi
-       else
-         # Transform directly to old archives if we don't build new libraries.
-         if test -n "$pic_flag" && test -z "$old_library"; then
-           $echo "$modename: cannot find static library for \`$arg'" 1>&2
-           exit 1
-         fi
-
-         # Here we assume that one of hardcode_direct or hardcode_minus_L
-         # is not unsupported.  This is valid on all known static and
-         # shared platforms.
-         if test "$hardcode_direct" != unsupported; then
-           test -n "$old_library" && linklib="$old_library"
-           compile_command="$compile_command $dir/$linklib"
-           finalize_command="$finalize_command $dir/$linklib"
-         else
-           case "$compile_command " in
-           *" -L$dir "*) ;;
-           *) compile_command="$compile_command -L$dir";;
-           esac
-           compile_command="$compile_command -l$name"
-           case "$finalize_command " in
-           *" -L$dir "*) ;;
-           *) finalize_command="$finalize_command -L$dir";;
-           esac
-           finalize_command="$finalize_command -l$name"
-         fi
-       fi
-
-       # Add in any libraries that this one depends upon.
-       compile_command="$compile_command$dependency_libs"
-       finalize_command="$finalize_command$dependency_libs"
-       continue
-       ;;
-
-      # Some other compiler argument.
-      *)
-       # Unknown arguments in both finalize_command and compile_command need
-       # to be aesthetically quoted because they are evaled later.
-       arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-       case "$arg" in
-       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \   ]*|*]*)
-         arg="\"$arg\""
-         ;;
-       esac
-       ;;
-      esac
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-       compile_command="$compile_command $arg"
-       finalize_command="$finalize_command $arg"
-      fi
-    done
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      compile_command="$compile_command $arg"
-      finalize_command="$finalize_command $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
-    libobjs_save="$libobjs"
-
-    case "$output" in
-    "")
-      $echo "$modename: you must specify an output file" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-      ;;
-
-    *.a | *.lib)
-      if test -n "$link_against_libtool_libs"; then
-       $echo "$modename: error: cannot link libtool libraries into archives" 1>&2
-       exit 1
-      fi
-
-      if test -n "$deplibs"; then
-       $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
-      fi
-
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$rpath"; then
-       $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$xrpath"; then
-       $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$vinfo"; then
-       $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$release"; then
-       $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
-      fi
-
-      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-       $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
-      fi
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      ;;
-
-    *.la)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case "$outputname" in
-      lib*)
-       name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-       eval libname=\"$libname_spec\"
-       ;;
-      *)
-       if test "$module" = no; then
-         $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-       fi
-       if test "$need_lib_prefix" != no; then
-         # Add the "lib" prefix for modules if required
-         name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-         eval libname=\"$libname_spec\"
-       else
-         libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
-       fi
-       ;;
-      esac
-
-      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$output_objdir" = "X$output"; then
-       output_objdir="$objdir"
-      else
-       output_objdir="$output_objdir/$objdir"
-      fi
-
-      if test -n "$objs"; then
-       $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
-       exit 1
-      fi
-
-      # How the heck are we supposed to write a wrapper for a shared library?
-      if test -n "$link_against_libtool_libs"; then
-        $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
-        exit 1
-      fi
-
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
-      fi
-
-      set dummy $rpath
-      if test $# -gt 2; then
-       $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
-      fi
-      install_libdir="$2"
-
-      oldlibs=
-      if test -z "$rpath"; then
-       if test "$build_libtool_libs" = yes; then
-         # Building a libtool convenience library.
-         libext=al
-         oldlibs="$output_objdir/$libname.$libext $oldlibs"
-         build_libtool_libs=convenience
-         build_old_libs=yes
-       fi
-       dependency_libs="$deplibs"
-
-       if test -n "$vinfo"; then
-         $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
-       fi
-
-       if test -n "$release"; then
-         $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
-       fi
-      else
-
-       # Parse the version information argument.
-       IFS="${IFS=     }"; save_ifs="$IFS"; IFS=':'
-       set dummy $vinfo 0 0 0
-       IFS="$save_ifs"
-
-       if test -n "$8"; then
-         $echo "$modename: too many parameters to \`-version-info'" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-       fi
-
-       current="$2"
-       revision="$3"
-       age="$4"
-
-       # Check that each of the things are valid numbers.
-       case "$current" in
-       0 | [1-9] | [1-9][0-9]*) ;;
-       *)
-         $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
-         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-         exit 1
-         ;;
-       esac
-
-       case "$revision" in
-       0 | [1-9] | [1-9][0-9]*) ;;
-       *)
-         $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
-         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-         exit 1
-         ;;
-       esac
-
-       case "$age" in
-       0 | [1-9] | [1-9][0-9]*) ;;
-       *)
-         $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
-         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-         exit 1
-         ;;
-       esac
-
-       if test $age -gt $current; then
-         $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
-         $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-         exit 1
-       fi
-
-       # Calculate the version variables.
-       major=
-       versuffix=
-       verstring=
-       case "$version_type" in
-       none) ;;
-
-       irix)
-         major=`expr $current - $age + 1`
-         versuffix="$major.$revision"
-         verstring="sgi$major.$revision"
-
-         # Add in all the interfaces that we are compatible with.
-         loop=$revision
-         while test $loop != 0; do
-           iface=`expr $revision - $loop`
-           loop=`expr $loop - 1`
-           verstring="sgi$major.$iface:$verstring"
-         done
-         ;;
-
-       linux)
-         major=.`expr $current - $age`
-         versuffix="$major.$age.$revision"
-         ;;
-
-       osf)
-         major=`expr $current - $age`
-         versuffix=".$current.$age.$revision"
-         verstring="$current.$age.$revision"
-
-         # Add in all the interfaces that we are compatible with.
-         loop=$age
-         while test $loop != 0; do
-           iface=`expr $current - $loop`
-           loop=`expr $loop - 1`
-           verstring="$verstring:${iface}.0"
-         done
-
-         # Make executables depend on our current version.
-         verstring="$verstring:${current}.0"
-         ;;
-
-       sunos)
-         major=".$current"
-         versuffix=".$current.$revision"
-         ;;
-
-       freebsd-aout)
-         major=".$current"
-         versuffix=".$current.$revision";
-         ;;
-
-       freebsd-elf)
-         major=".$current"
-         versuffix=".$current";
-         ;;
-
-       windows)
-         # Like Linux, but with '-' rather than '.', since we only
-         # want one extension on Windows 95.
-         major=`expr $current - $age`
-         versuffix="-$major-$age-$revision"
-         ;;
-
-       *)
-         $echo "$modename: unknown library version type \`$version_type'" 1>&2
-         echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-         exit 1
-         ;;
-       esac
-
-       # Clear the version info if we defaulted, and they specified a release.
-       if test -z "$vinfo" && test -n "$release"; then
-         major=
-         verstring="0.0"
-         if test "$need_version" = no; then
-           versuffix=
-         else
-           versuffix=".0.0"
-         fi
-       fi
-
-       # Remove version info from name if versioning should be avoided
-       if test "$avoid_version" = yes && test "$need_version" = no; then
-         major=
-         versuffix=
-         verstring=""
-       fi
-       
-       # Check to see if the archive will have undefined symbols.
-       if test "$allow_undefined" = yes; then
-         if test "$allow_undefined_flag" = unsupported; then
-           $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
-           build_libtool_libs=no
-           build_old_libs=yes
-         fi
-       else
-         # Don't allow undefined symbols.
-         allow_undefined_flag="$no_undefined_flag"
-       fi
-
-       dependency_libs="$deplibs"
-       case "$host" in
-       *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*)
-         # these systems don't actually have a c library (as such)!
-         ;;
-       *)
-         # Add libc to deplibs on all other systems.
-         deplibs="$deplibs -lc"
-         ;;
-       esac
-      fi
-
-      # Create the output directory, or remove our outputs if we need to.
-      if test -d $output_objdir; then
-       $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
-       $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
-      else
-       $show "$mkdir $output_objdir"
-       $run $mkdir $output_objdir
-       status=$?
-       if test $status -ne 0 && test ! -d $output_objdir; then
-         exit $status
-       fi
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-       oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-       # Transform .lo files to .o files.
-       oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
-
-      if test "$build_libtool_libs" = yes; then
-       # Transform deplibs into only deplibs that can be linked in shared.
-       name_save=$name
-       libname_save=$libname
-       release_save=$release
-       versuffix_save=$versuffix
-       major_save=$major
-       # I'm not sure if I'm treating the release correctly.  I think
-       # release should show up in the -l (ie -lgmp5) so we don't want to
-       # add it in twice.  Is that correct?
-       release=""
-       versuffix=""
-       major=""
-       newdeplibs=
-       droppeddeps=no
-       case "$deplibs_check_method" in
-       pass_all)
-         # Don't check for shared/static.  Everything works.
-         # This might be a little naive.  We might want to check
-         # whether the library exists or not.  But this is on
-         # osf3 & osf4 and I'm not really sure... Just
-         # implementing what was already the behaviour.
-         newdeplibs=$deplibs
-         ;;
-       test_compile)
-         # This code stresses the "libraries are programs" paradigm to its
-         # limits. Maybe even breaks it.  We compile a program, linking it
-         # against the deplibs as a proxy for the library.  Then we can check
-         # whether they linked in statically or dynamically with ldd.
-         $rm conftest.c
-         cat > conftest.c <<EOF
-         int main() { return 0; }
-EOF
-         $rm conftest
-         $CC -o conftest conftest.c $deplibs
-         if test $? -eq 0 ; then
-           ldd_output=`ldd conftest`
-           for i in $deplibs; do
-             name="`expr $i : '-l\(.*\)'`"
-             # If $name is empty we are operating on a -L argument.
-             if test "$name" != "" ; then
-               libname=`eval \\$echo \"$libname_spec\"`
-               deplib_matches=`eval \\$echo \"$library_names_spec\"`
-               set dummy $deplib_matches
-               deplib_match=$2
-               if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-                 newdeplibs="$newdeplibs $i"
-               else
-                 droppeddeps=yes
-                 echo
-                 echo "*** Warning: This library needs some functionality provided by $i."
-                 echo "*** I have the capability to make that library automatically link in when"
-                 echo "*** you link to this library.  But I can only do this if you have a"
-                 echo "*** shared version of the library, which you do not appear to have."
-               fi
-             else
-               newdeplibs="$newdeplibs $i"
-             fi
-           done
-         else
-           # Error occured in the first compile.  Let's try to salvage the situation:
-           # Compile a seperate program for each library.
-           for i in $deplibs; do
-             name="`expr $i : '-l\(.*\)'`"
-            # If $name is empty we are operating on a -L argument.
-             if test "$name" != "" ; then
-               $rm conftest
-               $CC -o conftest conftest.c $i
-               # Did it work?
-               if test $? -eq 0 ; then
-                 ldd_output=`ldd conftest`
-                 libname=`eval \\$echo \"$libname_spec\"`
-                 deplib_matches=`eval \\$echo \"$library_names_spec\"`
-                 set dummy $deplib_matches
-                 deplib_match=$2
-                 if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-                   newdeplibs="$newdeplibs $i"
-                 else
-                   droppeddeps=yes
-                   echo
-                   echo "*** Warning: This library needs some functionality provided by $i."
-                   echo "*** I have the capability to make that library automatically link in when"
-                   echo "*** you link to this library.  But I can only do this if you have a"
-                   echo "*** shared version of the library, which you do not appear to have."
-                 fi
-               else
-                 droppeddeps=yes
-                 echo
-                 echo "*** Warning!  Library $i is needed by this library but I was not able to"
-                 echo "***  make it link in!  You will probably need to install it or some"
-                 echo "*** library that it depends on before this library will be fully"
-                 echo "*** functional.  Installing it before continuing would be even better."
-               fi
-             else
-               newdeplibs="$newdeplibs $i"
-             fi
-           done
-         fi
-         ;;
-       file_magic*)
-         set dummy $deplibs_check_method
-         file_magic_regex="`expr \"$deplibs_check_method\" : \"$2 \(.*\)\"`"
-         for a_deplib in $deplibs; do
-           name="`expr $a_deplib : '-l\(.*\)'`"
-           # If $name is empty we are operating on a -L argument.
-           if test "$name" != "" ; then
-             libname=`eval \\$echo \"$libname_spec\"`
-             for i in $lib_search_path; do
-                   potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-                   for potent_lib in $potential_libs; do
-                     # Follow soft links.
-                     if ls -lLd "$potent_lib" 2>/dev/null \
-                        | grep " -> " >/dev/null; then
-                       continue 
-                     fi
-                     # The statement above tries to avoid entering an
-                     # endless loop below, in case of cyclic links.
-                     # We might still enter an endless loop, since a link
-                     # loop can be closed while we follow links,
-                     # but so what?
-                     potlib="$potent_lib"
-                     while test -h "$potlib" 2>/dev/null; do
-                       potliblink=`ls -ld $potlib | sed 's/.* -> //'`
-                       case "$potliblink" in
-                       [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-                       *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-                       esac
-                     done
-                     if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
-                        | sed 10q \
-                        | egrep "$file_magic_regex" > /dev/null; then
-                       newdeplibs="$newdeplibs $a_deplib"
-                       a_deplib=""
-                       break 2
-                     fi
-                   done
-             done
-             if test -n "$a_deplib" ; then
-               droppeddeps=yes
-               echo
-               echo "*** Warning: This library needs some functionality provided by $a_deplib."
-               echo "*** I have the capability to make that library automatically link in when"
-               echo "*** you link to this library.  But I can only do this if you have a"
-               echo "*** shared version of the library, which you do not appear to have."
-             fi
-           else
-             # Add a -L argument.
-             newdeplibs="$newdeplibs $a_deplib"
-           fi
-         done # Gone through all deplibs.
-         ;;
-       none | unknown | *)
-         newdeplibs=""
-         if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
-              -e 's/ -[LR][^ ]*//g' -e 's/[    ]//g' |
-            grep . >/dev/null; then
-           echo
-           if test "X$deplibs_check_method" = "Xnone"; then
-             echo "*** Warning: inter-library dependencies are not supported in this platform."
-           else
-             echo "*** Warning: inter-library dependencies are not known to be supported."
-           fi
-           echo "*** All declared inter-library dependencies are being dropped."
-           droppeddeps=yes
-         fi
-         ;;
-       esac
-       versuffix=$versuffix_save
-       major=$major_save
-       release=$release_save
-       libname=$libname_save
-       name=$name_save
-
-       if test "$droppeddeps" = yes; then
-         if test "$module" = yes; then
-           echo
-           echo "*** Warning: libtool could not satisfy all declared inter-library"
-           echo "*** dependencies of module $libname.  Therefore, libtool will create"
-           echo "*** a static module, that should work as long as the dlopening"
-           echo "*** application is linked with the -dlopen flag."
-           if test -z "$global_symbol_pipe"; then
-             echo
-             echo "*** However, this would only work if libtool was able to extract symbol"
-             echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-             echo "*** not find such a program.  So, this module is probably useless."
-             echo "*** \`nm' from GNU binutils and a full rebuild may help."
-           fi
-           if test "$build_old_libs" = no; then
-             oldlibs="$output_objdir/$libname.$libext"
-             build_libtool_libs=module
-             build_old_libs=yes
-           else
-             build_libtool_libs=no
-           fi
-         else
-           echo "*** The inter-library dependencies that have been dropped here will be"
-           echo "*** automatically added whenever a program is linked with this library"
-           echo "*** or is declared to -dlopen it."
-         fi
-       fi
-       # Done checking deplibs!
-       deplibs=$newdeplibs
-      fi
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-      
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-       # Get the real and link names of the library.
-       eval library_names=\"$library_names_spec\"
-       set dummy $library_names
-       realname="$2"
-       shift; shift
-
-       if test -n "$soname_spec"; then
-         eval soname=\"$soname_spec\"
-       else
-         soname="$realname"
-       fi
-
-       lib="$output_objdir/$realname"
-       for link
-       do
-         linknames="$linknames $link"
-       done
-
-       # Ensure that we have .o objects for linkers which dislike .lo
-       # (e.g. aix) in case we are running --disable-static
-       for obj in $libobjs; do
-         xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
-         if test "X$xdir" = "X$obj"; then
-           xdir="."
-         else
-           xdir="$xdir"
-         fi
-         baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
-         oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
-         if test ! -f $xdir/$oldobj; then
-           $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
-           $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
-         fi
-       done
-
-       # Use standard objects if they are pic
-       test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-
-       # Prepare the list of exported symbols
-       if test -z "$export_symbols"; then
-         if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-           $show "generating symbol list for \`$libname.la'"
-           export_symbols="$output_objdir/$libname.exp"
-           $run $rm $export_symbols
-           eval cmds=\"$export_symbols_cmds\"
-           IFS="${IFS=         }"; save_ifs="$IFS"; IFS='~'
-           for cmd in $cmds; do
-             IFS="$save_ifs"
-             $show "$cmd"
-             $run eval "$cmd" || exit $?
-           done
-           IFS="$save_ifs"
-           if test -n "$export_symbols_regex"; then
-             $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
-             $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-             $show "$mv \"${export_symbols}T\" \"$export_symbols\""
-             $run eval '$mv "${export_symbols}T" "$export_symbols"'
-           fi
-         fi
-       fi
-
-       if test -n "$export_symbols" && test -n "$include_expsyms"; then
-         $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
-       fi
-
-       if test -n "$convenience"; then
-         if test -n "$whole_archive_flag_spec"; then
-           eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-         else
-           gentop="$output_objdir/${outputname}x"
-           $show "${rm}r $gentop"
-           $run ${rm}r "$gentop"
-           $show "mkdir $gentop"
-           $run mkdir "$gentop"
-           status=$?
-           if test $status -ne 0 && test ! -d "$gentop"; then
-             exit $status
-           fi
-           generated="$generated $gentop"
-
-           for xlib in $convenience; do
-             # Extract the objects.
-             case "$xlib" in
-             [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
-             *) xabs=`pwd`"/$xlib" ;;
-             esac
-             xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
-             xdir="$gentop/$xlib"
-
-             $show "${rm}r $xdir"
-             $run ${rm}r "$xdir"
-             $show "mkdir $xdir"
-             $run mkdir "$xdir"
-             status=$?
-             if test $status -ne 0 && test ! -d "$xdir"; then
-               exit $status
-             fi
-             $show "(cd $xdir && $AR x $xabs)"
-             $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
-             libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
-           done
-         fi
-       fi
-
-       if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-         eval flag=\"$thread_safe_flag_spec\"
-         linkopts="$linkopts $flag"
-       fi
-
-       # Do each of the archive commands.
-       if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-         eval cmds=\"$archive_expsym_cmds\"
-       else
-         eval cmds=\"$archive_cmds\"
-       fi
-       IFS="${IFS=     }"; save_ifs="$IFS"; IFS='~'
-       for cmd in $cmds; do
-         IFS="$save_ifs"
-         $show "$cmd"
-         $run eval "$cmd" || exit $?
-       done
-       IFS="$save_ifs"
-
-       # Create links to the real library.
-       for linkname in $linknames; do
-         if test "$realname" != "$linkname"; then
-           $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
-           $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
-         fi
-       done
-
-       # If -module or -export-dynamic was specified, set the dlname.
-       if test "$module" = yes || test "$export_dynamic" = yes; then
-         # On all known operating systems, these are identical.
-         dlname="$soname"
-       fi
-      fi
-      ;;
-
-    *.lo | *.o | *.obj)
-      if test -n "$link_against_libtool_libs"; then
-       $echo "$modename: error: cannot link libtool libraries into objects" 1>&2
-       exit 1
-      fi
-
-      if test -n "$deplibs"; then
-       $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
-      fi
-
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$rpath"; then
-       $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$xrpath"; then
-       $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$vinfo"; then
-       $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
-      fi
-
-      if test -n "$release"; then
-       $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
-      fi
-
-      case "$output" in
-      *.lo)
-       if test -n "$objs"; then
-         $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
-         exit 1
-       fi
-       libobj="$output"
-       obj=`$echo "X$output" | $Xsed -e "$lo2o"`
-       ;;
-      *)
-       libobj=
-       obj="$output"
-       ;;
-      esac
-
-      # Delete the old objects.
-      $run $rm $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec
-      wl= 
-
-      if test -n "$convenience"; then
-       if test -n "$whole_archive_flag_spec"; then
-         eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
-       else
-         gentop="$output_objdir/${obj}x"
-         $show "${rm}r $gentop"
-         $run ${rm}r "$gentop"
-         $show "mkdir $gentop"
-         $run mkdir "$gentop"
-         status=$?
-         if test $status -ne 0 && test ! -d "$gentop"; then
-           exit $status
-         fi
-         generated="$generated $gentop"
-
-         for xlib in $convenience; do
-           # Extract the objects.
-           case "$xlib" in
-           [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
-           *) xabs=`pwd`"/$xlib" ;;
-           esac
-           xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
-           xdir="$gentop/$xlib"
-
-           $show "${rm}r $xdir"
-           $run ${rm}r "$xdir"
-           $show "mkdir $xdir"
-           $run mkdir "$xdir"
-           status=$?
-           if test $status -ne 0 && test ! -d "$xdir"; then
-             exit $status
-           fi
-           $show "(cd $xdir && $AR x $xabs)"
-           $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
-           reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
-         done
-       fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs"
-
-      output="$obj"
-      eval cmds=\"$reload_cmds\"
-      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-       IFS="$save_ifs"
-       $show "$cmd"
-       $run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-       if test -n "$gentop"; then
-         $show "${rm}r $gentop"
-         $run ${rm}r $gentop
-       fi
-
-       exit 0
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-       if test -n "$gentop"; then
-         $show "${rm}r $gentop"
-         $run ${rm}r $gentop
-       fi
-
-       # Create an invalid libtool object if no PIC, so that we don't
-       # accidentally link it into a program.
-       $show "echo timestamp > $libobj"
-       $run eval "echo timestamp > $libobj" || exit $?
-       exit 0
-      fi
-
-      if test -n "$pic_flag"; then
-       # Only do commands if we really have different PIC objects.
-       reload_objs="$libobjs $reload_conv_objs"
-       output="$libobj"
-       eval cmds=\"$reload_cmds\"
-       IFS="${IFS=     }"; save_ifs="$IFS"; IFS='~'
-       for cmd in $cmds; do
-         IFS="$save_ifs"
-         $show "$cmd"
-         $run eval "$cmd" || exit $?
-       done
-       IFS="$save_ifs"
-      else
-       # Just create a symlink.
-       $show $rm $libobj
-       $run $rm $libobj
-       xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
-       if test "X$xdir" = "X$libobj"; then
-         xdir="."
-       else
-         xdir="$xdir"
-       fi
-       baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
-       oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
-       $show "(cd $xdir && $LN_S $oldobj $baseobj)"
-       $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
-      fi
-
-      if test -n "$gentop"; then
-       $show "${rm}r $gentop"
-       $run ${rm}r $gentop
-      fi
-
-      exit 0
-      ;;
-
-    # Anything else should be a program.
-    *)
-      if test -n "$vinfo"; then
-       $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
-      fi
-
-      if test -n "$release"; then
-       $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
-      fi
-
-      if test "$preload" = yes; then
-       if test "$dlopen" = unknown && test "$dlopen_self" = unknown &&
-          test "$dlopen_self_static" = unknown; then
-         $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
-       fi 
-      fi
-    
-      if test -n "$rpath$xrpath"; then
-       # If the user specified any rpath flags, then add them.
-       for libdir in $rpath $xrpath; do
-         # This is the magic to use -rpath.
-         case "$compile_rpath " in
-         *" $libdir "*) ;;
-         *) compile_rpath="$compile_rpath $libdir" ;;
-         esac
-         case "$finalize_rpath " in
-         *" $libdir "*) ;;
-         *) finalize_rpath="$finalize_rpath $libdir" ;;
-         esac
-       done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-       if test -n "$hardcode_libdir_flag_spec"; then
-         if test -n "$hardcode_libdir_separator"; then
-           if test -z "$hardcode_libdirs"; then
-             hardcode_libdirs="$libdir"
-           else
-             # Just accumulate the unique libdirs.
-             case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
-             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-               ;;
-             *)
-               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-               ;;
-             esac
-           fi
-         else
-           eval flag=\"$hardcode_libdir_flag_spec\"
-           rpath="$rpath $flag"
-         fi
-       elif test -n "$runpath_var"; then
-         case "$perm_rpath " in
-         *" $libdir "*) ;;
-         *) perm_rpath="$perm_rpath $libdir" ;;
-         esac
-       fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-        test -n "$hardcode_libdirs"; then
-       libdir="$hardcode_libdirs"
-       eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-       if test -n "$hardcode_libdir_flag_spec"; then
-         if test -n "$hardcode_libdir_separator"; then
-           if test -z "$hardcode_libdirs"; then
-             hardcode_libdirs="$libdir"
-           else
-             # Just accumulate the unique libdirs.
-             case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
-             *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-               ;;
-             *)
-               hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-               ;;
-             esac
-           fi
-         else
-           eval flag=\"$hardcode_libdir_flag_spec\"
-           rpath="$rpath $flag"
-         fi
-       elif test -n "$runpath_var"; then
-         case "$finalize_perm_rpath " in
-         *" $libdir "*) ;;
-         *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-         esac
-       fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-        test -n "$hardcode_libdirs"; then
-       libdir="$hardcode_libdirs"
-       eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
-      if test "X$output_objdir" = "X$output"; then
-       output_objdir="$objdir"
-      else
-       output_objdir="$output_objdir/$objdir"
-      fi
-
-      # Create the binary in the object directory, then wrap it.
-      if test ! -d $output_objdir; then
-       $show "$mkdir $output_objdir"
-       $run $mkdir $output_objdir
-       status=$?
-       if test $status -ne 0 && test ! -d $output_objdir; then
-         exit $status
-       fi
-      fi
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-       # Transform all the library objects into standard objects.
-       compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-       finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
-
-      dlsyms=
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-         dlsyms="${outputname}S.c"
-       else
-         $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
-       fi
-      fi
-
-      if test -n "$dlsyms"; then
-       case "$dlsyms" in
-       "") ;;
-       *.c)
-         # Discover the nlist of each of the dlfiles.
-         nlist="$output_objdir/${outputname}.nm"
-
-         $show "$rm $nlist ${nlist}S ${nlist}T"
-         $run $rm "$nlist" "${nlist}S" "${nlist}T"
-
-         # Parse the name list into a source file.
-         $show "creating $output_objdir/$dlsyms"
-
-         test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
-
-/* External symbol declarations for the compiler. */\
-"
-
-         if test "$dlself" = yes; then
-           $show "generating symbol list for \`$output'"
-
-           test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
-
-           # Add our own program objects to the symbol list.
-           progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-           for arg in $progfiles; do
-             $show "extracting global C symbols from \`$arg'"
-             $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-           done
-
-           if test -n "$exclude_expsyms"; then
-             $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-             $run eval '$mv "$nlist"T "$nlist"'
-           fi
-           
-           if test -n "$export_symbols_regex"; then
-             $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-             $run eval '$mv "$nlist"T "$nlist"'
-           fi
-
-           # Prepare the list of exported symbols
-           if test -z "$export_symbols"; then
-             export_symbols="$output_objdir/$output.exp"
-             $run $rm $export_symbols
-             $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-           else
-             $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
-             $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
-             $run eval 'mv "$nlist"T "$nlist"'
-           fi
-         fi
-
-         for arg in $dlprefiles; do
-           $show "extracting global C symbols from \`$arg'"
-           name=`echo "$arg" | sed -e 's%^.*/%%'`
-           $run eval 'echo ": $name " >> "$nlist"'
-           $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
-         done
-
-         if test -z "$run"; then
-           # Make sure we have at least an empty file.
-           test -f "$nlist" || : > "$nlist"
-
-           if test -n "$exclude_expsyms"; then
-             egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-             $mv "$nlist"T "$nlist"
-           fi
-
-           # Try sorting and uniquifying the output.
-           if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
-             :
-           else
-             grep -v "^: " < "$nlist" > "$nlist"S
-           fi
-
-           if test -f "$nlist"S; then
-             eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
-           else
-             echo '/* NONE */' >> "$output_objdir/$dlsyms"
-           fi
-
-           $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr_t void *
-#else
-# define lt_ptr_t char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
-  const char *name;
-  lt_ptr_t address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
-           sed -n -e 's/^: \([^ ]*\) $/  {\"\1\", (lt_ptr_t) 0},/p' \
-               -e 's/^. \([^ ]*\) \([^ ]*\)$/  {"\2", (lt_ptr_t) \&\2},/p' \
-                 < "$nlist" >> "$output_objdir/$dlsyms"
-
-           $echo >> "$output_objdir/$dlsyms" "\
-  {0, (lt_ptr_t) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-         fi
-
-         pic_flag_for_symtable=
-         case "$host" in
-         # compiling the symbol table file with pic_flag works around
-         # a FreeBSD bug that causes programs to crash when -lm is
-         # linked before any other PIC object.  But we must not use
-         # pic_flag when linking with -static.  The problem exists in
-         # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-         *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-           case "$compile_command " in
-           *" -static "*) ;;
-           *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
-           esac;;
-         *-*-hpux*)
-           case "$compile_command " in
-           *" -static "*) ;;
-           *) pic_flag_for_symtable=" $pic_flag -DPIC";;
-           esac
-         esac
-
-         # Now compile the dynamic symbol file.
-         $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
-         $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
-         # Clean up the generated files.
-         $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
-         $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
-         # Transform the symbol file into the correct name.
-         compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-         finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
-         ;;
-       *)
-         $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
-         exit 1
-         ;;
-       esac
-      else
-       # We keep going just in case the user didn't refer to
-       # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-       # really was required.
-
-       # Nullify the symbol file.
-       compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-       finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-      fi
-
-      if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
-       # Replace the output file specification.
-       compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-       link_command="$compile_command$compile_rpath"
-
-       # We have no uninstalled library dependencies, so finalize right now.
-       $show "$link_command"
-       $run eval "$link_command"
-       status=$?
-       
-       # Delete the generated files.
-       if test -n "$dlsyms"; then
-         $show "$rm $output_objdir/${outputname}S.${objext}"
-         $run $rm "$output_objdir/${outputname}S.${objext}"
-       fi
-
-       exit $status
-      fi
-
-      if test -n "$shlibpath_var"; then
-       # We should set the shlibpath_var
-       rpath=
-       for dir in $temp_rpath; do
-         case "$dir" in
-         [\\/]* | [A-Za-z]:[\\/]*)
-           # Absolute path.
-           rpath="$rpath$dir:"
-           ;;
-         *)
-           # Relative path: add a thisdir entry.
-           rpath="$rpath\$thisdir/$dir:"
-           ;;
-         esac
-       done
-       temp_rpath="$rpath"
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-       compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-       finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-       if test -n "$perm_rpath"; then
-         # We should set the runpath_var.
-         rpath=
-         for dir in $perm_rpath; do
-           rpath="$rpath$dir:"
-         done
-         compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-       fi
-       if test -n "$finalize_perm_rpath"; then
-         # We should set the runpath_var.
-         rpath=
-         for dir in $finalize_perm_rpath; do
-           rpath="$rpath$dir:"
-         done
-         finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-       fi
-      fi
-
-      if test "$hardcode_action" = relink; then
-       # Fast installation is not supported
-       link_command="$compile_var$compile_command$compile_rpath"
-       relink_command="$finalize_var$finalize_command$finalize_rpath"
-       
-       $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
-       $echo "$modename: \`$output' will be relinked during installation" 1>&2
-      else
-       if test "$fast_install" != no; then
-         link_command="$finalize_var$compile_command$finalize_rpath"
-         if test "$fast_install" = yes; then
-           relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-         else
-           # fast_install is set to needless
-           relink_command=
-         fi
-       else
-         link_command="$compile_var$compile_command$compile_rpath"
-         relink_command="$finalize_var$finalize_command$finalize_rpath"
-       fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-      
-      # Delete the old output files.
-      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      $show "$link_command"
-      $run eval "$link_command" || exit $?
-
-      # Now create the wrapper script.
-      $show "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-       relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Quote $echo for shipping.
-      if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
-       case "$0" in
-       [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
-       *) qecho="$SHELL `pwd`/$0 --fallback-echo";;
-       esac
-       qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-       qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if our run command is non-null.
-      if test -z "$run"; then
-       # win32 will think the script is a binary if it has
-       # a .exe suffix, so we strip it off here.
-       case $output in
-         *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
-       esac
-       $rm $output
-       trap "$rm $output; exit 1" 1 2 15
-
-       $echo > $output "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variable:
-  link_against_libtool_libs='$link_against_libtool_libs'
-else
-  # When we are sourced in execute mode, \$file and \$echo are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    echo=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$echo works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$echo will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
-"
-       $echo >> $output "\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
-  done
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-       if test "$fast_install" = yes; then
-         echo >> $output "\
-  program=lt-'$outputname'
-  progdir=\"\$thisdir/$objdir\"
-  
-  if test ! -f \"\$progdir/\$program\" || \\
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $mkdir \"\$progdir\"
-    else
-      $rm \"\$progdir/\$file\"
-    fi"
-
-         echo >> $output "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if (cd \"\$thisdir\" && eval \$relink_command); then :
-      else
-       $rm \"\$progdir/\$file\"
-       exit 1
-      fi
-    fi
-
-    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $rm \"\$progdir/\$program\";
-      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $rm \"\$progdir/\$file\"
-  fi"
-       else
-         echo >> $output "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-       fi
-
-       echo >> $output "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-       # Export our shlibpath_var if we have one.
-       if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-         $echo >> $output "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-       fi
-
-       # fixup the dll searchpath if we need to.
-       if test -n "$dllsearchpath"; then
-         $echo >> $output "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-       fi
-
-       $echo >> $output "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-       case $host in
-       *-*-cygwin* | *-*-mingw | *-*-os2*)
-         # win32 systems need to use the prog path for dll
-         # lookup to work
-         $echo >> $output "\
-      exec \$progdir\\\\\$program \${1+\"\$@\"}
-"
-         ;;
-       *)
-         $echo >> $output "\
-      # Export the path to the program.
-      PATH=\"\$progdir:\$PATH\"
-      export PATH
-
-      exec \$program \${1+\"\$@\"}
-"
-         ;;
-       esac
-       $echo >> $output "\
-      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
-    \$echo \"This script is just a wrapper for \$program.\" 1>&2
-    echo \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-       chmod +x $output
-      fi
-      exit 0
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-       oldobjs="$libobjs_save"
-       addlibs="$convenience"
-       build_libtool_libs=no
-      else
-       if test "$build_libtool_libs" = module; then
-         oldobjs="$libobjs_save"
-         build_libtool_libs=no
-       else
-         oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
-       fi
-       addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-       gentop="$output_objdir/${outputname}x"
-       $show "${rm}r $gentop"
-       $run ${rm}r "$gentop"
-       $show "mkdir $gentop"
-       $run mkdir "$gentop"
-       status=$?
-       if test $status -ne 0 && test ! -d "$gentop"; then
-         exit $status
-       fi
-       generated="$generated $gentop"
-         
-       # Add in members from convenience archives.
-       for xlib in $addlibs; do
-         # Extract the objects.
-         case "$xlib" in
-         [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
-         *) xabs=`pwd`"/$xlib" ;;
-         esac
-         xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
-         xdir="$gentop/$xlib"
-
-         $show "${rm}r $xdir"
-         $run ${rm}r "$xdir"
-         $show "mkdir $xdir"
-         $run mkdir "$xdir"
-         status=$?
-         if test $status -ne 0 && test ! -d "$xdir"; then
-           exit $status
-         fi
-         $show "(cd $xdir && $AR x $xabs)"
-         $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
-         oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
-       done
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-       eval cmds=\"$old_archive_from_new_cmds\"
-      else
-       # Ensure that we have .o objects in place in case we decided
-       # not to build a shared library, and have fallen back to building
-       # static libs even though --disable-static was passed!
-       for oldobj in $oldobjs; do
-         if test ! -f $oldobj; then
-           xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
-           if test "X$xdir" = "X$oldobj"; then
-             xdir="."
-           else
-             xdir="$xdir"
-           fi
-           baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
-           obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
-           $show "(cd $xdir && ${LN_S} $obj $baseobj)"
-           $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
-         fi
-       done
-
-       eval cmds=\"$old_archive_cmds\"
-      fi
-      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-       IFS="$save_ifs"
-       $show "$cmd"
-       $run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
-
-    if test -n "$generated"; then
-      $show "${rm}r$generated"
-      $run ${rm}r$generated
-    fi
-
-    # Now create the libtool archive.
-    case "$output" in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      $show "creating $output"
-
-      if test -n "$xrpath"; then
-       temp_xrpath=
-       for libdir in $xrpath; do
-         temp_xrpath="$temp_xrpath -R$libdir"
-       done
-       dependency_libs="$temp_xrpath $dependency_libs"
-      fi
-
-      # Only create the output if not a dry run.
-      if test -z "$run"; then
-       for installed in no yes; do
-         if test "$installed" = yes; then
-           if test -z "$install_libdir"; then
-             break
-           fi
-           output="$output_objdir/$outputname"i
-         fi
-         $rm $output
-         $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$dlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'\
-"
-       done
-      fi
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
-      $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $?
-      ;;
-    esac
-    exit 0
-    ;;
-
-  # libtool install mode
-  install)
-    modename="$modename: install"
-
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then
-      # Aesthetically quote it.
-      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
-      case "$arg" in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*)
-       arg="\"$arg\""
-       ;;
-      esac
-      install_prog="$arg "
-      arg="$1"
-      shift
-    else
-      install_prog=
-      arg="$nonopt"
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-    case "$arg" in
-    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \      ]*|*]*)
-      arg="\"$arg\""
-      ;;
-    esac
-    install_prog="$install_prog$arg"
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-       files="$files $dest"
-       dest="$arg"
-       continue
-      fi
-
-      case "$arg" in
-      -d) isdir=yes ;;
-      -f) prev="-f" ;;
-      -g) prev="-g" ;;
-      -m) prev="-m" ;;
-      -o) prev="-o" ;;
-      -s)
-       stripme=" -s"
-       continue
-       ;;
-      -*) ;;
-
-      *)
-       # If the previous option needed an argument, then skip it.
-       if test -n "$prev"; then
-         prev=
-       else
-         dest="$arg"
-         continue
-       fi
-       ;;
-      esac
-
-      # Aesthetically quote the argument.
-      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-      case "$arg" in
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \    ]*|*]*)
-       arg="\"$arg\""
-       ;;
-      esac
-      install_prog="$install_prog $arg"
-    done
-
-    if test -z "$install_prog"; then
-      $echo "$modename: you must specify an install program" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    if test -n "$prev"; then
-      $echo "$modename: the \`$prev' option requires an argument" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-       $echo "$modename: no file or destination specified" 1>&2
-      else
-       $echo "$modename: you must specify a destination" 1>&2
-      fi
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    # Strip any trailing slash from the destination.
-    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$destdir" = "X$dest" && destdir=.
-      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files
-      if test $# -gt 2; then
-       $echo "$modename: \`$dest' is not a directory" 1>&2
-       $echo "$help" 1>&2
-       exit 1
-      fi
-    fi
-    case "$destdir" in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-       case "$file" in
-       *.lo) ;;
-       *)
-         $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-         ;;
-       esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case "$file" in
-      *.a | *.lib)
-       # Do the static libraries later.
-       staticlibs="$staticlibs $file"
-       ;;
-
-      *.la)
-       # Check to see that this really is a libtool archive.
-       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-       else
-         $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-       fi
-
-       library_names=
-       old_library=
-       # If there is no directory component, then add one.
-       case "$file" in
-       */* | *\\*) . $file ;;
-       *) . ./$file ;;
-       esac
-
-       # Add the libdir to current_libdirs if it is the destination.
-       if test "X$destdir" = "X$libdir"; then
-         case "$current_libdirs " in
-         *" $libdir "*) ;;
-         *) current_libdirs="$current_libdirs $libdir" ;;
-         esac
-       else
-         # Note the libdir as a future libdir.
-         case "$future_libdirs " in
-         *" $libdir "*) ;;
-         *) future_libdirs="$future_libdirs $libdir" ;;
-         esac
-       fi
-
-       dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
-       test "X$dir" = "X$file/" && dir=
-       dir="$dir$objdir"
-
-       # See the names of the shared library.
-       set dummy $library_names
-       if test -n "$2"; then
-         realname="$2"
-         shift
-         shift
-
-         # Install the shared library and build the symlinks.
-         $show "$install_prog $dir/$realname $destdir/$realname"
-         $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
-
-         if test $# -gt 0; then
-           # Delete the old symlinks, and create new ones.
-           for linkname
-           do
-             if test "$linkname" != "$realname"; then
-               $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
-               $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
-             fi
-           done
-         fi
-
-         # Do each command in the postinstall commands.
-         lib="$destdir/$realname"
-         eval cmds=\"$postinstall_cmds\"
-         IFS="${IFS=   }"; save_ifs="$IFS"; IFS='~'
-         for cmd in $cmds; do
-           IFS="$save_ifs"
-           $show "$cmd"
-           $run eval "$cmd" || exit $?
-         done
-         IFS="$save_ifs"
-       fi
-
-       # Install the pseudo-library for information purposes.
-       name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-       instname="$dir/$name"i
-       $show "$install_prog $instname $destdir/$name"
-       $run eval "$install_prog $instname $destdir/$name" || exit $?
-
-       # Maybe install the static library, too.
-       test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-       ;;
-
-      *.lo)
-       # Install (i.e. copy) a libtool object.
-
-       # Figure out destination file name, if it wasn't already specified.
-       if test -n "$destname"; then
-         destfile="$destdir/$destname"
-       else
-         destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-         destfile="$destdir/$destfile"
-       fi
-
-       # Deduce the name of the destination old-style object file.
-       case "$destfile" in
-       *.lo)
-         staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
-         ;;
-       *.o | *.obj)
-         staticdest="$destfile"
-         destfile=
-         ;;
-       *)
-         $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-         ;;
-       esac
-
-       # Install the libtool object if requested.
-       if test -n "$destfile"; then
-         $show "$install_prog $file $destfile"
-         $run eval "$install_prog $file $destfile" || exit $?
-       fi
-
-       # Install the old object if enabled.
-       if test "$build_old_libs" = yes; then
-         # Deduce the name of the old-style object file.
-         staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
-
-         $show "$install_prog $staticobj $staticdest"
-         $run eval "$install_prog \$staticobj \$staticdest" || exit $?
-       fi
-       exit 0
-       ;;
-
-      *)
-       # Figure out destination file name, if it wasn't already specified.
-       if test -n "$destname"; then
-         destfile="$destdir/$destname"
-       else
-         destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-         destfile="$destdir/$destfile"
-       fi
-
-       # Do a test to see if this is really a libtool program.
-       if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-         link_against_libtool_libs=
-         relink_command=
-
-         # If there is no directory component, then add one.
-         case "$file" in
-         */* | *\\*) . $file ;;
-         *) . ./$file ;;
-         esac
-
-         # Check the variables that should have been set.
-         if test -z "$link_against_libtool_libs"; then
-           $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
-           exit 1
-         fi
-
-         finalize=yes
-         for lib in $link_against_libtool_libs; do
-           # Check to see that each library is installed.
-           libdir=
-           if test -f "$lib"; then
-             # If there is no directory component, then add one.
-             case "$lib" in
-             */* | *\\*) . $lib ;;
-             *) . ./$lib ;;
-             esac
-           fi
-           libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
-           if test -n "$libdir" && test ! -f "$libfile"; then
-             $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
-             finalize=no
-           fi
-         done
-
-         outputname=
-         if test "$fast_install" = no && test -n "$relink_command"; then
-           if test "$finalize" = yes && test -z "$run"; then
-             tmpdir="/tmp"
-             test -n "$TMPDIR" && tmpdir="$TMPDIR"
-             tmpdir="$tmpdir/libtool-$$"
-             if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
-             else
-               $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
-               continue
-             fi
-             outputname="$tmpdir/$file"
-             # Replace the output file specification.
-             relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-             $show "$relink_command"
-             if $run eval "$relink_command"; then :
-             else
-               $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
-               ${rm}r "$tmpdir"
-               continue
-             fi
-             file="$outputname"
-           else
-             $echo "$modename: warning: cannot relink \`$file'" 1>&2
-           fi
-         else
-           # Install the binary that we compiled earlier.
-           file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-         fi
-       fi
-
-       $show "$install_prog$stripme $file $destfile"
-       $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
-       test -n "$outputname" && ${rm}r "$tmpdir"
-       ;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      $show "$install_prog $file $oldlib"
-      $run eval "$install_prog \$file \$oldlib" || exit $?
-
-      # Do each command in the postinstall commands.
-      eval cmds=\"$old_postinstall_cmds\"
-      IFS="${IFS=      }"; save_ifs="$IFS"; IFS='~'
-      for cmd in $cmds; do
-       IFS="$save_ifs"
-       $show "$cmd"
-       $run eval "$cmd" || exit $?
-      done
-      IFS="$save_ifs"
-    done
-
-    if test -n "$future_libdirs"; then
-      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
-    fi
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      test -n "$run" && current_libdirs=" -n$current_libdirs"
-      exec $SHELL $0 --finish$current_libdirs
-      exit 1
-    fi
-
-    exit 0
-    ;;
-
-  # libtool finish mode
-  finish)
-    modename="$modename: finish"
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-       libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-       if test -n "$finish_cmds"; then
-         # Do each command in the finish commands.
-         eval cmds=\"$finish_cmds\"
-         IFS="${IFS=   }"; save_ifs="$IFS"; IFS='~'
-         for cmd in $cmds; do
-           IFS="$save_ifs"
-           $show "$cmd"
-           $run eval "$cmd" || admincmds="$admincmds
-       $cmd"
-         done
-         IFS="$save_ifs"
-       fi
-       if test -n "$finish_eval"; then
-         # Do the single finish_eval.
-         eval cmds=\"$finish_eval\"
-         $run eval "$cmds" || admincmds="$admincmds
-       $cmds"
-       fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    test "$show" = : && exit 0
-
-    echo "----------------------------------------------------------------------"
-    echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      echo "   $libdir"
-    done
-    echo
-    echo "If you ever happen to want to link against installed libraries"
-    echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use \`-LLIBDIR'"
-    echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      echo "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      echo "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    echo
-    echo "See any operating system documentation about shared libraries for"
-    echo "more information, such as the ld(1) and ld.so(8) manual pages."
-    echo "----------------------------------------------------------------------"
-    exit 0
-    ;;
-
-  # libtool execute mode
-  execute)
-    modename="$modename: execute"
-
-    # The first argument is the command name.
-    cmd="$nonopt"
-    if test -z "$cmd"; then
-      $echo "$modename: you must specify a COMMAND" 1>&2
-      $echo "$help"
-      exit 1
-    fi
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      if test ! -f "$file"; then
-       $echo "$modename: \`$file' is not a file" 1>&2
-       $echo "$help" 1>&2
-       exit 1
-      fi
-
-      dir=
-      case "$file" in
-      *.la)
-       # Check to see that this really is a libtool archive.
-       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-       else
-         $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-         $echo "$help" 1>&2
-         exit 1
-       fi
-
-       # Read the libtool library.
-       dlname=
-       library_names=
-
-       # If there is no directory component, then add one.
-       case "$file" in
-       */* | *\\*) . $file ;;
-       *) . ./$file ;;
-       esac
-
-       # Skip this library if it cannot be dlopened.
-       if test -z "$dlname"; then
-         # Warn if it was a shared library.
-         test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
-         continue
-       fi
-
-       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-       test "X$dir" = "X$file" && dir=.
-
-       if test -f "$dir/$objdir/$dlname"; then
-         dir="$dir/$objdir"
-       else
-         $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
-         exit 1
-       fi
-       ;;
-
-      *.lo)
-       # Just add the directory containing the .lo file.
-       dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-       test "X$dir" = "X$file" && dir=.
-       ;;
-
-      *)
-       $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
-       continue
-       ;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-       eval "$shlibpath_var=\"\$dir\""
-      else
-       eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case "$file" in
-      -*) ;;
-      *)
-       # Do a test to see if this is really a libtool program.
-       if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-         # If there is no directory component, then add one.
-         case "$file" in
-         */* | *\\*) . $file ;;
-         *) . ./$file ;;
-         esac
-
-         # Transform arg to wrapped name.
-         file="$progdir/$program"
-       fi
-       ;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
-      args="$args \"$file\""
-    done
-
-    if test -z "$run"; then
-      if test -n "$shlibpath_var"; then
-        # Export the shlibpath_var.
-        eval "export $shlibpath_var"
-      fi
-
-      # Restore saved enviroment variables
-      if test "${save_LC_ALL+set}" = set; then
-       LC_ALL="$save_LC_ALL"; export LC_ALL
-      fi
-      if test "${save_LANG+set}" = set; then
-       LANG="$save_LANG"; export LANG
-      fi
-
-      # Now actually exec the command.
-      eval "exec \$cmd$args"
-
-      $echo "$modename: cannot exec \$cmd$args"
-      exit 1
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-        eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
-        $echo "export $shlibpath_var"
-      fi
-      $echo "$cmd$args"
-      exit 0
-    fi
-    ;;
-
-  # libtool uninstall mode
-  uninstall)
-    modename="$modename: uninstall"
-    rm="$nonopt"
-    files=
-
-    for arg
-    do
-      case "$arg" in
-      -*) rm="$rm $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    if test -z "$rm"; then
-      $echo "$modename: you must specify an RM program" 1>&2
-      $echo "$help" 1>&2
-      exit 1
-    fi
-
-    for file in $files; do
-      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
-      test "X$dir" = "X$file" && dir=.
-      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
-      rmfiles="$file"
-
-      case "$name" in
-      *.la)
-       # Possibly a libtool archive, so verify it.
-       if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-         . $dir/$name
-
-         # Delete the libtool libraries and symlinks.
-         for n in $library_names; do
-           rmfiles="$rmfiles $dir/$n"
-         done
-         test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
-
-         $show "$rm $rmfiles"
-         $run $rm $rmfiles
-
-         if test -n "$library_names"; then
-           # Do each command in the postuninstall commands.
-           eval cmds=\"$postuninstall_cmds\"
-           IFS="${IFS=         }"; save_ifs="$IFS"; IFS='~'
-           for cmd in $cmds; do
-             IFS="$save_ifs"
-             $show "$cmd"
-             $run eval "$cmd"
-           done
-           IFS="$save_ifs"
-         fi
-
-         if test -n "$old_library"; then
-           # Do each command in the old_postuninstall commands.
-           eval cmds=\"$old_postuninstall_cmds\"
-           IFS="${IFS=         }"; save_ifs="$IFS"; IFS='~'
-           for cmd in $cmds; do
-             IFS="$save_ifs"
-             $show "$cmd"
-             $run eval "$cmd"
-           done
-           IFS="$save_ifs"
-         fi
-
-         # FIXME: should reinstall the best remaining shared library.
-       fi
-       ;;
-
-      *.lo)
-       if test "$build_old_libs" = yes; then
-         oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
-         rmfiles="$rmfiles $dir/$oldobj"
-       fi
-       $show "$rm $rmfiles"
-       $run $rm $rmfiles
-       ;;
-
-      *)
-       $show "$rm $rmfiles"
-       $run $rm $rmfiles
-       ;;
-      esac
-    done
-    exit 0
-    ;;
-
-  "")
-    $echo "$modename: you must specify a MODE" 1>&2
-    $echo "$generic_help" 1>&2
-    exit 1
-    ;;
-  esac
-
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$generic_help" 1>&2
-  exit 1
-fi # test -z "$show_help"
-
-# We need to display help for each of the modes.
-case "$mode" in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
-    --config          show all configuration variables
-    --debug           enable verbose shell tracing
--n, --dry-run         display commands without modifying any files
-    --features        display basic configuration information and exit
-    --finish          same as \`--mode=finish'
-    --help            display this help message and exit
-    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
-    --quiet           same as \`--silent'
-    --silent          don't print informational messages
-    --version         print version information
-
-MODE must be one of the following:
-
-      compile         compile a source file into a libtool object
-      execute         automatically set library path, then run a program
-      finish          complete the installation of libtool libraries
-      install         install libraries or executables
-      link            create a library or an executable
-      uninstall       remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE."
-  exit 0
-  ;;
-
-compile)
-  $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -static           always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-  ;;
-
-execute)
-  $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-  ;;
-
-finish)
-  $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-  ;;
-
-install)
-  $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-  ;;
-
-link)
-  $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                   try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                   try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -static           do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                   specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-  ;;
-
-uninstall)
-  $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-  ;;
-
-*)
-  $echo "$modename: invalid operation mode \`$mode'" 1>&2
-  $echo "$help" 1>&2
-  exit 1
-  ;;
-esac
-
-echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
diff --git a/pcre/maketables.c b/pcre/maketables.c
deleted file mode 100644 (file)
index c0f06c0..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-
-See the file Tech.Notes for some information on the internals.
-*/
-
-
-/* This file is compiled on its own as part of the PCRE library. However,
-it is also included in the compilation of dftables.c, in which case the macro
-DFTABLES is defined. */
-
-#ifndef DFTABLES
-#include "internal.h"
-#endif
-
-
-
-/*************************************************
-*           Create PCRE character tables         *
-*************************************************/
-
-/* This function builds a set of character tables for use by PCRE and returns
-a pointer to them. They are build using the ctype functions, and consequently
-their contents will depend upon the current locale setting. When compiled as
-part of the library, the store is obtained via pcre_malloc(), but when compiled
-inside dftables, use malloc().
-
-Arguments:   none
-Returns:     pointer to the contiguous block of data
-*/
-
-unsigned const char *
-pcre_maketables(void)
-{
-unsigned char *yield, *p;
-int i;
-
-#ifndef DFTABLES
-yield = (unsigned char*)(pcre_malloc)(tables_length);
-#else
-yield = (unsigned char*)malloc(tables_length);
-#endif
-
-if (yield == NULL) return NULL;
-p = yield;
-
-/* First comes the lower casing table */
-
-for (i = 0; i < 256; i++) *p++ = tolower(i);
-
-/* Next the case-flipping table */
-
-for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
-
-/* Then the character class tables. Don't try to be clever and save effort
-on exclusive ones - in some locales things may be different. */
-
-memset(p, 0, cbit_length);
-for (i = 0; i < 256; i++)
-  {
-  if (isdigit(i))
-    {
-    p[cbit_digit  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (isupper(i))
-    {
-    p[cbit_upper  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (islower(i))
-    {
-    p[cbit_lower  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);
-  if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);
-  if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
-  if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);
-  if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);
-  if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);
-  if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);
-  }
-p += cbit_length;
-
-/* Finally, the character type table */
-
-for (i = 0; i < 256; i++)
-  {
-  int x = 0;
-  if (isspace(i)) x += ctype_space;
-  if (isalpha(i)) x += ctype_letter;
-  if (isdigit(i)) x += ctype_digit;
-  if (isxdigit(i)) x += ctype_xdigit;
-  if (isalnum(i) || i == '_') x += ctype_word;
-  if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
-  *p++ = x;
-  }
-
-return yield;
-}
-
-/* End of maketables.c */
diff --git a/pcre/pcre-config b/pcre/pcre-config
deleted file mode 100644 (file)
index ac9ccfe..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh
-
-prefix=/usr/local
-exec_prefix=${prefix}
-exec_prefix_set=no
-
-usage="\
-Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
-
-if test $# -eq 0; then
-      echo "${usage}" 1>&2
-      exit 1
-fi
-
-while test $# -gt 0; do
-  case "$1" in
-  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  case $1 in
-    --prefix=*)
-      prefix=$optarg
-      if test $exec_prefix_set = no ; then
-        exec_prefix=$optarg
-      fi
-      ;;
-    --prefix)
-      echo $prefix
-      ;;
-    --exec-prefix=*)
-      exec_prefix=$optarg
-      exec_prefix_set=yes
-      ;;
-    --exec-prefix)
-      echo $exec_prefix
-      ;;
-    --version)
-      echo 3.4
-      ;;
-    --cflags | --cflags-posix)
-      if test ${prefix}/include != /usr/include ; then
-        includes=-I${prefix}/include
-      fi
-      echo $includes
-      ;;
-    --libs-posix)
-      echo -L${exec_prefix}/lib -lpcreposix -lpcre
-      ;;
-    --libs)
-      echo -L${exec_prefix}/lib -lpcre
-      ;;
-    *)
-      echo "${usage}" 1>&2
-      exit 1
-      ;;
-  esac
-  shift
-done
diff --git a/pcre/pcre-config.in b/pcre/pcre-config.in
deleted file mode 100644 (file)
index 8daded9..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-exec_prefix_set=no
-
-usage="\
-Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
-
-if test $# -eq 0; then
-      echo "${usage}" 1>&2
-      exit 1
-fi
-
-while test $# -gt 0; do
-  case "$1" in
-  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  case $1 in
-    --prefix=*)
-      prefix=$optarg
-      if test $exec_prefix_set = no ; then
-        exec_prefix=$optarg
-      fi
-      ;;
-    --prefix)
-      echo $prefix
-      ;;
-    --exec-prefix=*)
-      exec_prefix=$optarg
-      exec_prefix_set=yes
-      ;;
-    --exec-prefix)
-      echo $exec_prefix
-      ;;
-    --version)
-      echo @PCRE_VERSION@
-      ;;
-    --cflags | --cflags-posix)
-      if test @includedir@ != /usr/include ; then
-        includes=-I@includedir@
-      fi
-      echo $includes
-      ;;
-    --libs-posix)
-      echo -L@libdir@ -lpcreposix -lpcre
-      ;;
-    --libs)
-      echo -L@libdir@ -lpcre
-      ;;
-    *)
-      echo "${usage}" 1>&2
-      exit 1
-      ;;
-  esac
-  shift
-done
diff --git a/pcre/pcre.c b/pcre/pcre.c
deleted file mode 100644 (file)
index 5149f8d..0000000
+++ /dev/null
@@ -1,5151 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* Define DEBUG to get debugging output on stdout. */
-
-/* #define DEBUG */
-
-/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
-inline, and there are *still* stupid compilers about that don't like indented
-pre-processor statements. I suppose it's only been 10 years... */
-
-#ifdef DEBUG
-#define DPRINTF(p) printf p
-#else
-#define DPRINTF(p) /*nothing*/
-#endif
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-/* Allow compilation as C++ source code, should anybody want to do that. */
-
-#ifdef __cplusplus
-#define class pcre_class
-#endif
-
-
-/* Number of items on the nested bracket stacks at compile time. This should
-not be set greater than 200. */
-
-#define BRASTACK_SIZE 200
-
-
-/* The number of bytes in a literal character string above which we can't add
-any more is different when UTF-8 characters may be encountered. */
-
-#ifdef SUPPORT_UTF8
-#define MAXLIT 250
-#else
-#define MAXLIT 255
-#endif
-
-
-/* Min and max values for the common repeats; for the maxima, 0 => infinity */
-
-static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
-static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
-
-/* Text forms of OP_ values and things, for debugging (not all used) */
-
-#ifdef DEBUG
-static const char *OP_names[] = {
-  "End", "\\A", "\\B", "\\b", "\\D", "\\d",
-  "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z",
-  "Opt", "^", "$", "Any", "chars", "not",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{",
-  "class", "Ref", "Recurse",
-  "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
-  "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
-  "Brazero", "Braminzero", "Bra"
-};
-#endif
-
-/* Table for handling escaped characters in the range '0'-'z'. Positive returns
-are simple data values; negative values are for special things like \d and so
-on. Zero means further processing is needed (for things like \x), or the escape
-is invalid. */
-
-static const short int escapes[] = {
-    0,      0,      0,      0,      0,      0,      0,      0,   /* 0 - 7 */
-    0,      0,    ':',    ';',    '<',    '=',    '>',    '?',   /* 8 - ? */
-  '@', -ESC_A, -ESC_B,      0, -ESC_D,      0,      0,      0,   /* @ - G */
-    0,      0,      0,      0,      0,      0,      0,      0,   /* H - O */
-    0,      0,      0, -ESC_S,      0,      0,      0, -ESC_W,   /* P - W */
-    0,      0, -ESC_Z,    '[',   '\\',    ']',    '^',    '_',   /* X - _ */
-  '`',      7, -ESC_b,      0, -ESC_d,     27,   '\f',      0,   /* ` - g */
-    0,      0,      0,      0,      0,      0,   '\n',      0,   /* h - o */
-    0,      0,   '\r', -ESC_s,   '\t',      0,      0, -ESC_w,   /* p - w */
-    0,      0, -ESC_z                                            /* x - z */
-};
-
-/* Tables of names of POSIX character classes and their lengths. The list is
-terminated by a zero length entry. The first three must be alpha, upper, lower,
-as this is assumed for handling case independence. */
-
-static const char *posix_names[] = {
-  "alpha", "lower", "upper",
-  "alnum", "ascii", "cntrl", "digit", "graph",
-  "print", "punct", "space", "word",  "xdigit" };
-
-static const uschar posix_name_lengths[] = {
-  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
-
-/* Table of class bit maps for each POSIX class; up to three may be combined
-to form the class. */
-
-static const int posix_class_maps[] = {
-  cbit_lower, cbit_upper, -1,             /* alpha */
-  cbit_lower, -1,         -1,             /* lower */
-  cbit_upper, -1,         -1,             /* upper */
-  cbit_digit, cbit_lower, cbit_upper,     /* alnum */
-  cbit_print, cbit_cntrl, -1,             /* ascii */
-  cbit_cntrl, -1,         -1,             /* cntrl */
-  cbit_digit, -1,         -1,             /* digit */
-  cbit_graph, -1,         -1,             /* graph */
-  cbit_print, -1,         -1,             /* print */
-  cbit_punct, -1,         -1,             /* punct */
-  cbit_space, -1,         -1,             /* space */
-  cbit_word,  -1,         -1,             /* word */
-  cbit_xdigit,-1,         -1              /* xdigit */
-};
-
-
-/* Definition to allow mutual recursion */
-
-static BOOL
-  compile_regex(int, int, int *, uschar **, const uschar **, const char **,
-    BOOL, int, int *, int *, compile_data *);
-
-/* Structure for building a chain of data that actually lives on the
-stack, for holding the values of the subject pointer at the start of each
-subpattern, so as to detect when an empty string has been matched by a
-subpattern - to break infinite loops. */
-
-typedef struct eptrblock {
-  struct eptrblock *prev;
-  const uschar *saved_eptr;
-} eptrblock;
-
-/* Flag bits for the match() function */
-
-#define match_condassert   0x01    /* Called to check a condition assertion */
-#define match_isgroup      0x02    /* Set if start of bracketed group */
-
-
-
-/*************************************************
-*               Global variables                 *
-*************************************************/
-
-/* PCRE is thread-clean and doesn't use any global variables in the normal
-sense. However, it calls memory allocation and free functions via the two
-indirections below, which are can be changed by the caller, but are shared
-between all threads. */
-
-void *(*pcre_malloc)(size_t) = malloc;
-void  (*pcre_free)(void *) = free;
-
-
-
-/*************************************************
-*    Macros and tables for character handling    *
-*************************************************/
-
-/* When UTF-8 encoding is being used, a character is no longer just a single
-byte. The macros for character handling generate simple sequences when used in
-byte-mode, and more complicated ones for UTF-8 characters. */
-
-#ifndef SUPPORT_UTF8
-#define GETCHARINC(c, eptr) c = *eptr++;
-#define GETCHARLEN(c, eptr, len) c = *eptr;
-#define BACKCHAR(eptr)
-
-#else   /* SUPPORT_UTF8 */
-
-/* Get the next UTF-8 character, advancing the pointer */
-
-#define GETCHARINC(c, eptr) \
-  c = *eptr++; \
-  if (md->utf8 && (c & 0xc0) == 0xc0) \
-    { \
-    int a = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int s = 6 - a;                  /* Amount to shift next byte */  \
-    c &= utf8_table3[a];            /* Low order bits from first byte */ \
-    while (a-- > 0) \
-      { \
-      c |= (*eptr++ & 0x3f) << s; \
-      s += 6; \
-      } \
-    }
-
-/* Get the next UTF-8 character, not advancing the pointer, setting length */
-
-#define GETCHARLEN(c, eptr, len) \
-  c = *eptr; \
-  len = 1; \
-  if (md->utf8 && (c & 0xc0) == 0xc0) \
-    { \
-    int i; \
-    int a = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int s = 6 - a;                  /* Amount to shift next byte */  \
-    c &= utf8_table3[a];            /* Low order bits from first byte */ \
-    for (i = 1; i <= a; i++) \
-      { \
-      c |= (eptr[i] & 0x3f) << s; \
-      s += 6; \
-      } \
-    len += a; \
-    }
-
-/* If the pointer is not at the start of a character, move it back until
-it is. */
-
-#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
-
-#endif
-
-
-
-/*************************************************
-*             Default character tables           *
-*************************************************/
-
-/* A default set of character tables is included in the PCRE binary. Its source
-is built by the maketables auxiliary program, which uses the default C ctypes
-functions, and put in the file chartables.c. These tables are used by PCRE
-whenever the caller of pcre_compile() does not provide an alternate set of
-tables. */
-
-#include "chartables.c"
-
-
-
-#ifdef SUPPORT_UTF8
-/*************************************************
-*           Tables for UTF-8 support             *
-*************************************************/
-
-/* These are the breakpoints for different numbers of bytes in a UTF-8
-character. */
-
-static int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
-
-/* These are the indicator bits and the mask for the data bits to set in the
-first byte of a character, indexed by the number of additional bytes. */
-
-static int utf8_table2[] = { 0,    0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-static int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-/* Table of the number of extra characters, indexed by the first character
-masked with 0x3f. The highest number for a valid UTF-8 character is in fact
-0x3d. */
-
-static uschar utf8_table4[] = {
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
-
-
-/*************************************************
-*       Convert character value to UTF-8         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 6 bytes long
-
-Returns:     number of characters placed in the buffer
-*/
-
-static int
-ord2utf8(int cvalue, uschar *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-  if (cvalue <= utf8_table1[i]) break;
-*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]);
-cvalue >>= 6 - i;
-for (j = 0; j < i; j++)
-  {
-  *buffer++ = 0x80 | (cvalue & 0x3f);
-  cvalue >>= 6;
-  }
-return i + 1;
-}
-#endif
-
-
-
-/*************************************************
-*          Return version string                 *
-*************************************************/
-
-#define STRING(a)  # a
-#define XSTRING(s) STRING(s)
-
-const char *
-pcre_version(void)
-{
-return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
-}
-
-
-
-
-/*************************************************
-* (Obsolete) Return info about compiled pattern  *
-*************************************************/
-
-/* This is the original "info" function. It picks potentially useful data out
-of the private structure, but its interface was too rigid. It remains for
-backwards compatibility. The public options are passed back in an int - though
-the re->options field has been expanded to a long int, all the public options
-at the low end of it, and so even on 16-bit systems this will still be OK.
-Therefore, I haven't changed the API for pcre_info().
-
-Arguments:
-  external_re   points to compiled code
-  optptr        where to pass back the options
-  first_char    where to pass back the first character,
-                or -1 if multiline and all branches start ^,
-                or -2 otherwise
-
-Returns:        number of capturing subpatterns
-                or negative values on error
-*/
-
-int
-pcre_info(const pcre *external_re, int *optptr, int *first_char)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-if (re == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
-if (first_char != NULL)
-  *first_char = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char :
-     ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
-return re->top_bracket;
-}
-
-
-
-/*************************************************
-*        Return info about compiled pattern      *
-*************************************************/
-
-/* This is a newer "info" function which has an extensible interface so
-that additional items can be added compatibly.
-
-Arguments:
-  external_re      points to compiled code
-  external_study   points to study data, or NULL
-  what             what information is required
-  where            where to put the information
-
-Returns:           0 if data returned, negative on error
-*/
-
-int
-pcre_fullinfo(const pcre *external_re, const pcre_extra *study_data, int what,
-  void *where)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-const real_pcre_extra *study = (const real_pcre_extra *)study_data;
-
-if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-switch (what)
-  {
-  case PCRE_INFO_OPTIONS:
-  *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
-  break;
-
-  case PCRE_INFO_SIZE:
-  *((size_t *)where) = re->size;
-  break;
-
-  case PCRE_INFO_CAPTURECOUNT:
-  *((int *)where) = re->top_bracket;
-  break;
-
-  case PCRE_INFO_BACKREFMAX:
-  *((int *)where) = re->top_backref;
-  break;
-
-  case PCRE_INFO_FIRSTCHAR:
-  *((int *)where) =
-    ((re->options & PCRE_FIRSTSET) != 0)? re->first_char :
-    ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
-  break;
-
-  case PCRE_INFO_FIRSTTABLE:
-  *((const uschar **)where) =
-    (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
-      study->start_bits : NULL;
-  break;
-
-  case PCRE_INFO_LASTLITERAL:
-  *((int *)where) =
-    ((re->options & PCRE_REQCHSET) != 0)? re->req_char : -1;
-  break;
-
-  default: return PCRE_ERROR_BADOPTION;
-  }
-
-return 0;
-}
-
-
-
-#ifdef DEBUG
-/*************************************************
-*        Debugging function to print chars       *
-*************************************************/
-
-/* Print a sequence of chars in printable format, stopping at the end of the
-subject if the requested.
-
-Arguments:
-  p           points to characters
-  length      number to print
-  is_subject  TRUE if printing from within md->start_subject
-  md          pointer to matching data block, if is_subject is TRUE
-
-Returns:     nothing
-*/
-
-static void
-pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
-{
-int c;
-if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
-while (length-- > 0)
-  if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
-}
-#endif
-
-
-
-
-/*************************************************
-*            Handle escapes                      *
-*************************************************/
-
-/* This function is called when a \ has been encountered. It either returns a
-positive value for a simple escape such as \n, or a negative value which
-encodes one of the more complicated things such as \d. When UTF-8 is enabled,
-a positive value greater than 255 may be returned. On entry, ptr is pointing at
-the \. On exit, it is on the final character of the escape sequence.
-
-Arguments:
-  ptrptr     points to the pattern position pointer
-  errorptr   points to the pointer to the error message
-  bracount   number of previous extracting brackets
-  options    the options bits
-  isclass    TRUE if inside a character class
-  cd         pointer to char tables block
-
-Returns:     zero or positive => a data character
-             negative => a special escape sequence
-             on error, errorptr is set
-*/
-
-static int
-check_escape(const uschar **ptrptr, const char **errorptr, int bracount,
-  int options, BOOL isclass, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-int c, i;
-
-/* If backslash is at the end of the pattern, it's an error. */
-
-c = *(++ptr);
-if (c == 0) *errorptr = ERR1;
-
-/* Digits or letters may have special meaning; all others are literals. */
-
-else if (c < '0' || c > 'z') {}
-
-/* Do an initial lookup in a table. A non-zero result is something that can be
-returned immediately. Otherwise further processing may be required. */
-
-else if ((i = escapes[c - '0']) != 0) c = i;
-
-/* Escapes that need further processing, or are illegal. */
-
-else
-  {
-  const uschar *oldptr;
-  switch (c)
-    {
-    /* The handling of escape sequences consisting of a string of digits
-    starting with one that is not zero is not straightforward. By experiment,
-    the way Perl works seems to be as follows:
-
-    Outside a character class, the digits are read as a decimal number. If the
-    number is less than 10, or if there are that many previous extracting
-    left brackets, then it is a back reference. Otherwise, up to three octal
-    digits are read to form an escaped byte. Thus \123 is likely to be octal
-    123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
-    value is greater than 377, the least significant 8 bits are taken. Inside a
-    character class, \ followed by a digit is always an octal number. */
-
-    case '1': case '2': case '3': case '4': case '5':
-    case '6': case '7': case '8': case '9':
-
-    if (!isclass)
-      {
-      oldptr = ptr;
-      c -= '0';
-      while ((cd->ctypes[ptr[1]] & ctype_digit) != 0)
-        c = c * 10 + *(++ptr) - '0';
-      if (c < 10 || c <= bracount)
-        {
-        c = -(ESC_REF + c);
-        break;
-        }
-      ptr = oldptr;      /* Put the pointer back and fall through */
-      }
-
-    /* Handle an octal number following \. If the first digit is 8 or 9, Perl
-    generates a binary zero byte and treats the digit as a following literal.
-    Thus we have to pull back the pointer by one. */
-
-    if ((c = *ptr) >= '8')
-      {
-      ptr--;
-      c = 0;
-      break;
-      }
-
-    /* \0 always starts an octal number, but we may drop through to here with a
-    larger first octal digit. */
-
-    case '0':
-    c -= '0';
-    while(i++ < 2 && (cd->ctypes[ptr[1]] & ctype_digit) != 0 &&
-      ptr[1] != '8' && ptr[1] != '9')
-        c = c * 8 + *(++ptr) - '0';
-    c &= 255;     /* Take least significant 8 bits */
-    break;
-
-    /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number
-    which can be greater than 0xff, but only if the ddd are hex digits. */
-
-    case 'x':
-#ifdef SUPPORT_UTF8
-    if (ptr[1] == '{' && (options & PCRE_UTF8) != 0)
-      {
-      const uschar *pt = ptr + 2;
-      register int count = 0;
-      c = 0;
-      while ((cd->ctypes[*pt] & ctype_xdigit) != 0)
-        {
-        count++;
-        c = c * 16 + cd->lcc[*pt] -
-          (((cd->ctypes[*pt] & ctype_digit) != 0)? '0' : 'W');
-        pt++;
-        }
-      if (*pt == '}')
-        {
-        if (c < 0 || count > 8) *errorptr = ERR34;
-        ptr = pt;
-        break;
-        }
-      /* If the sequence of hex digits does not end with '}', then we don't
-      recognize this construct; fall through to the normal \x handling. */
-      }
-#endif
-
-    /* Read just a single hex char */
-
-    c = 0;
-    while (i++ < 2 && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0)
-      {
-      ptr++;
-      c = c * 16 + cd->lcc[*ptr] -
-        (((cd->ctypes[*ptr] & ctype_digit) != 0)? '0' : 'W');
-      }
-    break;
-
-    /* Other special escapes not starting with a digit are straightforward */
-
-    case 'c':
-    c = *(++ptr);
-    if (c == 0)
-      {
-      *errorptr = ERR2;
-      return 0;
-      }
-
-    /* A letter is upper-cased; then the 0x40 bit is flipped */
-
-    if (c >= 'a' && c <= 'z') c = cd->fcc[c];
-    c ^= 0x40;
-    break;
-
-    /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
-    other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
-    for Perl compatibility, it is a literal. This code looks a bit odd, but
-    there used to be some cases other than the default, and there may be again
-    in future, so I haven't "optimized" it. */
-
-    default:
-    if ((options & PCRE_EXTRA) != 0) switch(c)
-      {
-      default:
-      *errorptr = ERR3;
-      break;
-      }
-    break;
-    }
-  }
-
-*ptrptr = ptr;
-return c;
-}
-
-
-
-/*************************************************
-*            Check for counted repeat            *
-*************************************************/
-
-/* This function is called when a '{' is encountered in a place where it might
-start a quantifier. It looks ahead to see if it really is a quantifier or not.
-It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
-where the ddds are digits.
-
-Arguments:
-  p         pointer to the first char after '{'
-  cd        pointer to char tables block
-
-Returns:    TRUE or FALSE
-*/
-
-static BOOL
-is_counted_repeat(const uschar *p, compile_data *cd)
-{
-if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE;
-while ((cd->ctypes[*p] & ctype_digit) != 0) p++;
-if (*p == '}') return TRUE;
-
-if (*p++ != ',') return FALSE;
-if (*p == '}') return TRUE;
-
-if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE;
-while ((cd->ctypes[*p] & ctype_digit) != 0) p++;
-return (*p == '}');
-}
-
-
-
-/*************************************************
-*         Read repeat counts                     *
-*************************************************/
-
-/* Read an item of the form {n,m} and return the values. This is called only
-after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
-so the syntax is guaranteed to be correct, but we need to check the values.
-
-Arguments:
-  p          pointer to first char after '{'
-  minp       pointer to int for min
-  maxp       pointer to int for max
-             returned as -1 if no max
-  errorptr   points to pointer to error message
-  cd         pointer to character tables clock
-
-Returns:     pointer to '}' on success;
-             current ptr on error, with errorptr set
-*/
-
-static const uschar *
-read_repeat_counts(const uschar *p, int *minp, int *maxp,
-  const char **errorptr, compile_data *cd)
-{
-int min = 0;
-int max = -1;
-
-while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
-
-if (*p == '}') max = min; else
-  {
-  if (*(++p) != '}')
-    {
-    max = 0;
-    while((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
-    if (max < min)
-      {
-      *errorptr = ERR4;
-      return p;
-      }
-    }
-  }
-
-/* Do paranoid checks, then fill in the required variables, and pass back the
-pointer to the terminating '}'. */
-
-if (min > 65535 || max > 65535)
-  *errorptr = ERR5;
-else
-  {
-  *minp = min;
-  *maxp = max;
-  }
-return p;
-}
-
-
-
-/*************************************************
-*        Find the fixed length of a pattern      *
-*************************************************/
-
-/* Scan a pattern and compute the fixed length of subject that will match it,
-if the length is fixed. This is needed for dealing with backward assertions.
-
-Arguments:
-  code     points to the start of the pattern (the bracket)
-  options  the compiling options
-
-Returns:   the fixed length, or -1 if there is no fixed length
-*/
-
-static int
-find_fixedlength(uschar *code, int options)
-{
-int length = -1;
-
-register int branchlength = 0;
-register uschar *cc = code + 3;
-
-/* Scan along the opcodes for this branch. If we get to the end of the
-branch, check the length against that of the other branches. */
-
-for (;;)
-  {
-  int d;
-  register int op = *cc;
-  if (op >= OP_BRA) op = OP_BRA;
-
-  switch (op)
-    {
-    case OP_BRA:
-    case OP_ONCE:
-    case OP_COND:
-    d = find_fixedlength(cc, options);
-    if (d < 0) return -1;
-    branchlength += d;
-    do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT);
-    cc += 3;
-    break;
-
-    /* Reached end of a branch; if it's a ket it is the end of a nested
-    call. If it's ALT it is an alternation in a nested call. If it is
-    END it's the end of the outer call. All can be handled by the same code. */
-
-    case OP_ALT:
-    case OP_KET:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_END:
-    if (length < 0) length = branchlength;
-      else if (length != branchlength) return -1;
-    if (*cc != OP_ALT) return length;
-    cc += 3;
-    branchlength = 0;
-    break;
-
-    /* Skip over assertive subpatterns */
-
-    case OP_ASSERT:
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT);
-    cc += 3;
-    break;
-
-    /* Skip over things that don't match chars */
-
-    case OP_REVERSE:
-    cc++;
-    /* Fall through */
-
-    case OP_CREF:
-    case OP_OPT:
-    cc++;
-    /* Fall through */
-
-    case OP_SOD:
-    case OP_EOD:
-    case OP_EODN:
-    case OP_CIRC:
-    case OP_DOLL:
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_WORD_BOUNDARY:
-    cc++;
-    break;
-
-    /* Handle char strings. In UTF-8 mode we must count characters, not bytes.
-    This requires a scan of the string, unfortunately. We assume valid UTF-8
-    strings, so all we do is reduce the length by one for byte whose bits are
-    10xxxxxx. */
-
-    case OP_CHARS:
-    branchlength += *(++cc);
-#ifdef SUPPORT_UTF8
-    for (d = 1; d <= *cc; d++)
-      if ((cc[d] & 0xc0) == 0x80) branchlength--;
-#endif
-    cc += *cc + 1;
-    break;
-
-    /* Handle exact repetitions */
-
-    case OP_EXACT:
-    case OP_TYPEEXACT:
-    branchlength += (cc[1] << 8) + cc[2];
-    cc += 4;
-    break;
-
-    /* Handle single-char matchers */
-
-    case OP_NOT_DIGIT:
-    case OP_DIGIT:
-    case OP_NOT_WHITESPACE:
-    case OP_WHITESPACE:
-    case OP_NOT_WORDCHAR:
-    case OP_WORDCHAR:
-    case OP_ANY:
-    branchlength++;
-    cc++;
-    break;
-
-
-    /* Check a class for variable quantification */
-
-    case OP_CLASS:
-    cc += (*cc == OP_REF)? 2 : 33;
-
-    switch (*cc)
-      {
-      case OP_CRSTAR:
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      return -1;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1;
-      branchlength += (cc[1] << 8) + cc[2];
-      cc += 5;
-      break;
-
-      default:
-      branchlength++;
-      }
-    break;
-
-    /* Anything else is variable length */
-
-    default:
-    return -1;
-    }
-  }
-/* Control never gets here */
-}
-
-
-
-
-/*************************************************
-*           Check for POSIX class syntax         *
-*************************************************/
-
-/* This function is called when the sequence "[:" or "[." or "[=" is
-encountered in a character class. It checks whether this is followed by an
-optional ^ and then a sequence of letters, terminated by a matching ":]" or
-".]" or "=]".
-
-Argument:
-  ptr      pointer to the initial [
-  endptr   where to return the end pointer
-  cd       pointer to compile data
-
-Returns:   TRUE or FALSE
-*/
-
-static BOOL
-check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
-{
-int terminator;          /* Don't combine these lines; the Solaris cc */
-terminator = *(++ptr);   /* compiler warns about "non-constant" initializer. */
-if (*(++ptr) == '^') ptr++;
-while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
-if (*ptr == terminator && ptr[1] == ']')
-  {
-  *endptr = ptr;
-  return TRUE;
-  }
-return FALSE;
-}
-
-
-
-
-/*************************************************
-*          Check POSIX class name                *
-*************************************************/
-
-/* This function is called to check the name given in a POSIX-style class entry
-such as [:alnum:].
-
-Arguments:
-  ptr        points to the first letter
-  len        the length of the name
-
-Returns:     a value representing the name, or -1 if unknown
-*/
-
-static int
-check_posix_name(const uschar *ptr, int len)
-{
-register int yield = 0;
-while (posix_name_lengths[yield] != 0)
-  {
-  if (len == posix_name_lengths[yield] &&
-    strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
-  yield++;
-  }
-return -1;
-}
-
-
-
-
-/*************************************************
-*           Compile one branch                   *
-*************************************************/
-
-/* Scan the pattern, compiling it into the code vector.
-
-Arguments:
-  options      the option bits
-  brackets     points to number of brackets used
-  code         points to the pointer to the current code point
-  ptrptr       points to the current pattern pointer
-  errorptr     points to pointer to error message
-  optchanged   set to the value of the last OP_OPT item compiled
-  reqchar      set to the last literal character required, else -1
-  countlits    set to count of mandatory literal characters
-  cd           contains pointers to tables
-
-Returns:       TRUE on success
-               FALSE, with *errorptr set on error
-*/
-
-static BOOL
-compile_branch(int options, int *brackets, uschar **codeptr,
-  const uschar **ptrptr, const char **errorptr, int *optchanged,
-  int *reqchar, int *countlits, compile_data *cd)
-{
-int repeat_type, op_type;
-int repeat_min, repeat_max;
-int bravalue, length;
-int greedy_default, greedy_non_default;
-int prevreqchar;
-int condcount = 0;
-int subcountlits = 0;
-register int c;
-register uschar *code = *codeptr;
-uschar *tempcode;
-const uschar *ptr = *ptrptr;
-const uschar *tempptr;
-uschar *previous = NULL;
-uschar class[32];
-
-/* Set up the default and non-default settings for greediness */
-
-greedy_default = ((options & PCRE_UNGREEDY) != 0);
-greedy_non_default = greedy_default ^ 1;
-
-/* Initialize no required char, and count of literals */
-
-*reqchar = prevreqchar = -1;
-*countlits = 0;
-
-/* Switch on next character until the end of the branch */
-
-for (;; ptr++)
-  {
-  BOOL negate_class;
-  int class_charcount;
-  int class_lastchar;
-  int newoptions;
-  int condref;
-  int subreqchar;
-
-  c = *ptr;
-  if ((options & PCRE_EXTENDED) != 0)
-    {
-    if ((cd->ctypes[c] & ctype_space) != 0) continue;
-    if (c == '#')
-      {
-      /* The space before the ; is to avoid a warning on a silly compiler
-      on the Macintosh. */
-      while ((c = *(++ptr)) != 0 && c != '\n') ;
-      continue;
-      }
-    }
-
-  switch(c)
-    {
-    /* The branch terminates at end of string, |, or ). */
-
-    case 0:
-    case '|':
-    case ')':
-    *codeptr = code;
-    *ptrptr = ptr;
-    return TRUE;
-
-    /* Handle single-character metacharacters */
-
-    case '^':
-    previous = NULL;
-    *code++ = OP_CIRC;
-    break;
-
-    case '$':
-    previous = NULL;
-    *code++ = OP_DOLL;
-    break;
-
-    case '.':
-    previous = code;
-    *code++ = OP_ANY;
-    break;
-
-    /* Character classes. These always build a 32-byte bitmap of the permitted
-    characters, except in the special case where there is only one character.
-    For negated classes, we build the map as usual, then invert it at the end.
-    */
-
-    case '[':
-    previous = code;
-    *code++ = OP_CLASS;
-
-    /* If the first character is '^', set the negation flag and skip it. */
-
-    if ((c = *(++ptr)) == '^')
-      {
-      negate_class = TRUE;
-      c = *(++ptr);
-      }
-    else negate_class = FALSE;
-
-    /* Keep a count of chars so that we can optimize the case of just a single
-    character. */
-
-    class_charcount = 0;
-    class_lastchar = -1;
-
-    /* Initialize the 32-char bit map to all zeros. We have to build the
-    map in a temporary bit of store, in case the class contains only 1
-    character, because in that case the compiled code doesn't use the
-    bit map. */
-
-    memset(class, 0, 32 * sizeof(uschar));
-
-    /* Process characters until ] is reached. By writing this as a "do" it
-    means that an initial ] is taken as a data character. */
-
-    do
-      {
-      if (c == 0)
-        {
-        *errorptr = ERR6;
-        goto FAILED;
-        }
-
-      /* Handle POSIX class names. Perl allows a negation extension of the
-      form [:^name]. A square bracket that doesn't match the syntax is
-      treated as a literal. We also recognize the POSIX constructions
-      [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
-      5.6 does. */
-
-      if (c == '[' &&
-          (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
-          check_posix_syntax(ptr, &tempptr, cd))
-        {
-        BOOL local_negate = FALSE;
-        int posix_class, i;
-        register const uschar *cbits = cd->cbits;
-
-        if (ptr[1] != ':')
-          {
-          *errorptr = ERR31;
-          goto FAILED;
-          }
-
-        ptr += 2;
-        if (*ptr == '^')
-          {
-          local_negate = TRUE;
-          ptr++;
-          }
-
-        posix_class = check_posix_name(ptr, tempptr - ptr);
-        if (posix_class < 0)
-          {
-          *errorptr = ERR30;
-          goto FAILED;
-          }
-
-        /* If matching is caseless, upper and lower are converted to
-        alpha. This relies on the fact that the class table starts with
-        alpha, lower, upper as the first 3 entries. */
-
-        if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
-          posix_class = 0;
-
-        /* Or into the map we are building up to 3 of the static class
-        tables, or their negations. */
-
-        posix_class *= 3;
-        for (i = 0; i < 3; i++)
-          {
-          int taboffset = posix_class_maps[posix_class + i];
-          if (taboffset < 0) break;
-          if (local_negate)
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset];
-          else
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset];
-          }
-
-        ptr = tempptr + 1;
-        class_charcount = 10;  /* Set > 1; assumes more than 1 per class */
-        continue;
-        }
-
-      /* Backslash may introduce a single character, or it may introduce one
-      of the specials, which just set a flag. Escaped items are checked for
-      validity in the pre-compiling pass. The sequence \b is a special case.
-      Inside a class (and only there) it is treated as backspace. Elsewhere
-      it marks a word boundary. Other escapes have preset maps ready to
-      or into the one we are building. We assume they have more than one
-      character in them, so set class_count bigger than one. */
-
-      if (c == '\\')
-        {
-        c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
-        if (-c == ESC_b) c = '\b';
-        else if (c < 0)
-          {
-          register const uschar *cbits = cd->cbits;
-          class_charcount = 10;
-          switch (-c)
-            {
-            case ESC_d:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit];
-            continue;
-
-            case ESC_D:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit];
-            continue;
-
-            case ESC_w:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word];
-            continue;
-
-            case ESC_W:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word];
-            continue;
-
-            case ESC_s:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space];
-            continue;
-
-            case ESC_S:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space];
-            continue;
-
-            default:
-            *errorptr = ERR7;
-            goto FAILED;
-            }
-          }
-
-        /* Fall through if single character, but don't at present allow
-        chars > 255 in UTF-8 mode. */
-
-#ifdef SUPPORT_UTF8
-        if (c > 255)
-          {
-          *errorptr = ERR33;
-          goto FAILED;
-          }
-#endif
-        }
-
-      /* A single character may be followed by '-' to form a range. However,
-      Perl does not permit ']' to be the end of the range. A '-' character
-      here is treated as a literal. */
-
-      if (ptr[1] == '-' && ptr[2] != ']')
-        {
-        int d;
-        ptr += 2;
-        d = *ptr;
-
-        if (d == 0)
-          {
-          *errorptr = ERR6;
-          goto FAILED;
-          }
-
-        /* The second part of a range can be a single-character escape, but
-        not any of the other escapes. Perl 5.6 treats a hyphen as a literal
-        in such circumstances. */
-
-        if (d == '\\')
-          {
-          const uschar *oldptr = ptr;
-          d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
-
-#ifdef SUPPORT_UTF8
-          if (d > 255)
-            {
-            *errorptr = ERR33;
-            goto FAILED;
-            }
-#endif
-          /* \b is backslash; any other special means the '-' was literal */
-
-          if (d < 0)
-            {
-            if (d == -ESC_b) d = '\b'; else
-              {
-              ptr = oldptr - 2;
-              goto SINGLE_CHARACTER;  /* A few lines below */
-              }
-            }
-          }
-
-        if (d < c)
-          {
-          *errorptr = ERR8;
-          goto FAILED;
-          }
-
-        for (; c <= d; c++)
-          {
-          class[c/8] |= (1 << (c&7));
-          if ((options & PCRE_CASELESS) != 0)
-            {
-            int uc = cd->fcc[c];           /* flip case */
-            class[uc/8] |= (1 << (uc&7));
-            }
-          class_charcount++;                /* in case a one-char range */
-          class_lastchar = c;
-          }
-        continue;   /* Go get the next char in the class */
-        }
-
-      /* Handle a lone single character - we can get here for a normal
-      non-escape char, or after \ that introduces a single character. */
-
-      SINGLE_CHARACTER:
-
-      class [c/8] |= (1 << (c&7));
-      if ((options & PCRE_CASELESS) != 0)
-        {
-        c = cd->fcc[c];   /* flip case */
-        class[c/8] |= (1 << (c&7));
-        }
-      class_charcount++;
-      class_lastchar = c;
-      }
-
-    /* Loop until ']' reached; the check for end of string happens inside the
-    loop. This "while" is the end of the "do" above. */
-
-    while ((c = *(++ptr)) != ']');
-
-    /* If class_charcount is 1 and class_lastchar is not negative, we saw
-    precisely one character. This doesn't need the whole 32-byte bit map.
-    We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if
-    it's negative. */
-
-    if (class_charcount == 1 && class_lastchar >= 0)
-      {
-      if (negate_class)
-        {
-        code[-1] = OP_NOT;
-        }
-      else
-        {
-        code[-1] = OP_CHARS;
-        *code++ = 1;
-        }
-      *code++ = class_lastchar;
-      }
-
-    /* Otherwise, negate the 32-byte map if necessary, and copy it into
-    the code vector. */
-
-    else
-      {
-      if (negate_class)
-        for (c = 0; c < 32; c++) code[c] = ~class[c];
-      else
-        memcpy(code, class, 32);
-      code += 32;
-      }
-    break;
-
-    /* Various kinds of repeat */
-
-    case '{':
-    if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR;
-    ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd);
-    if (*errorptr != NULL) goto FAILED;
-    goto REPEAT;
-
-    case '*':
-    repeat_min = 0;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case '+':
-    repeat_min = 1;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case '?':
-    repeat_min = 0;
-    repeat_max = 1;
-
-    REPEAT:
-    if (previous == NULL)
-      {
-      *errorptr = ERR9;
-      goto FAILED;
-      }
-
-    /* If the next character is '?' this is a minimizing repeat, by default,
-    but if PCRE_UNGREEDY is set, it works the other way round. Advance to the
-    next character. */
-
-    if (ptr[1] == '?')
-      { repeat_type = greedy_non_default; ptr++; }
-    else repeat_type = greedy_default;
-
-    /* If previous was a string of characters, chop off the last one and use it
-    as the subject of the repeat. If there was only one character, we can
-    abolish the previous item altogether. A repeat with a zero minimum wipes
-    out any reqchar setting, backing up to the previous value. We must also
-    adjust the countlits value. */
-
-    if (*previous == OP_CHARS)
-      {
-      int len = previous[1];
-
-      if (repeat_min == 0) *reqchar = prevreqchar;
-      *countlits += repeat_min - 1;
-
-      if (len == 1)
-        {
-        c = previous[2];
-        code = previous;
-        }
-      else
-        {
-        c = previous[len+1];
-        previous[1]--;
-        code--;
-        }
-      op_type = 0;                 /* Use single-char op codes */
-      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */
-      }
-
-    /* If previous was a single negated character ([^a] or similar), we use
-    one of the special opcodes, replacing it. The code is shared with single-
-    character repeats by adding a suitable offset into repeat_type. */
-
-    else if ((int)*previous == OP_NOT)
-      {
-      op_type = OP_NOTSTAR - OP_STAR;  /* Use "not" opcodes */
-      c = previous[1];
-      code = previous;
-      goto OUTPUT_SINGLE_REPEAT;
-      }
-
-    /* If previous was a character type match (\d or similar), abolish it and
-    create a suitable repeat item. The code is shared with single-character
-    repeats by adding a suitable offset into repeat_type. */
-
-    else if ((int)*previous < OP_EODN || *previous == OP_ANY)
-      {
-      op_type = OP_TYPESTAR - OP_STAR;  /* Use type opcodes */
-      c = *previous;
-      code = previous;
-
-      OUTPUT_SINGLE_REPEAT:
-
-      /* If the maximum is zero then the minimum must also be zero; Perl allows
-      this case, so we do too - by simply omitting the item altogether. */
-
-      if (repeat_max == 0) goto END_REPEAT;
-
-      /* Combine the op_type with the repeat_type */
-
-      repeat_type += op_type;
-
-      /* A minimum of zero is handled either as the special case * or ?, or as
-      an UPTO, with the maximum given. */
-
-      if (repeat_min == 0)
-        {
-        if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
-          else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
-        else
-          {
-          *code++ = OP_UPTO + repeat_type;
-          *code++ = repeat_max >> 8;
-          *code++ = (repeat_max & 255);
-          }
-        }
-
-      /* The case {1,} is handled as the special case + */
-
-      else if (repeat_min == 1 && repeat_max == -1)
-        *code++ = OP_PLUS + repeat_type;
-
-      /* The case {n,n} is just an EXACT, while the general case {n,m} is
-      handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */
-
-      else
-        {
-        if (repeat_min != 1)
-          {
-          *code++ = OP_EXACT + op_type;  /* NB EXACT doesn't have repeat_type */
-          *code++ = repeat_min >> 8;
-          *code++ = (repeat_min & 255);
-          }
-
-        /* If the mininum is 1 and the previous item was a character string,
-        we either have to put back the item that got cancelled if the string
-        length was 1, or add the character back onto the end of a longer
-        string. For a character type nothing need be done; it will just get
-        put back naturally. Note that the final character is always going to
-        get added below. */
-
-        else if (*previous == OP_CHARS)
-          {
-          if (code == previous) code += 2; else previous[1]++;
-          }
-
-        /*  For a single negated character we also have to put back the
-        item that got cancelled. */
-
-        else if (*previous == OP_NOT) code++;
-
-        /* If the maximum is unlimited, insert an OP_STAR. */
-
-        if (repeat_max < 0)
-          {
-          *code++ = c;
-          *code++ = OP_STAR + repeat_type;
-          }
-
-        /* Else insert an UPTO if the max is greater than the min. */
-
-        else if (repeat_max != repeat_min)
-          {
-          *code++ = c;
-          repeat_max -= repeat_min;
-          *code++ = OP_UPTO + repeat_type;
-          *code++ = repeat_max >> 8;
-          *code++ = (repeat_max & 255);
-          }
-        }
-
-      /* The character or character type itself comes last in all cases. */
-
-      *code++ = c;
-      }
-
-    /* If previous was a character class or a back reference, we put the repeat
-    stuff after it, but just skip the item if the repeat was {0,0}. */
-
-    else if (*previous == OP_CLASS || *previous == OP_REF)
-      {
-      if (repeat_max == 0)
-        {
-        code = previous;
-        goto END_REPEAT;
-        }
-      if (repeat_min == 0 && repeat_max == -1)
-        *code++ = OP_CRSTAR + repeat_type;
-      else if (repeat_min == 1 && repeat_max == -1)
-        *code++ = OP_CRPLUS + repeat_type;
-      else if (repeat_min == 0 && repeat_max == 1)
-        *code++ = OP_CRQUERY + repeat_type;
-      else
-        {
-        *code++ = OP_CRRANGE + repeat_type;
-        *code++ = repeat_min >> 8;
-        *code++ = repeat_min & 255;
-        if (repeat_max == -1) repeat_max = 0;  /* 2-byte encoding for max */
-        *code++ = repeat_max >> 8;
-        *code++ = repeat_max & 255;
-        }
-      }
-
-    /* If previous was a bracket group, we may have to replicate it in certain
-    cases. */
-
-    else if ((int)*previous >= OP_BRA || (int)*previous == OP_ONCE ||
-             (int)*previous == OP_COND)
-      {
-      register int i;
-      int ketoffset = 0;
-      int len = code - previous;
-      uschar *bralink = NULL;
-
-      /* If the maximum repeat count is unlimited, find the end of the bracket
-      by scanning through from the start, and compute the offset back to it
-      from the current code pointer. There may be an OP_OPT setting following
-      the final KET, so we can't find the end just by going back from the code
-      pointer. */
-
-      if (repeat_max == -1)
-        {
-        register uschar *ket = previous;
-        do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET);
-        ketoffset = code - ket;
-        }
-
-      /* The case of a zero minimum is special because of the need to stick
-      OP_BRAZERO in front of it, and because the group appears once in the
-      data, whereas in other cases it appears the minimum number of times. For
-      this reason, it is simplest to treat this case separately, as otherwise
-      the code gets far too mess. There are several special subcases when the
-      minimum is zero. */
-
-      if (repeat_min == 0)
-        {
-        /* If we set up a required char from the bracket, we must back off
-        to the previous value and reset the countlits value too. */
-
-        if (subcountlits > 0)
-          {
-          *reqchar = prevreqchar;
-          *countlits -= subcountlits;
-          }
-
-        /* If the maximum is also zero, we just omit the group from the output
-        altogether. */
-
-        if (repeat_max == 0)
-          {
-          code = previous;
-          goto END_REPEAT;
-          }
-
-        /* If the maximum is 1 or unlimited, we just have to stick in the
-        BRAZERO and do no more at this point. */
-
-        if (repeat_max <= 1)
-          {
-          memmove(previous+1, previous, len);
-          code++;
-          *previous++ = OP_BRAZERO + repeat_type;
-          }
-
-        /* If the maximum is greater than 1 and limited, we have to replicate
-        in a nested fashion, sticking OP_BRAZERO before each set of brackets.
-        The first one has to be handled carefully because it's the original
-        copy, which has to be moved up. The remainder can be handled by code
-        that is common with the non-zero minimum case below. We just have to
-        adjust the value or repeat_max, since one less copy is required. */
-
-        else
-          {
-          int offset;
-          memmove(previous+4, previous, len);
-          code += 4;
-          *previous++ = OP_BRAZERO + repeat_type;
-          *previous++ = OP_BRA;
-
-          /* We chain together the bracket offset fields that have to be
-          filled in later when the ends of the brackets are reached. */
-
-          offset = (bralink == NULL)? 0 : previous - bralink;
-          bralink = previous;
-          *previous++ = offset >> 8;
-          *previous++ = offset & 255;
-          }
-
-        repeat_max--;
-        }
-
-      /* If the minimum is greater than zero, replicate the group as many
-      times as necessary, and adjust the maximum to the number of subsequent
-      copies that we need. */
-
-      else
-        {
-        for (i = 1; i < repeat_min; i++)
-          {
-          memcpy(code, previous, len);
-          code += len;
-          }
-        if (repeat_max > 0) repeat_max -= repeat_min;
-        }
-
-      /* This code is common to both the zero and non-zero minimum cases. If
-      the maximum is limited, it replicates the group in a nested fashion,
-      remembering the bracket starts on a stack. In the case of a zero minimum,
-      the first one was set up above. In all cases the repeat_max now specifies
-      the number of additional copies needed. */
-
-      if (repeat_max >= 0)
-        {
-        for (i = repeat_max - 1; i >= 0; i--)
-          {
-          *code++ = OP_BRAZERO + repeat_type;
-
-          /* All but the final copy start a new nesting, maintaining the
-          chain of brackets outstanding. */
-
-          if (i != 0)
-            {
-            int offset;
-            *code++ = OP_BRA;
-            offset = (bralink == NULL)? 0 : code - bralink;
-            bralink = code;
-            *code++ = offset >> 8;
-            *code++ = offset & 255;
-            }
-
-          memcpy(code, previous, len);
-          code += len;
-          }
-
-        /* Now chain through the pending brackets, and fill in their length
-        fields (which are holding the chain links pro tem). */
-
-        while (bralink != NULL)
-          {
-          int oldlinkoffset;
-          int offset = code - bralink + 1;
-          uschar *bra = code - offset;
-          oldlinkoffset = (bra[1] << 8) + bra[2];
-          bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
-          *code++ = OP_KET;
-          *code++ = bra[1] = offset >> 8;
-          *code++ = bra[2] = (offset & 255);
-          }
-        }
-
-      /* If the maximum is unlimited, set a repeater in the final copy. We
-      can't just offset backwards from the current code point, because we
-      don't know if there's been an options resetting after the ket. The
-      correct offset was computed above. */
-
-      else code[-ketoffset] = OP_KETRMAX + repeat_type;
-      }
-
-    /* Else there's some kind of shambles */
-
-    else
-      {
-      *errorptr = ERR11;
-      goto FAILED;
-      }
-
-    /* In all case we no longer have a previous item. */
-
-    END_REPEAT:
-    previous = NULL;
-    break;
-
-
-    /* Start of nested bracket sub-expression, or comment or lookahead or
-    lookbehind or option setting or condition. First deal with special things
-    that can come after a bracket; all are introduced by ?, and the appearance
-    of any of them means that this is not a referencing group. They were
-    checked for validity in the first pass over the string, so we don't have to
-    check for syntax errors here.  */
-
-    case '(':
-    newoptions = options;
-    condref = -1;
-
-    if (*(++ptr) == '?')
-      {
-      int set, unset;
-      int *optset;
-
-      switch (*(++ptr))
-        {
-        case '#':                 /* Comment; skip to ket */
-        ptr++;
-        while (*ptr != ')') ptr++;
-        continue;
-
-        case ':':                 /* Non-extracting bracket */
-        bravalue = OP_BRA;
-        ptr++;
-        break;
-
-        case '(':
-        bravalue = OP_COND;       /* Conditional group */
-        if ((cd->ctypes[*(++ptr)] & ctype_digit) != 0)
-          {
-          condref = *ptr - '0';
-          while (*(++ptr) != ')') condref = condref*10 + *ptr - '0';
-          if (condref == 0)
-            {
-            *errorptr = ERR35;
-            goto FAILED;
-            }
-          ptr++;
-          }
-        else ptr--;
-        break;
-
-        case '=':                 /* Positive lookahead */
-        bravalue = OP_ASSERT;
-        ptr++;
-        break;
-
-        case '!':                 /* Negative lookahead */
-        bravalue = OP_ASSERT_NOT;
-        ptr++;
-        break;
-
-        case '<':                 /* Lookbehinds */
-        switch (*(++ptr))
-          {
-          case '=':               /* Positive lookbehind */
-          bravalue = OP_ASSERTBACK;
-          ptr++;
-          break;
-
-          case '!':               /* Negative lookbehind */
-          bravalue = OP_ASSERTBACK_NOT;
-          ptr++;
-          break;
-
-          default:                /* Syntax error */
-          *errorptr = ERR24;
-          goto FAILED;
-          }
-        break;
-
-        case '>':                 /* One-time brackets */
-        bravalue = OP_ONCE;
-        ptr++;
-        break;
-
-        case 'R':                 /* Pattern recursion */
-        *code++ = OP_RECURSE;
-        ptr++;
-        continue;
-
-        default:                  /* Option setting */
-        set = unset = 0;
-        optset = &set;
-
-        while (*ptr != ')' && *ptr != ':')
-          {
-          switch (*ptr++)
-            {
-            case '-': optset = &unset; break;
-
-            case 'i': *optset |= PCRE_CASELESS; break;
-            case 'm': *optset |= PCRE_MULTILINE; break;
-            case 's': *optset |= PCRE_DOTALL; break;
-            case 'x': *optset |= PCRE_EXTENDED; break;
-            case 'U': *optset |= PCRE_UNGREEDY; break;
-            case 'X': *optset |= PCRE_EXTRA; break;
-
-            default:
-            *errorptr = ERR12;
-            goto FAILED;
-            }
-          }
-
-        /* Set up the changed option bits, but don't change anything yet. */
-
-        newoptions = (options | set) & (~unset);
-
-        /* If the options ended with ')' this is not the start of a nested
-        group with option changes, so the options change at this level. At top
-        level there is nothing else to be done (the options will in fact have
-        been set from the start of compiling as a result of the first pass) but
-        at an inner level we must compile code to change the ims options if
-        necessary, and pass the new setting back so that it can be put at the
-        start of any following branches, and when this group ends, a resetting
-        item can be compiled. */
-
-        if (*ptr == ')')
-          {
-          if ((options & PCRE_INGROUP) != 0 &&
-              (options & PCRE_IMS) != (newoptions & PCRE_IMS))
-            {
-            *code++ = OP_OPT;
-            *code++ = *optchanged = newoptions & PCRE_IMS;
-            }
-          options = newoptions;  /* Change options at this level */
-          previous = NULL;       /* This item can't be repeated */
-          continue;              /* It is complete */
-          }
-
-        /* If the options ended with ':' we are heading into a nested group
-        with possible change of options. Such groups are non-capturing and are
-        not assertions of any kind. All we need to do is skip over the ':';
-        the newoptions value is handled below. */
-
-        bravalue = OP_BRA;
-        ptr++;
-        }
-      }
-
-    /* Else we have a referencing group; adjust the opcode. */
-
-    else
-      {
-      if (++(*brackets) > EXTRACT_MAX)
-        {
-        *errorptr = ERR13;
-        goto FAILED;
-        }
-      bravalue = OP_BRA + *brackets;
-      }
-
-    /* Process nested bracketed re. Assertions may not be repeated, but other
-    kinds can be. We copy code into a non-register variable in order to be able
-    to pass its address because some compilers complain otherwise. Pass in a
-    new setting for the ims options if they have changed. */
-
-    previous = (bravalue >= OP_ONCE)? code : NULL;
-    *code = bravalue;
-    tempcode = code;
-
-    if (!compile_regex(
-         options | PCRE_INGROUP,       /* Set for all nested groups */
-         ((options & PCRE_IMS) != (newoptions & PCRE_IMS))?
-           newoptions & PCRE_IMS : -1, /* Pass ims options if changed */
-         brackets,                     /* Bracket level */
-         &tempcode,                    /* Where to put code (updated) */
-         &ptr,                         /* Input pointer (updated) */
-         errorptr,                     /* Where to put an error message */
-         (bravalue == OP_ASSERTBACK ||
-          bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
-         condref,                      /* Condition reference number */
-         &subreqchar,                  /* For possible last char */
-         &subcountlits,                /* For literal count */
-         cd))                          /* Tables block */
-      goto FAILED;
-
-    /* At the end of compiling, code is still pointing to the start of the
-    group, while tempcode has been updated to point past the end of the group
-    and any option resetting that may follow it. The pattern pointer (ptr)
-    is on the bracket. */
-
-    /* If this is a conditional bracket, check that there are no more than
-    two branches in the group. */
-
-    if (bravalue == OP_COND)
-      {
-      uschar *tc = code;
-      condcount = 0;
-
-      do {
-         condcount++;
-         tc += (tc[1] << 8) | tc[2];
-         }
-      while (*tc != OP_KET);
-
-      if (condcount > 2)
-        {
-        *errorptr = ERR27;
-        goto FAILED;
-        }
-      }
-
-    /* Handle updating of the required character. If the subpattern didn't
-    set one, leave it as it was. Otherwise, update it for normal brackets of
-    all kinds, forward assertions, and conditions with two branches. Don't
-    update the literal count for forward assertions, however. If the bracket
-    is followed by a quantifier with zero repeat, we have to back off. Hence
-    the definition of prevreqchar and subcountlits outside the main loop so
-    that they can be accessed for the back off. */
-
-    if (subreqchar > 0 &&
-         (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT ||
-         (bravalue == OP_COND && condcount == 2)))
-      {
-      prevreqchar = *reqchar;
-      *reqchar = subreqchar;
-      if (bravalue != OP_ASSERT) *countlits += subcountlits;
-      }
-
-    /* Now update the main code pointer to the end of the group. */
-
-    code = tempcode;
-
-    /* Error if hit end of pattern */
-
-    if (*ptr != ')')
-      {
-      *errorptr = ERR14;
-      goto FAILED;
-      }
-    break;
-
-    /* Check \ for being a real metacharacter; if not, fall through and handle
-    it as a data character at the start of a string. Escape items are checked
-    for validity in the pre-compiling pass. */
-
-    case '\\':
-    tempptr = ptr;
-    c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
-
-    /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values
-    are arranged to be the negation of the corresponding OP_values. For the
-    back references, the values are ESC_REF plus the reference number. Only
-    back references and those types that consume a character may be repeated.
-    We can test for values between ESC_b and ESC_Z for the latter; this may
-    have to change if any new ones are ever created. */
-
-    if (c < 0)
-      {
-      if (-c >= ESC_REF)
-        {
-        previous = code;
-        *code++ = OP_REF;
-        *code++ = -c - ESC_REF;
-        }
-      else
-        {
-        previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
-        *code++ = -c;
-        }
-      continue;
-      }
-
-    /* Data character: reset and fall through */
-
-    ptr = tempptr;
-    c = '\\';
-
-    /* Handle a run of data characters until a metacharacter is encountered.
-    The first character is guaranteed not to be whitespace or # when the
-    extended flag is set. */
-
-    NORMAL_CHAR:
-    default:
-    previous = code;
-    *code = OP_CHARS;
-    code += 2;
-    length = 0;
-
-    do
-      {
-      if ((options & PCRE_EXTENDED) != 0)
-        {
-        if ((cd->ctypes[c] & ctype_space) != 0) continue;
-        if (c == '#')
-          {
-          /* The space before the ; is to avoid a warning on a silly compiler
-          on the Macintosh. */
-          while ((c = *(++ptr)) != 0 && c != '\n') ;
-          if (c == 0) break;
-          continue;
-          }
-        }
-
-      /* Backslash may introduce a data char or a metacharacter. Escaped items
-      are checked for validity in the pre-compiling pass. Stop the string
-      before a metaitem. */
-
-      if (c == '\\')
-        {
-        tempptr = ptr;
-        c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
-        if (c < 0) { ptr = tempptr; break; }
-
-        /* If a character is > 127 in UTF-8 mode, we have to turn it into
-        two or more characters in the UTF-8 encoding. */
-
-#ifdef SUPPORT_UTF8
-        if (c > 127 && (options & PCRE_UTF8) != 0)
-          {
-          uschar buffer[8];
-          int len = ord2utf8(c, buffer);
-          for (c = 0; c < len; c++) *code++ = buffer[c];
-          length += len;
-          continue;
-          }
-#endif
-        }
-
-      /* Ordinary character or single-char escape */
-
-      *code++ = c;
-      length++;
-      }
-
-    /* This "while" is the end of the "do" above. */
-
-    while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
-    /* Update the last character and the count of literals */
-
-    prevreqchar = (length > 1)? code[-2] : *reqchar;
-    *reqchar = code[-1];
-    *countlits += length;
-
-    /* Compute the length and set it in the data vector, and advance to
-    the next state. */
-
-    previous[1] = length;
-    if (length < MAXLIT) ptr--;
-    break;
-    }
-  }                   /* end of big loop */
-
-/* Control never reaches here by falling through, only by a goto for all the
-error states. Pass back the position in the pattern so that it can be displayed
-to the user for diagnosing the error. */
-
-FAILED:
-*ptrptr = ptr;
-return FALSE;
-}
-
-
-
-
-/*************************************************
-*     Compile sequence of alternatives           *
-*************************************************/
-
-/* On entry, ptr is pointing past the bracket character, but on return
-it points to the closing bracket, or vertical bar, or end of string.
-The code variable is pointing at the byte into which the BRA operator has been
-stored. If the ims options are changed at the start (for a (?ims: group) or
-during any branch, we need to insert an OP_OPT item at the start of every
-following branch to ensure they get set correctly at run time, and also pass
-the new options into every subsequent branch compile.
-
-Argument:
-  options     the option bits
-  optchanged  new ims options to set as if (?ims) were at the start, or -1
-               for no change
-  brackets    -> int containing the number of extracting brackets used
-  codeptr     -> the address of the current code pointer
-  ptrptr      -> the address of the current pattern pointer
-  errorptr    -> pointer to error message
-  lookbehind  TRUE if this is a lookbehind assertion
-  condref     >= 0 for OPT_CREF setting at start of conditional group
-  reqchar     -> place to put the last required character, or a negative number
-  countlits   -> place to put the shortest literal count of any branch
-  cd          points to the data block with tables pointers
-
-Returns:      TRUE on success
-*/
-
-static BOOL
-compile_regex(int options, int optchanged, int *brackets, uschar **codeptr,
-  const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int condref,
-  int *reqchar, int *countlits, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-uschar *code = *codeptr;
-uschar *last_branch = code;
-uschar *start_bracket = code;
-uschar *reverse_count = NULL;
-int oldoptions = options & PCRE_IMS;
-int branchreqchar, branchcountlits;
-
-*reqchar = -1;
-*countlits = INT_MAX;
-code += 3;
-
-/* At the start of a reference-based conditional group, insert the reference
-number as an OP_CREF item. */
-
-if (condref >= 0)
-  {
-  *code++ = OP_CREF;
-  *code++ = condref;
-  }
-
-/* Loop for each alternative branch */
-
-for (;;)
-  {
-  int length;
-
-  /* Handle change of options */
-
-  if (optchanged >= 0)
-    {
-    *code++ = OP_OPT;
-    *code++ = optchanged;
-    options = (options & ~PCRE_IMS) | optchanged;
-    }
-
-  /* Set up dummy OP_REVERSE if lookbehind assertion */
-
-  if (lookbehind)
-    {
-    *code++ = OP_REVERSE;
-    reverse_count = code;
-    *code++ = 0;
-    *code++ = 0;
-    }
-
-  /* Now compile the branch */
-
-  if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged,
-      &branchreqchar, &branchcountlits, cd))
-    {
-    *ptrptr = ptr;
-    return FALSE;
-    }
-
-  /* Fill in the length of the last branch */
-
-  length = code - last_branch;
-  last_branch[1] = length >> 8;
-  last_branch[2] = length & 255;
-
-  /* Save the last required character if all branches have the same; a current
-  value of -1 means unset, while -2 means "previous branch had no last required
-  char".  */
-
-  if (*reqchar != -2)
-    {
-    if (branchreqchar >= 0)
-      {
-      if (*reqchar == -1) *reqchar = branchreqchar;
-      else if (*reqchar != branchreqchar) *reqchar = -2;
-      }
-    else *reqchar = -2;
-    }
-
-  /* Keep the shortest literal count */
-
-  if (branchcountlits < *countlits) *countlits = branchcountlits;
-  DPRINTF(("literal count = %d min=%d\n", branchcountlits, *countlits));
-
-  /* If lookbehind, check that this branch matches a fixed-length string,
-  and put the length into the OP_REVERSE item. Temporarily mark the end of
-  the branch with OP_END. */
-
-  if (lookbehind)
-    {
-    *code = OP_END;
-    length = find_fixedlength(last_branch, options);
-    DPRINTF(("fixed length = %d\n", length));
-    if (length < 0)
-      {
-      *errorptr = ERR25;
-      *ptrptr = ptr;
-      return FALSE;
-      }
-    reverse_count[0] = (length >> 8);
-    reverse_count[1] = length & 255;
-    }
-
-  /* Reached end of expression, either ')' or end of pattern. Insert a
-  terminating ket and the length of the whole bracketed item, and return,
-  leaving the pointer at the terminating char. If any of the ims options
-  were changed inside the group, compile a resetting op-code following. */
-
-  if (*ptr != '|')
-    {
-    length = code - start_bracket;
-    *code++ = OP_KET;
-    *code++ = length >> 8;
-    *code++ = length & 255;
-    if (optchanged >= 0)
-      {
-      *code++ = OP_OPT;
-      *code++ = oldoptions;
-      }
-    *codeptr = code;
-    *ptrptr = ptr;
-    return TRUE;
-    }
-
-  /* Another branch follows; insert an "or" node and advance the pointer. */
-
-  *code = OP_ALT;
-  last_branch = code;
-  code += 3;
-  ptr++;
-  }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*      Find first significant op code            *
-*************************************************/
-
-/* This is called by several functions that scan a compiled expression looking
-for a fixed first character, or an anchoring op code etc. It skips over things
-that do not influence this. For one application, a change of caseless option is
-important.
-
-Arguments:
-  code       pointer to the start of the group
-  options    pointer to external options
-  optbit     the option bit whose changing is significant, or
-             zero if none are
-  optstop    TRUE to return on option change, otherwise change the options
-               value and continue
-
-Returns:     pointer to the first significant opcode
-*/
-
-static const uschar*
-first_significant_code(const uschar *code, int *options, int optbit,
-  BOOL optstop)
-{
-for (;;)
-  {
-  switch ((int)*code)
-    {
-    case OP_OPT:
-    if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
-      {
-      if (optstop) return code;
-      *options = (int)code[1];
-      }
-    code += 2;
-    break;
-
-    case OP_CREF:
-    code += 2;
-    break;
-
-    case OP_WORD_BOUNDARY:
-    case OP_NOT_WORD_BOUNDARY:
-    code++;
-    break;
-
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    do code += (code[1] << 8) + code[2]; while (*code == OP_ALT);
-    code += 3;
-    break;
-
-    default:
-    return code;
-    }
-  }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*          Check for anchored expression         *
-*************************************************/
-
-/* Try to find out if this is an anchored regular expression. Consider each
-alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
-all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
-it's anchored. However, if this is a multiline pattern, then only OP_SOD
-counts, since OP_CIRC can match in the middle.
-
-A branch is also implicitly anchored if it starts with .* and DOTALL is set,
-because that will try the rest of the pattern at all possible matching points,
-so there is no point trying them again.
-
-Arguments:
-  code       points to start of expression (the bracket)
-  options    points to the options setting
-
-Returns:     TRUE or FALSE
-*/
-
-static BOOL
-is_anchored(register const uschar *code, int *options)
-{
-do {
-   const uschar *scode = first_significant_code(code + 3, options,
-     PCRE_MULTILINE, FALSE);
-   register int op = *scode;
-   if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
-     { if (!is_anchored(scode, options)) return FALSE; }
-   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
-            (*options & PCRE_DOTALL) != 0)
-     { if (scode[1] != OP_ANY) return FALSE; }
-   else if (op != OP_SOD &&
-           ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
-     return FALSE;
-   code += (code[1] << 8) + code[2];
-   }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-*         Check for starting with ^ or .*        *
-*************************************************/
-
-/* This is called to find out if every branch starts with ^ or .* so that
-"first char" processing can be done to speed things up in multiline
-matching and for non-DOTALL patterns that start with .* (which must start at
-the beginning or after \n).
-
-Argument:  points to start of expression (the bracket)
-Returns:   TRUE or FALSE
-*/
-
-static BOOL
-is_startline(const uschar *code)
-{
-do {
-   const uschar *scode = first_significant_code(code + 3, NULL, 0, FALSE);
-   register int op = *scode;
-   if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
-     { if (!is_startline(scode)) return FALSE; }
-   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
-     { if (scode[1] != OP_ANY) return FALSE; }
-   else if (op != OP_CIRC) return FALSE;
-   code += (code[1] << 8) + code[2];
-   }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-*          Check for fixed first char            *
-*************************************************/
-
-/* Try to find out if there is a fixed first character. This is called for
-unanchored expressions, as it speeds up their processing quite considerably.
-Consider each alternative branch. If they all start with the same char, or with
-a bracket all of whose alternatives start with the same char (recurse ad lib),
-then we return that char, otherwise -1.
-
-Arguments:
-  code       points to start of expression (the bracket)
-  options    pointer to the options (used to check casing changes)
-
-Returns:     -1 or the fixed first char
-*/
-
-static int
-find_firstchar(const uschar *code, int *options)
-{
-register int c = -1;
-do {
-   int d;
-   const uschar *scode = first_significant_code(code + 3, options,
-     PCRE_CASELESS, TRUE);
-   register int op = *scode;
-
-   if (op >= OP_BRA) op = OP_BRA;
-
-   switch(op)
-     {
-     default:
-     return -1;
-
-     case OP_BRA:
-     case OP_ASSERT:
-     case OP_ONCE:
-     case OP_COND:
-     if ((d = find_firstchar(scode, options)) < 0) return -1;
-     if (c < 0) c = d; else if (c != d) return -1;
-     break;
-
-     case OP_EXACT:       /* Fall through */
-     scode++;
-
-     case OP_CHARS:       /* Fall through */
-     scode++;
-
-     case OP_PLUS:
-     case OP_MINPLUS:
-     if (c < 0) c = scode[1]; else if (c != scode[1]) return -1;
-     break;
-     }
-
-   code += (code[1] << 8) + code[2];
-   }
-while (*code == OP_ALT);
-return c;
-}
-
-
-
-
-
-/*************************************************
-*        Compile a Regular Expression            *
-*************************************************/
-
-/* This function takes a string and returns a pointer to a block of store
-holding a compiled version of the expression.
-
-Arguments:
-  pattern      the regular expression
-  options      various option bits
-  errorptr     pointer to pointer to error text
-  erroroffset  ptr offset in pattern where error was detected
-  tables       pointer to character tables or NULL
-
-Returns:       pointer to compiled data block, or NULL on error,
-               with errorptr and erroroffset set
-*/
-
-pcre *
-pcre_compile(const char *pattern, int options, const char **errorptr,
-  int *erroroffset, const unsigned char *tables)
-{
-real_pcre *re;
-int length = 3;      /* For initial BRA plus length */
-int runlength;
-int c, reqchar, countlits;
-int bracount = 0;
-int top_backref = 0;
-int branch_extra = 0;
-int branch_newextra;
-unsigned int brastackptr = 0;
-size_t size;
-uschar *code;
-const uschar *ptr;
-compile_data compile_block;
-int brastack[BRASTACK_SIZE];
-uschar bralenstack[BRASTACK_SIZE];
-
-#ifdef DEBUG
-uschar *code_base, *code_end;
-#endif
-
-/* Can't support UTF8 unless PCRE has been compiled to include the code. */
-
-#ifndef SUPPORT_UTF8
-if ((options & PCRE_UTF8) != 0)
-  {
-  *errorptr = ERR32;
-  return NULL;
-  }
-#endif
-
-/* We can't pass back an error message if errorptr is NULL; I guess the best we
-can do is just return NULL. */
-
-if (errorptr == NULL) return NULL;
-*errorptr = NULL;
-
-/* However, we can give a message for this error */
-
-if (erroroffset == NULL)
-  {
-  *errorptr = ERR16;
-  return NULL;
-  }
-*erroroffset = 0;
-
-if ((options & ~PUBLIC_OPTIONS) != 0)
-  {
-  *errorptr = ERR17;
-  return NULL;
-  }
-
-/* Set up pointers to the individual character tables */
-
-if (tables == NULL) tables = pcre_default_tables;
-compile_block.lcc = tables + lcc_offset;
-compile_block.fcc = tables + fcc_offset;
-compile_block.cbits = tables + cbits_offset;
-compile_block.ctypes = tables + ctypes_offset;
-
-/* Reflect pattern for debugging output */
-
-DPRINTF(("------------------------------------------------------------------\n"));
-DPRINTF(("%s\n", pattern));
-
-/* The first thing to do is to make a pass over the pattern to compute the
-amount of store required to hold the compiled code. This does not have to be
-perfect as long as errors are overestimates. At the same time we can detect any
-internal flag settings. Make an attempt to correct for any counted white space
-if an "extended" flag setting appears late in the pattern. We can't be so
-clever for #-comments. */
-
-ptr = (const uschar *)(pattern - 1);
-while ((c = *(++ptr)) != 0)
-  {
-  int min, max;
-  int class_charcount;
-
-  if ((options & PCRE_EXTENDED) != 0)
-    {
-    if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
-    if (c == '#')
-      {
-      /* The space before the ; is to avoid a warning on a silly compiler
-      on the Macintosh. */
-      while ((c = *(++ptr)) != 0 && c != '\n') ;
-      continue;
-      }
-    }
-
-  switch(c)
-    {
-    /* A backslashed item may be an escaped "normal" character or a
-    character type. For a "normal" character, put the pointers and
-    character back so that tests for whitespace etc. in the input
-    are done correctly. */
-
-    case '\\':
-      {
-      const uschar *save_ptr = ptr;
-      c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block);
-      if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-      if (c >= 0)
-        {
-        ptr = save_ptr;
-        c = '\\';
-        goto NORMAL_CHAR;
-        }
-      }
-    length++;
-
-    /* A back reference needs an additional char, plus either one or 5
-    bytes for a repeat. We also need to keep the value of the highest
-    back reference. */
-
-    if (c <= -ESC_REF)
-      {
-      int refnum = -c - ESC_REF;
-      if (refnum > top_backref) top_backref = refnum;
-      length++;   /* For single back reference */
-      if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
-        {
-        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if ((min == 0 && (max == 1 || max == -1)) ||
-          (min == 1 && max == -1))
-            length++;
-        else length += 5;
-        if (ptr[1] == '?') ptr++;
-        }
-      }
-    continue;
-
-    case '^':
-    case '.':
-    case '$':
-    case '*':     /* These repeats won't be after brackets; */
-    case '+':     /* those are handled separately */
-    case '?':
-    length++;
-    continue;
-
-    /* This covers the cases of repeats after a single char, metachar, class,
-    or back reference. */
-
-    case '{':
-    if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR;
-    ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block);
-    if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-    if ((min == 0 && (max == 1 || max == -1)) ||
-      (min == 1 && max == -1))
-        length++;
-    else
-      {
-      length--;   /* Uncount the original char or metachar */
-      if (min == 1) length++; else if (min > 0) length += 4;
-      if (max > 0) length += 4; else length += 2;
-      }
-    if (ptr[1] == '?') ptr++;
-    continue;
-
-    /* An alternation contains an offset to the next branch or ket. If any ims
-    options changed in the previous branch(es), and/or if we are in a
-    lookbehind assertion, extra space will be needed at the start of the
-    branch. This is handled by branch_extra. */
-
-    case '|':
-    length += 3 + branch_extra;
-    continue;
-
-    /* A character class uses 33 characters. Don't worry about character types
-    that aren't allowed in classes - they'll get picked up during the compile.
-    A character class that contains only one character uses 2 or 3 bytes,
-    depending on whether it is negated or not. Notice this where we can. */
-
-    case '[':
-    class_charcount = 0;
-    if (*(++ptr) == '^') ptr++;
-    do
-      {
-      if (*ptr == '\\')
-        {
-        int ch = check_escape(&ptr, errorptr, bracount, options, TRUE,
-          &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if (-ch == ESC_b) class_charcount++; else class_charcount = 10;
-        }
-      else class_charcount++;
-      ptr++;
-      }
-    while (*ptr != 0 && *ptr != ']');
-
-    /* Repeats for negated single chars are handled by the general code */
-
-    if (class_charcount == 1) length += 3; else
-      {
-      length += 33;
-
-      /* A repeat needs either 1 or 5 bytes. */
-
-      if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
-        {
-        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if ((min == 0 && (max == 1 || max == -1)) ||
-          (min == 1 && max == -1))
-            length++;
-        else length += 5;
-        if (ptr[1] == '?') ptr++;
-        }
-      }
-    continue;
-
-    /* Brackets may be genuine groups or special things */
-
-    case '(':
-    branch_newextra = 0;
-
-    /* Handle special forms of bracket, which all start (? */
-
-    if (ptr[1] == '?')
-      {
-      int set, unset;
-      int *optset;
-
-      switch (c = ptr[2])
-        {
-        /* Skip over comments entirely */
-        case '#':
-        ptr += 3;
-        while (*ptr != 0 && *ptr != ')') ptr++;
-        if (*ptr == 0)
-          {
-          *errorptr = ERR18;
-          goto PCRE_ERROR_RETURN;
-          }
-        continue;
-
-        /* Non-referencing groups and lookaheads just move the pointer on, and
-        then behave like a non-special bracket, except that they don't increment
-        the count of extracting brackets. Ditto for the "once only" bracket,
-        which is in Perl from version 5.005. */
-
-        case ':':
-        case '=':
-        case '!':
-        case '>':
-        ptr += 2;
-        break;
-
-        /* A recursive call to the regex is an extension, to provide the
-        facility which can be obtained by $(?p{perl-code}) in Perl 5.6. */
-
-        case 'R':
-        if (ptr[3] != ')')
-          {
-          *errorptr = ERR29;
-          goto PCRE_ERROR_RETURN;
-          }
-        ptr += 3;
-        length += 1;
-        break;
-
-        /* Lookbehinds are in Perl from version 5.005 */
-
-        case '<':
-        if (ptr[3] == '=' || ptr[3] == '!')
-          {
-          ptr += 3;
-          branch_newextra = 3;
-          length += 3;         /* For the first branch */
-          break;
-          }
-        *errorptr = ERR24;
-        goto PCRE_ERROR_RETURN;
-
-        /* Conditionals are in Perl from version 5.005. The bracket must either
-        be followed by a number (for bracket reference) or by an assertion
-        group. */
-
-        case '(':
-        if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0)
-          {
-          ptr += 4;
-          length += 2;
-          while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++;
-          if (*ptr != ')')
-            {
-            *errorptr = ERR26;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-        else   /* An assertion must follow */
-          {
-          ptr++;   /* Can treat like ':' as far as spacing is concerned */
-          if (ptr[2] != '?' ||
-             (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
-            {
-            ptr += 2;    /* To get right offset in message */
-            *errorptr = ERR28;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-        break;
-
-        /* Else loop checking valid options until ) is met. Anything else is an
-        error. If we are without any brackets, i.e. at top level, the settings
-        act as if specified in the options, so massage the options immediately.
-        This is for backward compatibility with Perl 5.004. */
-
-        default:
-        set = unset = 0;
-        optset = &set;
-        ptr += 2;
-
-        for (;; ptr++)
-          {
-          c = *ptr;
-          switch (c)
-            {
-            case 'i':
-            *optset |= PCRE_CASELESS;
-            continue;
-
-            case 'm':
-            *optset |= PCRE_MULTILINE;
-            continue;
-
-            case 's':
-            *optset |= PCRE_DOTALL;
-            continue;
-
-            case 'x':
-            *optset |= PCRE_EXTENDED;
-            continue;
-
-            case 'X':
-            *optset |= PCRE_EXTRA;
-            continue;
-
-            case 'U':
-            *optset |= PCRE_UNGREEDY;
-            continue;
-
-            case '-':
-            optset = &unset;
-            continue;
-
-            /* A termination by ')' indicates an options-setting-only item;
-            this is global at top level; otherwise nothing is done here and
-            it is handled during the compiling process on a per-bracket-group
-            basis. */
-
-            case ')':
-            if (brastackptr == 0)
-              {
-              options = (options | set) & (~unset);
-              set = unset = 0;     /* To save length */
-              }
-            /* Fall through */
-
-            /* A termination by ':' indicates the start of a nested group with
-            the given options set. This is again handled at compile time, but
-            we must allow for compiled space if any of the ims options are
-            set. We also have to allow for resetting space at the end of
-            the group, which is why 4 is added to the length and not just 2.
-            If there are several changes of options within the same group, this
-            will lead to an over-estimate on the length, but this shouldn't
-            matter very much. We also have to allow for resetting options at
-            the start of any alternations, which we do by setting
-            branch_newextra to 2. Finally, we record whether the case-dependent
-            flag ever changes within the regex. This is used by the "required
-            character" code. */
-
-            case ':':
-            if (((set|unset) & PCRE_IMS) != 0)
-              {
-              length += 4;
-              branch_newextra = 2;
-              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
-              }
-            goto END_OPTIONS;
-
-            /* Unrecognized option character */
-
-            default:
-            *errorptr = ERR12;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-
-        /* If we hit a closing bracket, that's it - this is a freestanding
-        option-setting. We need to ensure that branch_extra is updated if
-        necessary. The only values branch_newextra can have here are 0 or 2.
-        If the value is 2, then branch_extra must either be 2 or 5, depending
-        on whether this is a lookbehind group or not. */
-
-        END_OPTIONS:
-        if (c == ')')
-          {
-          if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3))
-            branch_extra += branch_newextra;
-          continue;
-          }
-
-        /* If options were terminated by ':' control comes here. Fall through
-        to handle the group below. */
-        }
-      }
-
-    /* Extracting brackets must be counted so we can process escapes in a
-    Perlish way. */
-
-    else bracount++;
-
-    /* Non-special forms of bracket. Save length for computing whole length
-    at end if there's a repeat that requires duplication of the group. Also
-    save the current value of branch_extra, and start the new group with
-    the new value. If non-zero, this will either be 2 for a (?imsx: group, or 3
-    for a lookbehind assertion. */
-
-    if (brastackptr >= sizeof(brastack)/sizeof(int))
-      {
-      *errorptr = ERR19;
-      goto PCRE_ERROR_RETURN;
-      }
-
-    bralenstack[brastackptr] = branch_extra;
-    branch_extra = branch_newextra;
-
-    brastack[brastackptr++] = length;
-    length += 3;
-    continue;
-
-    /* Handle ket. Look for subsequent max/min; for certain sets of values we
-    have to replicate this bracket up to that many times. If brastackptr is
-    0 this is an unmatched bracket which will generate an error, but take care
-    not to try to access brastack[-1] when computing the length and restoring
-    the branch_extra value. */
-
-    case ')':
-    length += 3;
-      {
-      int minval = 1;
-      int maxval = 1;
-      int duplength;
-
-      if (brastackptr > 0)
-        {
-        duplength = length - brastack[--brastackptr];
-        branch_extra = bralenstack[brastackptr];
-        }
-      else duplength = 0;
-
-      /* Leave ptr at the final char; for read_repeat_counts this happens
-      automatically; for the others we need an increment. */
-
-      if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block))
-        {
-        ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr,
-          &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        }
-      else if (c == '*') { minval = 0; maxval = -1; ptr++; }
-      else if (c == '+') { maxval = -1; ptr++; }
-      else if (c == '?') { minval = 0; ptr++; }
-
-      /* If the minimum is zero, we have to allow for an OP_BRAZERO before the
-      group, and if the maximum is greater than zero, we have to replicate
-      maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting
-      bracket set - hence the 7. */
-
-      if (minval == 0)
-        {
-        length++;
-        if (maxval > 0) length += (maxval - 1) * (duplength + 7);
-        }
-
-      /* When the minimum is greater than zero, 1 we have to replicate up to
-      minval-1 times, with no additions required in the copies. Then, if
-      there is a limited maximum we have to replicate up to maxval-1 times
-      allowing for a BRAZERO item before each optional copy and nesting
-      brackets for all but one of the optional copies. */
-
-      else
-        {
-        length += (minval - 1) * duplength;
-        if (maxval > minval)   /* Need this test as maxval=-1 means no limit */
-          length += (maxval - minval) * (duplength + 7) - 6;
-        }
-      }
-    continue;
-
-    /* Non-special character. For a run of such characters the length required
-    is the number of characters + 2, except that the maximum run length is 255.
-    We won't get a skipped space or a non-data escape or the start of a #
-    comment as the first character, so the length can't be zero. */
-
-    NORMAL_CHAR:
-    default:
-    length += 2;
-    runlength = 0;
-    do
-      {
-      if ((options & PCRE_EXTENDED) != 0)
-        {
-        if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
-        if (c == '#')
-          {
-          /* The space before the ; is to avoid a warning on a silly compiler
-          on the Macintosh. */
-          while ((c = *(++ptr)) != 0 && c != '\n') ;
-          continue;
-          }
-        }
-
-      /* Backslash may introduce a data char or a metacharacter; stop the
-      string before the latter. */
-
-      if (c == '\\')
-        {
-        const uschar *saveptr = ptr;
-        c = check_escape(&ptr, errorptr, bracount, options, FALSE,
-          &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if (c < 0) { ptr = saveptr; break; }
-
-#ifdef SUPPORT_UTF8
-        if (c > 127 && (options & PCRE_UTF8) != 0)
-          {
-          int i;
-          for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-            if (c <= utf8_table1[i]) break;
-          runlength += i;
-          }
-#endif
-        }
-
-      /* Ordinary character or single-char escape */
-
-      runlength++;
-      }
-
-    /* This "while" is the end of the "do" above. */
-
-    while (runlength < MAXLIT &&
-      (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
-    ptr--;
-    length += runlength;
-    continue;
-    }
-  }
-
-length += 4;    /* For final KET and END */
-
-if (length > 65539)
-  {
-  *errorptr = ERR20;
-  return NULL;
-  }
-
-/* Compute the size of data block needed and get it, either from malloc or
-externally provided function. We specify "code[0]" in the offsetof() expression
-rather than just "code", because it has been reported that one broken compiler
-fails on "code" because it is also an independent variable. It should make no
-difference to the value of the offsetof(). */
-
-size = length + offsetof(real_pcre, code[0]);
-re = (real_pcre *)(pcre_malloc)(size);
-
-if (re == NULL)
-  {
-  *errorptr = ERR21;
-  return NULL;
-  }
-
-/* Put in the magic number, and save the size, options, and table pointer */
-
-re->magic_number = MAGIC_NUMBER;
-re->size = size;
-re->options = options;
-re->tables = tables;
-
-/* Set up a starting, non-extracting bracket, then compile the expression. On
-error, *errorptr will be set non-NULL, so we don't need to look at the result
-of the function here. */
-
-ptr = (const uschar *)pattern;
-code = re->code;
-*code = OP_BRA;
-bracount = 0;
-(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, -1,
-  &reqchar, &countlits, &compile_block);
-re->top_bracket = bracount;
-re->top_backref = top_backref;
-
-/* If not reached end of pattern on success, there's an excess bracket. */
-
-if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;
-
-/* Fill in the terminating state and check for disastrous overflow, but
-if debugging, leave the test till after things are printed out. */
-
-*code++ = OP_END;
-
-#ifndef DEBUG
-if (code - re->code > length) *errorptr = ERR23;
-#endif
-
-/* Give an error if there's back reference to a non-existent capturing
-subpattern. */
-
-if (top_backref > re->top_bracket) *errorptr = ERR15;
-
-/* Failed to compile */
-
-if (*errorptr != NULL)
-  {
-  (pcre_free)(re);
-  PCRE_ERROR_RETURN:
-  *erroroffset = ptr - (const uschar *)pattern;
-  return NULL;
-  }
-
-/* If the anchored option was not passed, set flag if we can determine that the
-pattern is anchored by virtue of ^ characters or \A or anything else (such as
-starting with .* when DOTALL is set).
-
-Otherwise, see if we can determine what the first character has to be, because
-that speeds up unanchored matches no end. If not, see if we can set the
-PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
-start with ^. and also when all branches start with .* for non-DOTALL matches.
-*/
-
-if ((options & PCRE_ANCHORED) == 0)
-  {
-  int temp_options = options;
-  if (is_anchored(re->code, &temp_options))
-    re->options |= PCRE_ANCHORED;
-  else
-    {
-    int ch = find_firstchar(re->code, &temp_options);
-    if (ch >= 0)
-      {
-      re->first_char = ch;
-      re->options |= PCRE_FIRSTSET;
-      }
-    else if (is_startline(re->code))
-      re->options |= PCRE_STARTLINE;
-    }
-  }
-
-/* Save the last required character if there are at least two literal
-characters on all paths, or if there is no first character setting. */
-
-if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0))
-  {
-  re->req_char = reqchar;
-  re->options |= PCRE_REQCHSET;
-  }
-
-/* Print out the compiled data for debugging */
-
-#ifdef DEBUG
-
-printf("Length = %d top_bracket = %d top_backref = %d\n",
-  length, re->top_bracket, re->top_backref);
-
-if (re->options != 0)
-  {
-  printf("%s%s%s%s%s%s%s%s%s\n",
-    ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
-    ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
-    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
-    ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
-    ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
-    ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
-    ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
-    ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
-    ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
-  }
-
-if ((re->options & PCRE_FIRSTSET) != 0)
-  {
-  if (isprint(re->first_char)) printf("First char = %c\n", re->first_char);
-    else printf("First char = \\x%02x\n", re->first_char);
-  }
-
-if ((re->options & PCRE_REQCHSET) != 0)
-  {
-  if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char);
-    else printf("Req char = \\x%02x\n", re->req_char);
-  }
-
-code_end = code;
-code_base = code = re->code;
-
-while (code < code_end)
-  {
-  int charlength;
-
-  printf("%3d ", code - code_base);
-
-  if (*code >= OP_BRA)
-    {
-    printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
-    code += 2;
-    }
-
-  else switch(*code)
-    {
-    case OP_OPT:
-    printf(" %.2x %s", code[1], OP_names[*code]);
-    code++;
-    break;
-
-    case OP_COND:
-    printf("%3d Cond", (code[1] << 8) + code[2]);
-    code += 2;
-    break;
-
-    case OP_CREF:
-    printf(" %.2d %s", code[1], OP_names[*code]);
-    code++;
-    break;
-
-    case OP_CHARS:
-    charlength = *(++code);
-    printf("%3d ", charlength);
-    while (charlength-- > 0)
-      if (isprint(c = *(++code))) printf("%c", c); else printf("\\x%02x", c);
-    break;
-
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_ALT:
-    case OP_KET:
-    case OP_ASSERT:
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    case OP_ONCE:
-    printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
-    code += 2;
-    break;
-
-    case OP_REVERSE:
-    printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
-    code += 2;
-    break;
-
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    if (*code >= OP_TYPESTAR)
-      printf("    %s", OP_names[code[1]]);
-    else if (isprint(c = code[1])) printf("    %c", c);
-      else printf("    \\x%02x", c);
-    printf("%s", OP_names[*code++]);
-    break;
-
-    case OP_EXACT:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    if (isprint(c = code[3])) printf("    %c{", c);
-      else printf("    \\x%02x{", c);
-    if (*code != OP_EXACT) printf("0,");
-    printf("%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_MINUPTO) printf("?");
-    code += 3;
-    break;
-
-    case OP_TYPEEXACT:
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    printf("    %s{", OP_names[code[3]]);
-    if (*code != OP_TYPEEXACT) printf(",");
-    printf("%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_TYPEMINUPTO) printf("?");
-    code += 3;
-    break;
-
-    case OP_NOT:
-    if (isprint(c = *(++code))) printf("    [^%c]", c);
-      else printf("    [^\\x%02x]", c);
-    break;
-
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    if (isprint(c = code[1])) printf("    [^%c]", c);
-      else printf("    [^\\x%02x]", c);
-    printf("%s", OP_names[*code++]);
-    break;
-
-    case OP_NOTEXACT:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    if (isprint(c = code[3])) printf("    [^%c]{", c);
-      else printf("    [^\\x%02x]{", c);
-    if (*code != OP_NOTEXACT) printf(",");
-    printf("%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_NOTMINUPTO) printf("?");
-    code += 3;
-    break;
-
-    case OP_REF:
-    printf("    \\%d", *(++code));
-    code ++;
-    goto CLASS_REF_REPEAT;
-
-    case OP_CLASS:
-      {
-      int i, min, max;
-      code++;
-      printf("    [");
-
-      for (i = 0; i < 256; i++)
-        {
-        if ((code[i/8] & (1 << (i&7))) != 0)
-          {
-          int j;
-          for (j = i+1; j < 256; j++)
-            if ((code[j/8] & (1 << (j&7))) == 0) break;
-          if (i == '-' || i == ']') printf("\\");
-          if (isprint(i)) printf("%c", i); else printf("\\x%02x", i);
-          if (--j > i)
-            {
-            printf("-");
-            if (j == '-' || j == ']') printf("\\");
-            if (isprint(j)) printf("%c", j); else printf("\\x%02x", j);
-            }
-          i = j;
-          }
-        }
-      printf("]");
-      code += 32;
-
-      CLASS_REF_REPEAT:
-
-      switch(*code)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        printf("%s", OP_names[*code]);
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        min = (code[1] << 8) + code[2];
-        max = (code[3] << 8) + code[4];
-        if (max == 0) printf("{%d,}", min);
-        else printf("{%d,%d}", min, max);
-        if (*code == OP_CRMINRANGE) printf("?");
-        code += 4;
-        break;
-
-        default:
-        code--;
-        }
-      }
-    break;
-
-    /* Anything else is just a one-node item */
-
-    default:
-    printf("    %s", OP_names[*code]);
-    break;
-    }
-
-  code++;
-  printf("\n");
-  }
-printf("------------------------------------------------------------------\n");
-
-/* This check is done here in the debugging case so that the code that
-was compiled can be seen. */
-
-if (code - re->code > length)
-  {
-  *errorptr = ERR23;
-  (pcre_free)(re);
-  *erroroffset = ptr - (uschar *)pattern;
-  return NULL;
-  }
-#endif
-
-return (pcre *)re;
-}
-
-
-
-/*************************************************
-*          Match a back-reference                *
-*************************************************/
-
-/* If a back reference hasn't been set, the length that is passed is greater
-than the number of characters left in the string, so the match fails.
-
-Arguments:
-  offset      index into the offset vector
-  eptr        points into the subject
-  length      length to be matched
-  md          points to match data block
-  ims         the ims flags
-
-Returns:      TRUE if matched
-*/
-
-static BOOL
-match_ref(int offset, register const uschar *eptr, int length, match_data *md,
-  unsigned long int ims)
-{
-const uschar *p = md->start_subject + md->offset_vector[offset];
-
-#ifdef DEBUG
-if (eptr >= md->end_subject)
-  printf("matching subject <null>");
-else
-  {
-  printf("matching subject ");
-  pchars(eptr, length, TRUE, md);
-  }
-printf(" against backref ");
-pchars(p, length, FALSE, md);
-printf("\n");
-#endif
-
-/* Always fail if not enough characters left */
-
-if (length > md->end_subject - eptr) return FALSE;
-
-/* Separate the caselesss case for speed */
-
-if ((ims & PCRE_CASELESS) != 0)
-  {
-  while (length-- > 0)
-    if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
-  }
-else
-  { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
-
-return TRUE;
-}
-
-
-
-/*************************************************
-*         Match from current position            *
-*************************************************/
-
-/* On entry ecode points to the first opcode, and eptr to the first character
-in the subject string, while eptrb holds the value of eptr at the start of the
-last bracketed group - used for breaking infinite loops matching zero-length
-strings.
-
-Arguments:
-   eptr        pointer in subject
-   ecode       position in code
-   offset_top  current top pointer
-   md          pointer to "static" info for the match
-   ims         current /i, /m, and /s options
-   eptrb       pointer to chain of blocks containing eptr at start of
-                 brackets - for testing for empty matches
-   flags       can contain
-                 match_condassert - this is an assertion condition
-                 match_isgroup - this is the start of a bracketed group
-
-Returns:       TRUE if matched
-*/
-
-static BOOL
-match(register const uschar *eptr, register const uschar *ecode,
-  int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
-  int flags)
-{
-unsigned long int original_ims = ims;   /* Save for resetting on ')' */
-eptrblock newptrb;
-
-/* At the start of a bracketed group, add the current subject pointer to the
-stack of such pointers, to be re-instated at the end of the group when we hit
-the closing ket. When match() is called in other circumstances, we don't add to
-the stack. */
-
-if ((flags & match_isgroup) != 0)
-  {
-  newptrb.prev = eptrb;
-  newptrb.saved_eptr = eptr;
-  eptrb = &newptrb;
-  }
-
-/* Now start processing the operations. */
-
-for (;;)
-  {
-  int op = (int)*ecode;
-  int min, max, ctype;
-  register int i;
-  register int c;
-  BOOL minimize = FALSE;
-
-  /* Opening capturing bracket. If there is space in the offset vector, save
-  the current subject position in the working slot at the top of the vector. We
-  mustn't change the current values of the data slot, because they may be set
-  from a previous iteration of this group, and be referred to by a reference
-  inside the group.
-
-  If the bracket fails to match, we need to restore this value and also the
-  values of the final offsets, in case they were set by a previous iteration of
-  the same bracket.
-
-  If there isn't enough space in the offset vector, treat this as if it were a
-  non-capturing bracket. Don't worry about setting the flag for the error case
-  here; that is handled in the code for KET. */
-
-  if (op > OP_BRA)
-    {
-    int number = op - OP_BRA;
-    int offset = number << 1;
-
-#ifdef DEBUG
-    printf("start bracket %d subject=", number);
-    pchars(eptr, 16, TRUE, md);
-    printf("\n");
-#endif
-
-    if (offset < md->offset_max)
-      {
-      int save_offset1 = md->offset_vector[offset];
-      int save_offset2 = md->offset_vector[offset+1];
-      int save_offset3 = md->offset_vector[md->offset_end - number];
-
-      DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
-      md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
-
-      do
-        {
-        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
-          return TRUE;
-        ecode += (ecode[1] << 8) + ecode[2];
-        }
-      while (*ecode == OP_ALT);
-
-      DPRINTF(("bracket %d failed\n", number));
-
-      md->offset_vector[offset] = save_offset1;
-      md->offset_vector[offset+1] = save_offset2;
-      md->offset_vector[md->offset_end - number] = save_offset3;
-      return FALSE;
-      }
-
-    /* Insufficient room for saving captured contents */
-
-    else op = OP_BRA;
-    }
-
-  /* Other types of node can be handled by a switch */
-
-  switch(op)
-    {
-    case OP_BRA:     /* Non-capturing bracket: optimized */
-    DPRINTF(("start bracket 0\n"));
-    do
-      {
-      if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
-        return TRUE;
-      ecode += (ecode[1] << 8) + ecode[2];
-      }
-    while (*ecode == OP_ALT);
-    DPRINTF(("bracket 0 failed\n"));
-    return FALSE;
-
-    /* Conditional group: compilation checked that there are no more than
-    two branches. If the condition is false, skipping the first branch takes us
-    past the end if there is only one branch, but that's OK because that is
-    exactly what going to the ket would do. */
-
-    case OP_COND:
-    if (ecode[3] == OP_CREF)         /* Condition is extraction test */
-      {
-      int offset = ecode[4] << 1;    /* Doubled reference number */
-      return match(eptr,
-        ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)?
-          5 : 3 + (ecode[1] << 8) + ecode[2]),
-        offset_top, md, ims, eptrb, match_isgroup);
-      }
-
-    /* The condition is an assertion. Call match() to evaluate it - setting
-    the final argument TRUE causes it to stop at the end of an assertion. */
-
-    else
-      {
-      if (match(eptr, ecode+3, offset_top, md, ims, NULL,
-          match_condassert | match_isgroup))
-        {
-        ecode += 3 + (ecode[4] << 8) + ecode[5];
-        while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2];
-        }
-      else ecode += (ecode[1] << 8) + ecode[2];
-      return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup);
-      }
-    /* Control never reaches here */
-
-    /* Skip over conditional reference data if encountered (should not be) */
-
-    case OP_CREF:
-    ecode += 2;
-    break;
-
-    /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched
-    an empty string - recursion will then try other alternatives, if any. */
-
-    case OP_END:
-    if (md->notempty && eptr == md->start_match) return FALSE;
-    md->end_match_ptr = eptr;          /* Record where we ended */
-    md->end_offset_top = offset_top;   /* and how many extracts were taken */
-    return TRUE;
-
-    /* Change option settings */
-
-    case OP_OPT:
-    ims = ecode[1];
-    ecode += 2;
-    DPRINTF(("ims set to %02lx\n", ims));
-    break;
-
-    /* Assertion brackets. Check the alternative branches in turn - the
-    matching won't pass the KET for an assertion. If any one branch matches,
-    the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
-    start of each branch to move the current point backwards, so the code at
-    this level is identical to the lookahead case. */
-
-    case OP_ASSERT:
-    case OP_ASSERTBACK:
-    do
-      {
-      if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break;
-      ecode += (ecode[1] << 8) + ecode[2];
-      }
-    while (*ecode == OP_ALT);
-    if (*ecode == OP_KET) return FALSE;
-
-    /* If checking an assertion for a condition, return TRUE. */
-
-    if ((flags & match_condassert) != 0) return TRUE;
-
-    /* Continue from after the assertion, updating the offsets high water
-    mark, since extracts may have been taken during the assertion. */
-
-    do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
-    ecode += 3;
-    offset_top = md->end_offset_top;
-    continue;
-
-    /* Negative assertion: all branches must fail to match */
-
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK_NOT:
-    do
-      {
-      if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup))
-        return FALSE;
-      ecode += (ecode[1] << 8) + ecode[2];
-      }
-    while (*ecode == OP_ALT);
-
-    if ((flags & match_condassert) != 0) return TRUE;
-
-    ecode += 3;
-    continue;
-
-    /* Move the subject pointer back. This occurs only at the start of
-    each branch of a lookbehind assertion. If we are too close to the start to
-    move back, this match function fails. When working with UTF-8 we move
-    back a number of characters, not bytes. */
-
-    case OP_REVERSE:
-#ifdef SUPPORT_UTF8
-    c = (ecode[1] << 8) + ecode[2];
-    for (i = 0; i < c; i++)
-      {
-      eptr--;
-      BACKCHAR(eptr)
-      }
-#else
-    eptr -= (ecode[1] << 8) + ecode[2];
-#endif
-
-    if (eptr < md->start_subject) return FALSE;
-    ecode += 3;
-    break;
-
-    /* Recursion matches the current regex, nested. If there are any capturing
-    brackets started but not finished, we have to save their starting points
-    and reinstate them after the recursion. However, we don't know how many
-    such there are (offset_top records the completed total) so we just have
-    to save all the potential data. There may be up to 99 such values, which
-    is a bit large to put on the stack, but using malloc for small numbers
-    seems expensive. As a compromise, the stack is used when there are fewer
-    than 16 values to store; otherwise malloc is used. A problem is what to do
-    if the malloc fails ... there is no way of returning to the top level with
-    an error. Save the top 15 values on the stack, and accept that the rest
-    may be wrong. */
-
-    case OP_RECURSE:
-      {
-      BOOL rc;
-      int *save;
-      int stacksave[15];
-
-      c = md->offset_max;
-
-      if (c < 16) save = stacksave; else
-        {
-        save = (int *)(pcre_malloc)((c+1) * sizeof(int));
-        if (save == NULL)
-          {
-          save = stacksave;
-          c = 15;
-          }
-        }
-
-      for (i = 1; i <= c; i++)
-        save[i] = md->offset_vector[md->offset_end - i];
-      rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb,
-        match_isgroup);
-      for (i = 1; i <= c; i++)
-        md->offset_vector[md->offset_end - i] = save[i];
-      if (save != stacksave) (pcre_free)(save);
-      if (!rc) return FALSE;
-
-      /* In case the recursion has set more capturing values, save the final
-      number, then move along the subject till after the recursive match,
-      and advance one byte in the pattern code. */
-
-      offset_top = md->end_offset_top;
-      eptr = md->end_match_ptr;
-      ecode++;
-      }
-    break;
-
-    /* "Once" brackets are like assertion brackets except that after a match,
-    the point in the subject string is not moved back. Thus there can never be
-    a move back into the brackets. Check the alternative branches in turn - the
-    matching won't pass the KET for this kind of subpattern. If any one branch
-    matches, we carry on as at the end of a normal bracket, leaving the subject
-    pointer. */
-
-    case OP_ONCE:
-      {
-      const uschar *prev = ecode;
-      const uschar *saved_eptr = eptr;
-
-      do
-        {
-        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup))
-          break;
-        ecode += (ecode[1] << 8) + ecode[2];
-        }
-      while (*ecode == OP_ALT);
-
-      /* If hit the end of the group (which could be repeated), fail */
-
-      if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE;
-
-      /* Continue as from after the assertion, updating the offsets high water
-      mark, since extracts may have been taken. */
-
-      do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
-
-      offset_top = md->end_offset_top;
-      eptr = md->end_match_ptr;
-
-      /* For a non-repeating ket, just continue at this level. This also
-      happens for a repeating ket if no characters were matched in the group.
-      This is the forcible breaking of infinite loops as implemented in Perl
-      5.005. If there is an options reset, it will get obeyed in the normal
-      course of events. */
-
-      if (*ecode == OP_KET || eptr == saved_eptr)
-        {
-        ecode += 3;
-        break;
-        }
-
-      /* The repeating kets try the rest of the pattern or restart from the
-      preceding bracket, in the appropriate order. We need to reset any options
-      that changed within the bracket before re-running it, so check the next
-      opcode. */
-
-      if (ecode[3] == OP_OPT)
-        {
-        ims = (ims & ~PCRE_IMS) | ecode[4];
-        DPRINTF(("ims set to %02lx at group repeat\n", ims));
-        }
-
-      if (*ecode == OP_KETRMIN)
-        {
-        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
-            match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
-              return TRUE;
-        }
-      else  /* OP_KETRMAX */
-        {
-        if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
-            match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
-        }
-      }
-    return FALSE;
-
-    /* An alternation is the end of a branch; scan along to find the end of the
-    bracketed group and go to there. */
-
-    case OP_ALT:
-    do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT);
-    break;
-
-    /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
-    that it may occur zero times. It may repeat infinitely, or not at all -
-    i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
-    repeat limits are compiled as a number of copies, with the optional ones
-    preceded by BRAZERO or BRAMINZERO. */
-
-    case OP_BRAZERO:
-      {
-      const uschar *next = ecode+1;
-      if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup))
-        return TRUE;
-      do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
-      ecode = next + 3;
-      }
-    break;
-
-    case OP_BRAMINZERO:
-      {
-      const uschar *next = ecode+1;
-      do next += (next[1] << 8) + next[2]; while (*next == OP_ALT);
-      if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup))
-        return TRUE;
-      ecode++;
-      }
-    break;
-
-    /* End of a group, repeated or non-repeating. If we are at the end of
-    an assertion "group", stop matching and return TRUE, but record the
-    current high water mark for use by positive assertions. Do this also
-    for the "once" (not-backup up) groups. */
-
-    case OP_KET:
-    case OP_KETRMIN:
-    case OP_KETRMAX:
-      {
-      const uschar *prev = ecode - (ecode[1] << 8) - ecode[2];
-      const uschar *saved_eptr = eptrb->saved_eptr;
-
-      eptrb = eptrb->prev;    /* Back up the stack of bracket start pointers */
-
-      if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
-          *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
-          *prev == OP_ONCE)
-        {
-        md->end_match_ptr = eptr;      /* For ONCE */
-        md->end_offset_top = offset_top;
-        return TRUE;
-        }
-
-      /* In all other cases except a conditional group we have to check the
-      group number back at the start and if necessary complete handling an
-      extraction by setting the offsets and bumping the high water mark. */
-
-      if (*prev != OP_COND)
-        {
-        int number = *prev - OP_BRA;
-        int offset = number << 1;
-
-#ifdef DEBUG
-        printf("end bracket %d", number);
-        printf("\n");
-#endif
-
-        if (number > 0)
-          {
-          if (offset >= md->offset_max) md->offset_overflow = TRUE; else
-            {
-            md->offset_vector[offset] =
-              md->offset_vector[md->offset_end - number];
-            md->offset_vector[offset+1] = eptr - md->start_subject;
-            if (offset_top <= offset) offset_top = offset + 2;
-            }
-          }
-        }
-
-      /* Reset the value of the ims flags, in case they got changed during
-      the group. */
-
-      ims = original_ims;
-      DPRINTF(("ims reset to %02lx\n", ims));
-
-      /* For a non-repeating ket, just continue at this level. This also
-      happens for a repeating ket if no characters were matched in the group.
-      This is the forcible breaking of infinite loops as implemented in Perl
-      5.005. If there is an options reset, it will get obeyed in the normal
-      course of events. */
-
-      if (*ecode == OP_KET || eptr == saved_eptr)
-        {
-        ecode += 3;
-        break;
-        }
-
-      /* The repeating kets try the rest of the pattern or restart from the
-      preceding bracket, in the appropriate order. */
-
-      if (*ecode == OP_KETRMIN)
-        {
-        if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) ||
-            match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup))
-              return TRUE;
-        }
-      else  /* OP_KETRMAX */
-        {
-        if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) ||
-            match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE;
-        }
-      }
-    return FALSE;
-
-    /* Start of subject unless notbol, or after internal newline if multiline */
-
-    case OP_CIRC:
-    if (md->notbol && eptr == md->start_subject) return FALSE;
-    if ((ims & PCRE_MULTILINE) != 0)
-      {
-      if (eptr != md->start_subject && eptr[-1] != '\n') return FALSE;
-      ecode++;
-      break;
-      }
-    /* ... else fall through */
-
-    /* Start of subject assertion */
-
-    case OP_SOD:
-    if (eptr != md->start_subject) return FALSE;
-    ecode++;
-    break;
-
-    /* Assert before internal newline if multiline, or before a terminating
-    newline unless endonly is set, else end of subject unless noteol is set. */
-
-    case OP_DOLL:
-    if ((ims & PCRE_MULTILINE) != 0)
-      {
-      if (eptr < md->end_subject) { if (*eptr != '\n') return FALSE; }
-        else { if (md->noteol) return FALSE; }
-      ecode++;
-      break;
-      }
-    else
-      {
-      if (md->noteol) return FALSE;
-      if (!md->endonly)
-        {
-        if (eptr < md->end_subject - 1 ||
-           (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE;
-
-        ecode++;
-        break;
-        }
-      }
-    /* ... else fall through */
-
-    /* End of subject assertion (\z) */
-
-    case OP_EOD:
-    if (eptr < md->end_subject) return FALSE;
-    ecode++;
-    break;
-
-    /* End of subject or ending \n assertion (\Z) */
-
-    case OP_EODN:
-    if (eptr < md->end_subject - 1 ||
-       (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE;
-    ecode++;
-    break;
-
-    /* Word boundary assertions */
-
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_WORD_BOUNDARY:
-      {
-      BOOL prev_is_word = (eptr != md->start_subject) &&
-        ((md->ctypes[eptr[-1]] & ctype_word) != 0);
-      BOOL cur_is_word = (eptr < md->end_subject) &&
-        ((md->ctypes[*eptr] & ctype_word) != 0);
-      if ((*ecode++ == OP_WORD_BOUNDARY)?
-           cur_is_word == prev_is_word : cur_is_word != prev_is_word)
-        return FALSE;
-      }
-    break;
-
-    /* Match a single character type; inline for speed */
-
-    case OP_ANY:
-    if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n')
-      return FALSE;
-    if (eptr++ >= md->end_subject) return FALSE;
-#ifdef SUPPORT_UTF8
-    if (md->utf8)
-      while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-#endif
-    ecode++;
-    break;
-
-    case OP_NOT_DIGIT:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_digit) != 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    case OP_DIGIT:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_digit) == 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    case OP_NOT_WHITESPACE:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_space) != 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    case OP_WHITESPACE:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_space) == 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    case OP_NOT_WORDCHAR:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_word) != 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    case OP_WORDCHAR:
-    if (eptr >= md->end_subject ||
-       (md->ctypes[*eptr++] & ctype_word) == 0)
-      return FALSE;
-    ecode++;
-    break;
-
-    /* Match a back reference, possibly repeatedly. Look past the end of the
-    item to see if there is repeat information following. The code is similar
-    to that for character classes, but repeated for efficiency. Then obey
-    similar code to character type repeats - written out again for speed.
-    However, if the referenced string is the empty string, always treat
-    it as matched, any number of times (otherwise there could be infinite
-    loops). */
-
-    case OP_REF:
-      {
-      int length;
-      int offset = ecode[1] << 1;                /* Doubled reference number */
-      ecode += 2;                                /* Advance past the item */
-
-      /* If the reference is unset, set the length to be longer than the amount
-      of subject left; this ensures that every attempt at a match fails. We
-      can't just fail here, because of the possibility of quantifiers with zero
-      minima. */
-
-      length = (offset >= offset_top || md->offset_vector[offset] < 0)?
-        md->end_subject - eptr + 1 :
-        md->offset_vector[offset+1] - md->offset_vector[offset];
-
-      /* Set up for repetition, or handle the non-repeated case */
-
-      switch (*ecode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        c = *ecode++ - OP_CRSTAR;
-        minimize = (c & 1) != 0;
-        min = rep_min[c];                 /* Pick up values from tables; */
-        max = rep_max[c];                 /* zero for max => infinity */
-        if (max == 0) max = INT_MAX;
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        minimize = (*ecode == OP_CRMINRANGE);
-        min = (ecode[1] << 8) + ecode[2];
-        max = (ecode[3] << 8) + ecode[4];
-        if (max == 0) max = INT_MAX;
-        ecode += 5;
-        break;
-
-        default:               /* No repeat follows */
-        if (!match_ref(offset, eptr, length, md, ims)) return FALSE;
-        eptr += length;
-        continue;              /* With the main loop */
-        }
-
-      /* If the length of the reference is zero, just continue with the
-      main loop. */
-
-      if (length == 0) continue;
-
-      /* First, ensure the minimum number of matches are present. We get back
-      the length of the reference string explicitly rather than passing the
-      address of eptr, so that eptr can be a register variable. */
-
-      for (i = 1; i <= min; i++)
-        {
-        if (!match_ref(offset, eptr, length, md, ims)) return FALSE;
-        eptr += length;
-        }
-
-      /* If min = max, continue at the same level without recursion.
-      They are not both allowed to be zero. */
-
-      if (min == max) continue;
-
-      /* If minimizing, keep trying and advancing the pointer */
-
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || !match_ref(offset, eptr, length, md, ims))
-            return FALSE;
-          eptr += length;
-          }
-        /* Control never gets here */
-        }
-
-      /* If maximizing, find the longest string and work backwards */
-
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (!match_ref(offset, eptr, length, md, ims)) break;
-          eptr += length;
-          }
-        while (eptr >= pp)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          eptr -= length;
-          }
-        return FALSE;
-        }
-      }
-    /* Control never gets here */
-
-
-
-    /* Match a character class, possibly repeatedly. Look past the end of the
-    item to see if there is repeat information following. Then obey similar
-    code to character type repeats - written out again for speed. */
-
-    case OP_CLASS:
-      {
-      const uschar *data = ecode + 1;  /* Save for matching */
-      ecode += 33;                     /* Advance past the item */
-
-      switch (*ecode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        c = *ecode++ - OP_CRSTAR;
-        minimize = (c & 1) != 0;
-        min = rep_min[c];                 /* Pick up values from tables; */
-        max = rep_max[c];                 /* zero for max => infinity */
-        if (max == 0) max = INT_MAX;
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        minimize = (*ecode == OP_CRMINRANGE);
-        min = (ecode[1] << 8) + ecode[2];
-        max = (ecode[3] << 8) + ecode[4];
-        if (max == 0) max = INT_MAX;
-        ecode += 5;
-        break;
-
-        default:               /* No repeat follows */
-        min = max = 1;
-        break;
-        }
-
-      /* First, ensure the minimum number of matches are present. */
-
-      for (i = 1; i <= min; i++)
-        {
-        if (eptr >= md->end_subject) return FALSE;
-        GETCHARINC(c, eptr)         /* Get character; increment eptr */
-
-#ifdef SUPPORT_UTF8
-        /* We do not yet support class members > 255 */
-        if (c > 255) return FALSE;
-#endif
-
-        if ((data[c/8] & (1 << (c&7))) != 0) continue;
-        return FALSE;
-        }
-
-      /* If max == min we can continue with the main loop without the
-      need to recurse. */
-
-      if (min == max) continue;
-
-      /* If minimizing, keep testing the rest of the expression and advancing
-      the pointer while it matches the class. */
-
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || eptr >= md->end_subject) return FALSE;
-          GETCHARINC(c, eptr)       /* Get character; increment eptr */
-
-#ifdef SUPPORT_UTF8
-          /* We do not yet support class members > 255 */
-          if (c > 255) return FALSE;
-#endif
-          if ((data[c/8] & (1 << (c&7))) != 0) continue;
-          return FALSE;
-          }
-        /* Control never gets here */
-        }
-
-      /* If maximizing, find the longest possible run, then work backwards. */
-
-      else
-        {
-        const uschar *pp = eptr;
-        int len = 1;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject) break;
-          GETCHARLEN(c, eptr, len)  /* Get character, set length if UTF-8 */
-
-#ifdef SUPPORT_UTF8
-          /* We do not yet support class members > 255 */
-          if (c > 255) break;
-#endif
-          if ((data[c/8] & (1 << (c&7))) == 0) break;
-          eptr += len;
-          }
-
-        while (eptr >= pp)
-          {
-          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-
-#ifdef SUPPORT_UTF8
-          BACKCHAR(eptr)
-#endif
-          }
-        return FALSE;
-        }
-      }
-    /* Control never gets here */
-
-    /* Match a run of characters */
-
-    case OP_CHARS:
-      {
-      register int length = ecode[1];
-      ecode += 2;
-
-#ifdef DEBUG    /* Sigh. Some compilers never learn. */
-      if (eptr >= md->end_subject)
-        printf("matching subject <null> against pattern ");
-      else
-        {
-        printf("matching subject ");
-        pchars(eptr, length, TRUE, md);
-        printf(" against pattern ");
-        }
-      pchars(ecode, length, FALSE, md);
-      printf("\n");
-#endif
-
-      if (length > md->end_subject - eptr) return FALSE;
-      if ((ims & PCRE_CASELESS) != 0)
-        {
-        while (length-- > 0)
-          if (md->lcc[*ecode++] != md->lcc[*eptr++])
-            return FALSE;
-        }
-      else
-        {
-        while (length-- > 0) if (*ecode++ != *eptr++) return FALSE;
-        }
-      }
-    break;
-
-    /* Match a single character repeatedly; different opcodes share code. */
-
-    case OP_EXACT:
-    min = max = (ecode[1] << 8) + ecode[2];
-    ecode += 3;
-    goto REPEATCHAR;
-
-    case OP_UPTO:
-    case OP_MINUPTO:
-    min = 0;
-    max = (ecode[1] << 8) + ecode[2];
-    minimize = *ecode == OP_MINUPTO;
-    ecode += 3;
-    goto REPEATCHAR;
-
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    c = *ecode++ - OP_STAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single-character matches. We can give
-    up quickly if there are fewer than the minimum number of characters left in
-    the subject. */
-
-    REPEATCHAR:
-    if (min > md->end_subject - eptr) return FALSE;
-    c = *ecode++;
-
-    /* The code is duplicated for the caseless and caseful cases, for speed,
-    since matching characters is likely to be quite common. First, ensure the
-    minimum number of matches are present. If min = max, continue at the same
-    level without recursing. Otherwise, if minimizing, keep trying the rest of
-    the expression and advancing one matching character if failing, up to the
-    maximum. Alternatively, if maximizing, find the maximum number of
-    characters and work backwards. */
-
-    DPRINTF(("matching %c{%d,%d} against subject %.*s\n", c, min, max,
-      max, eptr));
-
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-      c = md->lcc[c];
-      for (i = 1; i <= min; i++)
-        if (c != md->lcc[*eptr++]) return FALSE;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || eptr >= md->end_subject ||
-              c != md->lcc[*eptr++])
-            return FALSE;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c != md->lcc[*eptr]) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-        return FALSE;
-        }
-      /* Control never gets here */
-      }
-
-    /* Caseful comparisons */
-
-    else
-      {
-      for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c != *eptr) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-         if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-           return TRUE;
-        return FALSE;
-        }
-      }
-    /* Control never gets here */
-
-    /* Match a negated single character */
-
-    case OP_NOT:
-    if (eptr >= md->end_subject) return FALSE;
-    ecode++;
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-      if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE;
-      }
-    else
-      {
-      if (*ecode++ == *eptr++) return FALSE;
-      }
-    break;
-
-    /* Match a negated single character repeatedly. This is almost a repeat of
-    the code for a repeated single character, but I haven't found a nice way of
-    commoning these up that doesn't require a test of the positive/negative
-    option for each character match. Maybe that wouldn't add very much to the
-    time taken, but character matching *is* what this is all about... */
-
-    case OP_NOTEXACT:
-    min = max = (ecode[1] << 8) + ecode[2];
-    ecode += 3;
-    goto REPEATNOTCHAR;
-
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    min = 0;
-    max = (ecode[1] << 8) + ecode[2];
-    minimize = *ecode == OP_NOTMINUPTO;
-    ecode += 3;
-    goto REPEATNOTCHAR;
-
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    c = *ecode++ - OP_NOTSTAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single-character matches. We can give
-    up quickly if there are fewer than the minimum number of characters left in
-    the subject. */
-
-    REPEATNOTCHAR:
-    if (min > md->end_subject - eptr) return FALSE;
-    c = *ecode++;
-
-    /* The code is duplicated for the caseless and caseful cases, for speed,
-    since matching characters is likely to be quite common. First, ensure the
-    minimum number of matches are present. If min = max, continue at the same
-    level without recursing. Otherwise, if minimizing, keep trying the rest of
-    the expression and advancing one matching character if failing, up to the
-    maximum. Alternatively, if maximizing, find the maximum number of
-    characters and work backwards. */
-
-    DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", c, min, max,
-      max, eptr));
-
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-      c = md->lcc[c];
-      for (i = 1; i <= min; i++)
-        if (c == md->lcc[*eptr++]) return FALSE;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || eptr >= md->end_subject ||
-              c == md->lcc[*eptr++])
-            return FALSE;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c == md->lcc[*eptr]) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-          if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-        return FALSE;
-        }
-      /* Control never gets here */
-      }
-
-    /* Caseful comparisons */
-
-    else
-      {
-      for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if (match(eptr, ecode, offset_top, md, ims, eptrb, 0))
-            return TRUE;
-          if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c == *eptr) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-         if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-           return TRUE;
-        return FALSE;
-        }
-      }
-    /* Control never gets here */
-
-    /* Match a single character type repeatedly; several different opcodes
-    share code. This is very similar to the code for single characters, but we
-    repeat it in the interests of efficiency. */
-
-    case OP_TYPEEXACT:
-    min = max = (ecode[1] << 8) + ecode[2];
-    minimize = TRUE;
-    ecode += 3;
-    goto REPEATTYPE;
-
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    min = 0;
-    max = (ecode[1] << 8) + ecode[2];
-    minimize = *ecode == OP_TYPEMINUPTO;
-    ecode += 3;
-    goto REPEATTYPE;
-
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    c = *ecode++ - OP_TYPESTAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single character type matches */
-
-    REPEATTYPE:
-    ctype = *ecode++;      /* Code for the character type */
-
-    /* First, ensure the minimum number of matches are present. Use inline
-    code for maximizing the speed, and do the type test once at the start
-    (i.e. keep it out of the loop). Also we can test that there are at least
-    the minimum number of bytes before we start, except when doing '.' in
-    UTF8 mode. Leave the test in in all cases; in the special case we have
-    to test after each character. */
-
-    if (min > md->end_subject - eptr) return FALSE;
-    if (min > 0) switch(ctype)
-      {
-      case OP_ANY:
-#ifdef SUPPORT_UTF8
-      if (md->utf8)
-        {
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             (*eptr++ == '\n' && (ims & PCRE_DOTALL) == 0))
-            return FALSE;
-          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-          }
-        break;
-        }
-#endif
-      /* Non-UTF8 can be faster */
-      if ((ims & PCRE_DOTALL) == 0)
-        { for (i = 1; i <= min; i++) if (*eptr++ == '\n') return FALSE; }
-      else eptr += min;
-      break;
-
-      case OP_NOT_DIGIT:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE;
-      break;
-
-      case OP_DIGIT:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE;
-      break;
-
-      case OP_NOT_WHITESPACE:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_space) != 0) return FALSE;
-      break;
-
-      case OP_WHITESPACE:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_space) == 0) return FALSE;
-      break;
-
-      case OP_NOT_WORDCHAR:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_word) != 0)
-          return FALSE;
-      break;
-
-      case OP_WORDCHAR:
-      for (i = 1; i <= min; i++)
-        if ((md->ctypes[*eptr++] & ctype_word) == 0)
-          return FALSE;
-      break;
-      }
-
-    /* If min = max, continue at the same level without recursing */
-
-    if (min == max) continue;
-
-    /* If minimizing, we have to test the rest of the pattern before each
-    subsequent match. */
-
-    if (minimize)
-      {
-      for (i = min;; i++)
-        {
-        if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE;
-        if (i >= max || eptr >= md->end_subject) return FALSE;
-
-        c = *eptr++;
-        switch(ctype)
-          {
-          case OP_ANY:
-          if ((ims & PCRE_DOTALL) == 0 && c == '\n') return FALSE;
-#ifdef SUPPORT_UTF8
-          if (md->utf8)
-            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-#endif
-          break;
-
-          case OP_NOT_DIGIT:
-          if ((md->ctypes[c] & ctype_digit) != 0) return FALSE;
-          break;
-
-          case OP_DIGIT:
-          if ((md->ctypes[c] & ctype_digit) == 0) return FALSE;
-          break;
-
-          case OP_NOT_WHITESPACE:
-          if ((md->ctypes[c] & ctype_space) != 0) return FALSE;
-          break;
-
-          case OP_WHITESPACE:
-          if  ((md->ctypes[c] & ctype_space) == 0) return FALSE;
-          break;
-
-          case OP_NOT_WORDCHAR:
-          if ((md->ctypes[c] & ctype_word) != 0) return FALSE;
-          break;
-
-          case OP_WORDCHAR:
-          if ((md->ctypes[c] & ctype_word) == 0) return FALSE;
-          break;
-          }
-        }
-      /* Control never gets here */
-      }
-
-    /* If maximizing it is worth using inline code for speed, doing the type
-    test once at the start (i.e. keep it out of the loop). */
-
-    else
-      {
-      const uschar *pp = eptr;
-      switch(ctype)
-        {
-        case OP_ANY:
-
-        /* Special code is required for UTF8, but when the maximum is unlimited
-        we don't need it. */
-
-#ifdef SUPPORT_UTF8
-        if (md->utf8 && max < INT_MAX)
-          {
-          if ((ims & PCRE_DOTALL) == 0)
-            {
-            for (i = min; i < max; i++)
-              {
-              if (eptr >= md->end_subject || *eptr++ == '\n') break;
-              while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-              }
-            }
-          else
-            {
-            for (i = min; i < max; i++)
-              {
-              eptr++;
-              while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-              }
-            }
-          break;
-          }
-#endif
-        /* Non-UTF8 can be faster */
-        if ((ims & PCRE_DOTALL) == 0)
-          {
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || *eptr == '\n') break;
-            eptr++;
-            }
-          }
-        else
-          {
-          c = max - min;
-          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
-          eptr += c;
-          }
-        break;
-
-        case OP_NOT_DIGIT:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
-            break;
-          eptr++;
-          }
-        break;
-
-        case OP_DIGIT:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
-            break;
-          eptr++;
-          }
-        break;
-
-        case OP_NOT_WHITESPACE:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
-            break;
-          eptr++;
-          }
-        break;
-
-        case OP_WHITESPACE:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
-            break;
-          eptr++;
-          }
-        break;
-
-        case OP_NOT_WORDCHAR:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
-            break;
-          eptr++;
-          }
-        break;
-
-        case OP_WORDCHAR:
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
-            break;
-          eptr++;
-          }
-        break;
-        }
-
-      while (eptr >= pp)
-        {
-        if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0))
-          return TRUE;
-#ifdef SUPPORT_UTF8
-        if (md->utf8)
-          while (eptr > pp && (*eptr & 0xc0) == 0x80) eptr--;
-#endif
-        }
-      return FALSE;
-      }
-    /* Control never gets here */
-
-    /* There's been some horrible disaster. */
-
-    default:
-    DPRINTF(("Unknown opcode %d\n", *ecode));
-    md->errorcode = PCRE_ERROR_UNKNOWN_NODE;
-    return FALSE;
-    }
-
-  /* Do not stick any code in here without much thought; it is assumed
-  that "continue" in the code above comes out to here to repeat the main
-  loop. */
-
-  }             /* End of main loop */
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*         Execute a Regular Expression           *
-*************************************************/
-
-/* This function applies a compiled re to a subject string and picks out
-portions of the string if it matches. Two elements in the vector are set for
-each substring: the offsets to the start and end of the substring.
-
-Arguments:
-  external_re     points to the compiled expression
-  external_extra  points to "hints" from pcre_study() or is NULL
-  subject         points to the subject string
-  length          length of subject string (may contain binary zeros)
-  start_offset    where to start in the subject string
-  options         option bits
-  offsets         points to a vector of ints to be filled in with offsets
-  offsetcount     the number of elements in the vector
-
-Returns:          > 0 => success; value is the number of elements filled in
-                  = 0 => success, but offsets is not big enough
-                   -1 => failed to match
-                 < -1 => some kind of unexpected problem
-*/
-
-int
-pcre_exec(const pcre *external_re, const pcre_extra *external_extra,
-  const char *subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount)
-{
-int resetcount, ocount;
-int first_char = -1;
-int req_char = -1;
-int req_char2 = -1;
-unsigned long int ims = 0;
-match_data match_block;
-const uschar *start_bits = NULL;
-const uschar *start_match = (const uschar *)subject + start_offset;
-const uschar *end_subject;
-const uschar *req_char_ptr = start_match - 1;
-const real_pcre *re = (const real_pcre *)external_re;
-const real_pcre_extra *extra = (const real_pcre_extra *)external_extra;
-BOOL using_temporary_offsets = FALSE;
-BOOL anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
-BOOL startline = (re->options & PCRE_STARTLINE) != 0;
-
-if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
-
-if (re == NULL || subject == NULL ||
-   (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-match_block.start_pattern = re->code;
-match_block.start_subject = (const uschar *)subject;
-match_block.end_subject = match_block.start_subject + length;
-end_subject = match_block.end_subject;
-
-match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
-match_block.utf8 = (re->options & PCRE_UTF8) != 0;
-
-match_block.notbol = (options & PCRE_NOTBOL) != 0;
-match_block.noteol = (options & PCRE_NOTEOL) != 0;
-match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
-
-match_block.errorcode = PCRE_ERROR_NOMATCH;     /* Default error */
-
-match_block.lcc = re->tables + lcc_offset;
-match_block.ctypes = re->tables + ctypes_offset;
-
-/* The ims options can vary during the matching as a result of the presence
-of (?ims) items in the pattern. They are kept in a local variable so that
-restoring at the exit of a group is easy. */
-
-ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
-
-/* If the expression has got more back references than the offsets supplied can
-hold, we get a temporary bit of working store to use during the matching.
-Otherwise, we can use the vector supplied, rounding down its size to a multiple
-of 3. */
-
-ocount = offsetcount - (offsetcount % 3);
-
-if (re->top_backref > 0 && re->top_backref >= ocount/3)
-  {
-  ocount = re->top_backref * 3 + 3;
-  match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
-  if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
-  using_temporary_offsets = TRUE;
-  DPRINTF(("Got memory to hold back references\n"));
-  }
-else match_block.offset_vector = offsets;
-
-match_block.offset_end = ocount;
-match_block.offset_max = (2*ocount)/3;
-match_block.offset_overflow = FALSE;
-
-/* Compute the minimum number of offsets that we need to reset each time. Doing
-this makes a huge difference to execution time when there aren't many brackets
-in the pattern. */
-
-resetcount = 2 + re->top_bracket * 2;
-if (resetcount > offsetcount) resetcount = ocount;
-
-/* Reset the working variable associated with each extraction. These should
-never be used unless previously set, but they get saved and restored, and so we
-initialize them to avoid reading uninitialized locations. */
-
-if (match_block.offset_vector != NULL)
-  {
-  register int *iptr = match_block.offset_vector + ocount;
-  register int *iend = iptr - resetcount/2 + 1;
-  while (--iptr >= iend) *iptr = -1;
-  }
-
-/* Set up the first character to match, if available. The first_char value is
-never set for an anchored regular expression, but the anchoring may be forced
-at run time, so we have to test for anchoring. The first char may be unset for
-an unanchored pattern, of course. If there's no first char and the pattern was
-studied, there may be a bitmap of possible first characters. */
-
-if (!anchored)
-  {
-  if ((re->options & PCRE_FIRSTSET) != 0)
-    {
-    first_char = re->first_char;
-    if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char];
-    }
-  else
-    if (!startline && extra != NULL &&
-      (extra->options & PCRE_STUDY_MAPPED) != 0)
-        start_bits = extra->start_bits;
-  }
-
-/* For anchored or unanchored matches, there may be a "last known required
-character" set. If the PCRE_CASELESS is set, implying that the match starts
-caselessly, or if there are any changes of this flag within the regex, set up
-both cases of the character. Otherwise set the two values the same, which will
-avoid duplicate testing (which takes significant time). This covers the vast
-majority of cases. It will be suboptimal when the case flag changes in a regex
-and the required character in fact is caseful. */
-
-if ((re->options & PCRE_REQCHSET) != 0)
-  {
-  req_char = re->req_char;
-  req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)?
-    (re->tables + fcc_offset)[req_char] : req_char;
-  }
-
-/* Loop for handling unanchored repeated matching attempts; for anchored regexs
-the loop runs just once. */
-
-do
-  {
-  int rc;
-  register int *iptr = match_block.offset_vector;
-  register int *iend = iptr + resetcount;
-
-  /* Reset the maximum number of extractions we might see. */
-
-  while (iptr < iend) *iptr++ = -1;
-
-  /* Advance to a unique first char if possible */
-
-  if (first_char >= 0)
-    {
-    if ((ims & PCRE_CASELESS) != 0)
-      while (start_match < end_subject &&
-             match_block.lcc[*start_match] != first_char)
-        start_match++;
-    else
-      while (start_match < end_subject && *start_match != first_char)
-        start_match++;
-    }
-
-  /* Or to just after \n for a multiline match if possible */
-
-  else if (startline)
-    {
-    if (start_match > match_block.start_subject + start_offset)
-      {
-      while (start_match < end_subject && start_match[-1] != '\n')
-        start_match++;
-      }
-    }
-
-  /* Or to a non-unique first char after study */
-
-  else if (start_bits != NULL)
-    {
-    while (start_match < end_subject)
-      {
-      register int c = *start_match;
-      if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
-      }
-    }
-
-#ifdef DEBUG  /* Sigh. Some compilers never learn. */
-  printf(">>>> Match against: ");
-  pchars(start_match, end_subject - start_match, TRUE, &match_block);
-  printf("\n");
-#endif
-
-  /* If req_char is set, we know that that character must appear in the subject
-  for the match to succeed. If the first character is set, req_char must be
-  later in the subject; otherwise the test starts at the match point. This
-  optimization can save a huge amount of backtracking in patterns with nested
-  unlimited repeats that aren't going to match. We don't know what the state of
-  case matching may be when this character is hit, so test for it in both its
-  cases if necessary. However, the different cased versions will not be set up
-  unless PCRE_CASELESS was given or the casing state changes within the regex.
-  Writing separate code makes it go faster, as does using an autoincrement and
-  backing off on a match. */
-
-  if (req_char >= 0)
-    {
-    register const uschar *p = start_match + ((first_char >= 0)? 1 : 0);
-
-    /* We don't need to repeat the search if we haven't yet reached the
-    place we found it at last time. */
-
-    if (p > req_char_ptr)
-      {
-      /* Do a single test if no case difference is set up */
-
-      if (req_char == req_char2)
-        {
-        while (p < end_subject)
-          {
-          if (*p++ == req_char) { p--; break; }
-          }
-        }
-
-      /* Otherwise test for either case */
-
-      else
-        {
-        while (p < end_subject)
-          {
-          register int pp = *p++;
-          if (pp == req_char || pp == req_char2) { p--; break; }
-          }
-        }
-
-      /* If we can't find the required character, break the matching loop */
-
-      if (p >= end_subject) break;
-
-      /* If we have found the required character, save the point where we
-      found it, so that we don't search again next time round the loop if
-      the start hasn't passed this character yet. */
-
-      req_char_ptr = p;
-      }
-    }
-
-  /* When a match occurs, substrings will be set for all internal extractions;
-  we just need to set up the whole thing as substring 0 before returning. If
-  there were too many extractions, set the return code to zero. In the case
-  where we had to get some local store to hold offsets for backreferences, copy
-  those back references that we can. In this case there need not be overflow
-  if certain parts of the pattern were not used. */
-
-  match_block.start_match = start_match;
-  if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup))
-    continue;
-
-  /* Copy the offset information from temporary store if necessary */
-
-  if (using_temporary_offsets)
-    {
-    if (offsetcount >= 4)
-      {
-      memcpy(offsets + 2, match_block.offset_vector + 2,
-        (offsetcount - 2) * sizeof(int));
-      DPRINTF(("Copied offsets from temporary memory\n"));
-      }
-    if (match_block.end_offset_top > offsetcount)
-      match_block.offset_overflow = TRUE;
-
-    DPRINTF(("Freeing temporary memory\n"));
-    (pcre_free)(match_block.offset_vector);
-    }
-
-  rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2;
-
-  if (match_block.offset_end < 2) rc = 0; else
-    {
-    offsets[0] = start_match - match_block.start_subject;
-    offsets[1] = match_block.end_match_ptr - match_block.start_subject;
-    }
-
-  DPRINTF((">>>> returning %d\n", rc));
-  return rc;
-  }
-
-/* This "while" is the end of the "do" above */
-
-while (!anchored &&
-       match_block.errorcode == PCRE_ERROR_NOMATCH &&
-       start_match++ < end_subject);
-
-if (using_temporary_offsets)
-  {
-  DPRINTF(("Freeing temporary memory\n"));
-  (pcre_free)(match_block.offset_vector);
-  }
-
-DPRINTF((">>>> returning %d\n", match_block.errorcode));
-
-return match_block.errorcode;
-}
-
-/* End of pcre.c */
diff --git a/pcre/pcre.def b/pcre/pcre.def
deleted file mode 100644 (file)
index 0e8cf3f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-EXPORTS
-
-pcre_malloc DATA
-pcre_free DATA
-
-pcre_compile
-pcre_copy_substring
-pcre_exec
-pcre_get_substring
-pcre_get_substring_list
-pcre_info
-pcre_maketables
-pcre_study
-pcre_version
-
-regcomp
-regexec
-regerror
-regfree
diff --git a/pcre/pcre.h b/pcre/pcre.h
deleted file mode 100644 (file)
index d27ba85..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR 3
-#define PCRE_MINOR 4
-#define PCRE_DATE  22-Aug-2000
-
-/* Win32 uses DLL by default */
-
-#ifdef _WIN32
-# ifdef STATIC_PCRE
-#  define PCRE_DL_IMPORT
-# else
-#  define PCRE_DL_IMPORT __declspec(dllimport)
-# endif
-#else
-# define PCRE_DL_IMPORT
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS        0x0001
-#define PCRE_MULTILINE       0x0002
-#define PCRE_DOTALL          0x0004
-#define PCRE_EXTENDED        0x0008
-#define PCRE_ANCHORED        0x0010
-#define PCRE_DOLLAR_ENDONLY  0x0020
-#define PCRE_EXTRA           0x0040
-#define PCRE_NOTBOL          0x0080
-#define PCRE_NOTEOL          0x0100
-#define PCRE_UNGREEDY        0x0200
-#define PCRE_NOTEMPTY        0x0400
-#define PCRE_UTF8            0x0800
-
-/* Exec-time and get-time error codes */
-
-#define PCRE_ERROR_NOMATCH        (-1)
-#define PCRE_ERROR_NULL           (-2)
-#define PCRE_ERROR_BADOPTION      (-3)
-#define PCRE_ERROR_BADMAGIC       (-4)
-#define PCRE_ERROR_UNKNOWN_NODE   (-5)
-#define PCRE_ERROR_NOMEMORY       (-6)
-#define PCRE_ERROR_NOSUBSTRING    (-7)
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS         0
-#define PCRE_INFO_SIZE            1
-#define PCRE_INFO_CAPTURECOUNT    2
-#define PCRE_INFO_BACKREFMAX      3
-#define PCRE_INFO_FIRSTCHAR       4
-#define PCRE_INFO_FIRSTTABLE      5
-#define PCRE_INFO_LASTLITERAL     6
-
-/* Types */
-
-typedef void pcre;
-typedef void pcre_extra;
-
-/* Store get and free functions. These can be set to alternative malloc/free
-functions if required. Some magic is required for Win32 DLL; it is null on
-other OS. */
-
-PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t);
-PCRE_DL_IMPORT extern void  (*pcre_free)(void *);
-
-#undef PCRE_DL_IMPORT
-
-/* Functions */
-
-extern pcre *pcre_compile(const char *, int, const char **, int *,
-              const unsigned char *);
-extern int  pcre_copy_substring(const char *, int *, int, int, char *, int);
-extern int  pcre_exec(const pcre *, const pcre_extra *, const char *,
-              int, int, int, int *, int);
-extern void pcre_free_substring(const char *);
-extern void pcre_free_substring_list(const char **);
-extern int  pcre_get_substring(const char *, int *, int, int, const char **);
-extern int  pcre_get_substring_list(const char *, int *, int, const char ***);
-extern int  pcre_info(const pcre *, int *, int *);
-extern int  pcre_fullinfo(const pcre *, const pcre_extra *, int, void *);
-extern unsigned const char *pcre_maketables(void);
-extern pcre_extra *pcre_study(const pcre *, int, const char **);
-extern const char *pcre_version(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff --git a/pcre/pcre.in b/pcre/pcre.in
deleted file mode 100644 (file)
index d698f40..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR @PCRE_MAJOR@
-#define PCRE_MINOR @PCRE_MINOR@
-#define PCRE_DATE  @PCRE_DATE@
-
-/* Win32 uses DLL by default */
-
-#ifdef _WIN32
-# ifdef STATIC_PCRE
-#  define PCRE_DL_IMPORT
-# else
-#  define PCRE_DL_IMPORT __declspec(dllimport)
-# endif
-#else
-# define PCRE_DL_IMPORT
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS        0x0001
-#define PCRE_MULTILINE       0x0002
-#define PCRE_DOTALL          0x0004
-#define PCRE_EXTENDED        0x0008
-#define PCRE_ANCHORED        0x0010
-#define PCRE_DOLLAR_ENDONLY  0x0020
-#define PCRE_EXTRA           0x0040
-#define PCRE_NOTBOL          0x0080
-#define PCRE_NOTEOL          0x0100
-#define PCRE_UNGREEDY        0x0200
-#define PCRE_NOTEMPTY        0x0400
-#define PCRE_UTF8            0x0800
-
-/* Exec-time and get-time error codes */
-
-#define PCRE_ERROR_NOMATCH        (-1)
-#define PCRE_ERROR_NULL           (-2)
-#define PCRE_ERROR_BADOPTION      (-3)
-#define PCRE_ERROR_BADMAGIC       (-4)
-#define PCRE_ERROR_UNKNOWN_NODE   (-5)
-#define PCRE_ERROR_NOMEMORY       (-6)
-#define PCRE_ERROR_NOSUBSTRING    (-7)
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS         0
-#define PCRE_INFO_SIZE            1
-#define PCRE_INFO_CAPTURECOUNT    2
-#define PCRE_INFO_BACKREFMAX      3
-#define PCRE_INFO_FIRSTCHAR       4
-#define PCRE_INFO_FIRSTTABLE      5
-#define PCRE_INFO_LASTLITERAL     6
-
-/* Types */
-
-typedef void pcre;
-typedef void pcre_extra;
-
-/* Store get and free functions. These can be set to alternative malloc/free
-functions if required. Some magic is required for Win32 DLL; it is null on
-other OS. */
-
-PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t);
-PCRE_DL_IMPORT extern void  (*pcre_free)(void *);
-
-#undef PCRE_DL_IMPORT
-
-/* Functions */
-
-extern pcre *pcre_compile(const char *, int, const char **, int *,
-              const unsigned char *);
-extern int  pcre_copy_substring(const char *, int *, int, int, char *, int);
-extern int  pcre_exec(const pcre *, const pcre_extra *, const char *,
-              int, int, int, int *, int);
-extern void pcre_free_substring(const char *);
-extern void pcre_free_substring_list(const char **);
-extern int  pcre_get_substring(const char *, int *, int, int, const char **);
-extern int  pcre_get_substring_list(const char *, int *, int, const char ***);
-extern int  pcre_info(const pcre *, int *, int *);
-extern int  pcre_fullinfo(const pcre *, const pcre_extra *, int, void *);
-extern unsigned const char *pcre_maketables(void);
-extern pcre_extra *pcre_study(const pcre *, int, const char **);
-extern const char *pcre_version(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff --git a/pcre/pcregrep.c b/pcre/pcregrep.c
deleted file mode 100644 (file)
index e8c934e..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-/*************************************************
-*               pcregrep program                 *
-*************************************************/
-
-/* This is a grep program that uses the PCRE regular expression library to do
-its pattern matching. */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "config.h"
-#include "pcre.h"
-
-#define FALSE 0
-#define TRUE 1
-
-typedef int BOOL;
-
-
-
-/*************************************************
-*               Global variables                 *
-*************************************************/
-
-static pcre *pattern;
-static pcre_extra *hints;
-
-static BOOL count_only = FALSE;
-static BOOL filenames_only = FALSE;
-static BOOL invert = FALSE;
-static BOOL number = FALSE;
-static BOOL silent = FALSE;
-static BOOL whole_lines = FALSE;
-
-
-
-#if ! HAVE_STRERROR
-/*************************************************
-*     Provide strerror() for non-ANSI libraries  *
-*************************************************/
-
-/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
-in their libraries, but can provide the same facility by this simple
-alternative function. */
-
-extern int   sys_nerr;
-extern char *sys_errlist[];
-
-char *
-strerror(int n)
-{
-if (n < 0 || n >= sys_nerr) return "unknown error number";
-return sys_errlist[n];
-}
-#endif /* HAVE_STRERROR */
-
-
-
-/*************************************************
-*              Grep an individual file           *
-*************************************************/
-
-static int
-pcregrep(FILE *in, char *name)
-{
-int rc = 1;
-int linenumber = 0;
-int count = 0;
-int offsets[99];
-char buffer[BUFSIZ];
-
-while (fgets(buffer, sizeof(buffer), in) != NULL)
-  {
-  BOOL match;
-  int length = (int)strlen(buffer);
-  if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
-  linenumber++;
-
-  match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0;
-  if (match && whole_lines && offsets[1] != length) match = FALSE;
-
-  if (match != invert)
-    {
-    if (count_only) count++;
-
-    else if (filenames_only)
-      {
-      fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name);
-      return 0;
-      }
-
-    else if (silent) return 0;
-
-    else
-      {
-      if (name != NULL) fprintf(stdout, "%s:", name);
-      if (number) fprintf(stdout, "%d:", linenumber);
-      fprintf(stdout, "%s\n", buffer);
-      }
-
-    rc = 0;
-    }
-  }
-
-if (count_only)
-  {
-  if (name != NULL) fprintf(stdout, "%s:", name);
-  fprintf(stdout, "%d\n", count);
-  }
-
-return rc;
-}
-
-
-
-
-/*************************************************
-*                Usage function                  *
-*************************************************/
-
-static int
-usage(int rc)
-{
-fprintf(stderr, "Usage: pcregrep [-Vchilnsvx] pattern [file] ...\n");
-return rc;
-}
-
-
-
-
-/*************************************************
-*                Main program                    *
-*************************************************/
-
-int
-main(int argc, char **argv)
-{
-int i;
-int rc = 1;
-int options = 0;
-int errptr;
-const char *error;
-BOOL filenames = TRUE;
-
-/* Process the options */
-
-for (i = 1; i < argc; i++)
-  {
-  char *s;
-  if (argv[i][0] != '-') break;
-  s = argv[i] + 1;
-  while (*s != 0)
-    {
-    switch (*s++)
-      {
-      case 'c': count_only = TRUE; break;
-      case 'h': filenames = FALSE; break;
-      case 'i': options |= PCRE_CASELESS; break;
-      case 'l': filenames_only = TRUE;
-      case 'n': number = TRUE; break;
-      case 's': silent = TRUE; break;
-      case 'v': invert = TRUE; break;
-      case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
-
-      case 'V':
-      fprintf(stderr, "PCRE version %s\n", pcre_version());
-      break;
-
-      default:
-      fprintf(stderr, "pcregrep: unknown option %c\n", s[-1]);
-      return usage(2);
-      }
-    }
-  }
-
-/* There must be at least a regexp argument */
-
-if (i >= argc) return usage(0);
-
-/* Compile the regular expression. */
-
-pattern = pcre_compile(argv[i++], options, &error, &errptr, NULL);
-if (pattern == NULL)
-  {
-  fprintf(stderr, "pcregrep: error in regex at offset %d: %s\n", errptr, error);
-  return 2;
-  }
-
-/* Study the regular expression, as we will be running it may times */
-
-hints = pcre_study(pattern, 0, &error);
-if (error != NULL)
-  {
-  fprintf(stderr, "pcregrep: error while studing regex: %s\n", error);
-  return 2;
-  }
-
-/* If there are no further arguments, do the business on stdin and exit */
-
-if (i >= argc) return pcregrep(stdin, NULL);
-
-/* Otherwise, work through the remaining arguments as files. If there is only
-one, don't give its name on the output. */
-
-if (i == argc - 1) filenames = FALSE;
-if (filenames_only) filenames = TRUE;
-
-for (; i < argc; i++)
-  {
-  FILE *in = fopen(argv[i], "r");
-  if (in == NULL)
-    {
-    fprintf(stderr, "%s: failed to open: %s\n", argv[i], strerror(errno));
-    rc = 2;
-    }
-  else
-    {
-    int frc = pcregrep(in, filenames? argv[i] : NULL);
-    if (frc == 0 && rc == 1) rc = 0;
-    fclose(in);
-    }
-  }
-
-return rc;
-}
-
-/* End */
diff --git a/pcre/pcreposix.c b/pcre/pcreposix.c
deleted file mode 100644 (file)
index 519d2dd..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-This module is a wrapper that provides a POSIX API to the underlying PCRE
-functions.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-#include "internal.h"
-#include "pcreposix.h"
-#include "stdlib.h"
-
-
-
-/* Corresponding tables of PCRE error messages and POSIX error codes. */
-
-static const char *estring[] = {
-  ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,  ERR10,
-  ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,
-  ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,
-  ERR31 };
-
-static int eint[] = {
-  REG_EESCAPE, /* "\\ at end of pattern" */
-  REG_EESCAPE, /* "\\c at end of pattern" */
-  REG_EESCAPE, /* "unrecognized character follows \\" */
-  REG_BADBR,   /* "numbers out of order in {} quantifier" */
-  REG_BADBR,   /* "number too big in {} quantifier" */
-  REG_EBRACK,  /* "missing terminating ] for character class" */
-  REG_ECTYPE,  /* "invalid escape sequence in character class" */
-  REG_ERANGE,  /* "range out of order in character class" */
-  REG_BADRPT,  /* "nothing to repeat" */
-  REG_BADRPT,  /* "operand of unlimited repeat could match the empty string" */
-  REG_ASSERT,  /* "internal error: unexpected repeat" */
-  REG_BADPAT,  /* "unrecognized character after (?" */
-  REG_ESIZE,   /* "too many capturing parenthesized sub-patterns" */
-  REG_EPAREN,  /* "missing )" */
-  REG_ESUBREG, /* "back reference to non-existent subpattern" */
-  REG_INVARG,  /* "erroffset passed as NULL" */
-  REG_INVARG,  /* "unknown option bit(s) set" */
-  REG_EPAREN,  /* "missing ) after comment" */
-  REG_ESIZE,   /* "too many sets of parentheses" */
-  REG_ESIZE,   /* "regular expression too large" */
-  REG_ESPACE,  /* "failed to get memory" */
-  REG_EPAREN,  /* "unmatched brackets" */
-  REG_ASSERT,  /* "internal error: code overflow" */
-  REG_BADPAT,  /* "unrecognized character after (?<" */
-  REG_BADPAT,  /* "lookbehind assertion is not fixed length" */
-  REG_BADPAT,  /* "malformed number after (?(" */
-  REG_BADPAT,  /* "conditional group containe more than two branches" */
-  REG_BADPAT,  /* "assertion expected after (?(" */
-  REG_BADPAT,  /* "(?p must be followed by )" */
-  REG_ECTYPE,  /* "unknown POSIX class name" */
-  REG_BADPAT,  /* "POSIX collating elements are not supported" */
-  REG_INVARG,  /* "this version of PCRE is not compiled with PCRE_UTF8 support" */
-  REG_BADPAT,  /* "characters with values > 255 are not yet supported in classes" */
-  REG_BADPAT,  /* "character value in \x{...} sequence is too large" */
-  REG_BADPAT   /* "invalid condition (?(0)" */
-};
-
-/* Table of texts corresponding to POSIX error codes */
-
-static const char *pstring[] = {
-  "",                                /* Dummy for value 0 */
-  "internal error",                  /* REG_ASSERT */
-  "invalid repeat counts in {}",     /* BADBR      */
-  "pattern error",                   /* BADPAT     */
-  "? * + invalid",                   /* BADRPT     */
-  "unbalanced {}",                   /* EBRACE     */
-  "unbalanced []",                   /* EBRACK     */
-  "collation error - not relevant",  /* ECOLLATE   */
-  "bad class",                       /* ECTYPE     */
-  "bad escape sequence",             /* EESCAPE    */
-  "empty expression",                /* EMPTY      */
-  "unbalanced ()",                   /* EPAREN     */
-  "bad range inside []",             /* ERANGE     */
-  "expression too big",              /* ESIZE      */
-  "failed to get memory",            /* ESPACE     */
-  "bad back reference",              /* ESUBREG    */
-  "bad argument",                    /* INVARG     */
-  "match failed"                     /* NOMATCH    */
-};
-
-
-
-
-/*************************************************
-*          Translate PCRE text code to int       *
-*************************************************/
-
-/* PCRE compile-time errors are given as strings defined as macros. We can just
-look them up in a table to turn them into POSIX-style error codes. */
-
-static int
-pcre_posix_error_code(const char *s)
-{
-size_t i;
-for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
-  if (strcmp(s, estring[i]) == 0) return eint[i];
-return REG_ASSERT;
-}
-
-
-
-/*************************************************
-*          Translate error code to string        *
-*************************************************/
-
-size_t
-regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
-{
-const char *message, *addmessage;
-size_t length, addlength;
-
-message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
-  "unknown error code" : pstring[errcode];
-length = strlen(message) + 1;
-
-addmessage = " at offset ";
-addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
-  strlen(addmessage) + 6 : 0;
-
-if (errbuf_size > 0)
-  {
-  if (addlength > 0 && errbuf_size >= length + addlength)
-    sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
-  else
-    {
-    strncpy(errbuf, message, errbuf_size - 1);
-    errbuf[errbuf_size-1] = 0;
-    }
-  }
-
-return length + addlength;
-}
-
-
-
-
-/*************************************************
-*           Free store held by a regex           *
-*************************************************/
-
-void
-regfree(regex_t *preg)
-{
-(pcre_free)(preg->re_pcre);
-}
-
-
-
-
-/*************************************************
-*            Compile a regular expression        *
-*************************************************/
-
-/*
-Arguments:
-  preg        points to a structure for recording the compiled expression
-  pattern     the pattern to compile
-  cflags      compilation flags
-
-Returns:      0 on success
-              various non-zero codes on failure
-*/
-
-int
-regcomp(regex_t *preg, const char *pattern, int cflags)
-{
-const char *errorptr;
-int erroffset;
-int options = 0;
-
-if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
-if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
-
-preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
-preg->re_erroffset = erroffset;
-
-if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);
-
-preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL);
-return 0;
-}
-
-
-
-
-/*************************************************
-*              Match a regular expression        *
-*************************************************/
-
-/* Unfortunately, PCRE requires 3 ints of working space for each captured
-substring, so we have to get and release working store instead of just using
-the POSIX structures as was done in earlier releases when PCRE needed only 2
-ints. */
-
-int
-regexec(regex_t *preg, const char *string, size_t nmatch,
-  regmatch_t pmatch[], int eflags)
-{
-int rc;
-int options = 0;
-int *ovector = NULL;
-
-if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
-if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
-
-preg->re_erroffset = (size_t)(-1);   /* Only has meaning after compile */
-
-if (nmatch > 0)
-  {
-  ovector = (int *)malloc(sizeof(int) * nmatch * 3);
-  if (ovector == NULL) return REG_ESPACE;
-  }
-
-rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options,
-  ovector, nmatch * 3);
-
-if (rc == 0) rc = nmatch;    /* All captured slots were filled in */
-
-if (rc >= 0)
-  {
-  size_t i;
-  for (i = 0; i < (size_t)rc; i++)
-    {
-    pmatch[i].rm_so = ovector[i*2];
-    pmatch[i].rm_eo = ovector[i*2+1];
-    }
-  if (ovector != NULL) free(ovector);
-  for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
-  return 0;
-  }
-
-else
-  {
-  if (ovector != NULL) free(ovector);
-  switch(rc)
-    {
-    case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
-    case PCRE_ERROR_NULL: return REG_INVARG;
-    case PCRE_ERROR_BADOPTION: return REG_INVARG;
-    case PCRE_ERROR_BADMAGIC: return REG_INVARG;
-    case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
-    case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
-    default: return REG_ASSERT;
-    }
-  }
-}
-
-/* End of pcreposix.c */
diff --git a/pcre/pcreposix.h b/pcre/pcreposix.h
deleted file mode 100644 (file)
index 7660acb..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* Copyright (c) 1997-2000 University of Cambridge */
-
-#ifndef _PCREPOSIX_H
-#define _PCREPOSIX_H
-
-/* This is the header for the POSIX wrapper interface to the PCRE Perl-
-Compatible Regular Expression library. It defines the things POSIX says should
-be there. I hope. */
-
-/* Have to include stdlib.h in order to ensure that size_t is defined. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options defined by POSIX. */
-
-#define REG_ICASE     0x01
-#define REG_NEWLINE   0x02
-#define REG_NOTBOL    0x04
-#define REG_NOTEOL    0x08
-
-/* These are not used by PCRE, but by defining them we make it easier
-to slot PCRE into existing programs that make POSIX calls. */
-
-#define REG_EXTENDED  0
-#define REG_NOSUB     0
-
-/* Error values. Not all these are relevant or used by the wrapper. */
-
-enum {
-  REG_ASSERT = 1,  /* internal error ? */
-  REG_BADBR,       /* invalid repeat counts in {} */
-  REG_BADPAT,      /* pattern error */
-  REG_BADRPT,      /* ? * + invalid */
-  REG_EBRACE,      /* unbalanced {} */
-  REG_EBRACK,      /* unbalanced [] */
-  REG_ECOLLATE,    /* collation error - not relevant */
-  REG_ECTYPE,      /* bad class */
-  REG_EESCAPE,     /* bad escape sequence */
-  REG_EMPTY,       /* empty expression */
-  REG_EPAREN,      /* unbalanced () */
-  REG_ERANGE,      /* bad range inside [] */
-  REG_ESIZE,       /* expression too big */
-  REG_ESPACE,      /* failed to get memory */
-  REG_ESUBREG,     /* bad back reference */
-  REG_INVARG,      /* bad argument */
-  REG_NOMATCH      /* match failed */
-};
-
-
-/* The structure representing a compiled regular expression. */
-
-typedef struct {
-  void *re_pcre;
-  size_t re_nsub;
-  size_t re_erroffset;
-} regex_t;
-
-/* The structure in which a captured offset is returned. */
-
-typedef int regoff_t;
-
-typedef struct {
-  regoff_t rm_so;
-  regoff_t rm_eo;
-} regmatch_t;
-
-/* The functions */
-
-extern int regcomp(regex_t *, const char *, int);
-extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int);
-extern size_t regerror(int, const regex_t *, char *, size_t);
-extern void regfree(regex_t *);
-
-#ifdef __cplusplus
-}   /* extern "C" */
-#endif
-
-#endif /* End of pcreposix.h */
diff --git a/pcre/pcretest.c b/pcre/pcretest.c
deleted file mode 100644 (file)
index ee5df5f..0000000
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*************************************************
-*             PCRE testing program               *
-*************************************************/
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <locale.h>
-
-/* Use the internal info for displaying the results of pcre_study(). */
-
-#include "internal.h"
-
-/* It is possible to compile this test program without including support for
-testing the POSIX interface, though this is not available via the standard
-Makefile. */
-
-#if !defined NOPOSIX
-#include "pcreposix.h"
-#endif
-
-#ifndef CLOCKS_PER_SEC
-#ifdef CLK_TCK
-#define CLOCKS_PER_SEC CLK_TCK
-#else
-#define CLOCKS_PER_SEC 100
-#endif
-#endif
-
-#define LOOPREPEAT 20000
-
-
-static FILE *outfile;
-static int log_store = 0;
-static size_t gotten_store;
-
-
-
-static int utf8_table1[] = {
-  0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff};
-
-static int utf8_table2[] = {
-  0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-
-static int utf8_table3[] = {
-  0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-
-/*************************************************
-*       Convert character value to UTF-8         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 6 bytes long
-
-Returns:     number of characters placed in the buffer
-             -1 if input character is negative
-             0 if input character is positive but too big (only when
-             int is longer than 32 bits)
-*/
-
-static int
-ord2utf8(int cvalue, unsigned char *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-  if (cvalue <= utf8_table1[i]) break;
-if (i >= sizeof(utf8_table1)/sizeof(int)) return 0;
-if (cvalue < 0) return -1;
-*buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]);
-cvalue >>= 6 - i;
-for (j = 0; j < i; j++)
-  {
-  *buffer++ = 0x80 | (cvalue & 0x3f);
-  cvalue >>= 6;
-  }
-return i + 1;
-}
-
-
-/*************************************************
-*            Convert UTF-8 string to value       *
-*************************************************/
-
-/* This function takes one or more bytes that represents a UTF-8 character,
-and returns the value of the character.
-
-Argument:
-  buffer   a pointer to the byte vector
-  vptr     a pointer to an int to receive the value
-
-Returns:   >  0 => the number of bytes consumed
-           -6 to 0 => malformed UTF-8 character at offset = (-return)
-*/
-
-int
-utf82ord(unsigned char *buffer, int *vptr)
-{
-int c = *buffer++;
-int d = c;
-int i, j, s;
-
-for (i = -1; i < 6; i++)               /* i is number of additional bytes */
-  {
-  if ((d & 0x80) == 0) break;
-  d <<= 1;
-  }
-
-if (i == -1) { *vptr = c; return 1; }  /* ascii character */
-if (i == 0 || i == 6) return 0;        /* invalid UTF-8 */
-
-/* i now has a value in the range 1-5 */
-
-d = c & utf8_table3[i];
-s = 6 - i;
-
-for (j = 0; j < i; j++)
-  {
-  c = *buffer++;
-  if ((c & 0xc0) != 0x80) return -(j+1);
-  d |= (c & 0x3f) << s;
-  s += 6;
-  }
-
-/* Check that encoding was the correct unique one */
-
-for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++)
-  if (d <= utf8_table1[j]) break;
-if (j != i) return -(i+1);
-
-/* Valid value */
-
-*vptr = d;
-return i+1;
-}
-
-
-
-
-
-
-/* Debugging function to print the internal form of the regex. This is the same
-code as contained in pcre.c under the DEBUG macro. */
-
-static const char *OP_names[] = {
-  "End", "\\A", "\\B", "\\b", "\\D", "\\d",
-  "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z",
-  "Opt", "^", "$", "Any", "chars", "not",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",
-  "*", "*?", "+", "+?", "?", "??", "{", "{",
-  "class", "Ref", "Recurse",
-  "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",
-  "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref",
-  "Brazero", "Braminzero", "Bra"
-};
-
-
-static void print_internals(pcre *re)
-{
-unsigned char *code = ((real_pcre *)re)->code;
-
-fprintf(outfile, "------------------------------------------------------------------\n");
-
-for(;;)
-  {
-  int c;
-  int charlength;
-
-  fprintf(outfile, "%3d ", (int)(code - ((real_pcre *)re)->code));
-
-  if (*code >= OP_BRA)
-    {
-    fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA);
-    code += 2;
-    }
-
-  else switch(*code)
-    {
-    case OP_END:
-    fprintf(outfile, "    %s\n", OP_names[*code]);
-    fprintf(outfile, "------------------------------------------------------------------\n");
-    return;
-
-    case OP_OPT:
-    fprintf(outfile, " %.2x %s", code[1], OP_names[*code]);
-    code++;
-    break;
-
-    case OP_COND:
-    fprintf(outfile, "%3d Cond", (code[1] << 8) + code[2]);
-    code += 2;
-    break;
-
-    case OP_CREF:
-    fprintf(outfile, " %.2d %s", code[1], OP_names[*code]);
-    code++;
-    break;
-
-    case OP_CHARS:
-    charlength = *(++code);
-    fprintf(outfile, "%3d ", charlength);
-    while (charlength-- > 0)
-      if (isprint(c = *(++code))) fprintf(outfile, "%c", c);
-        else fprintf(outfile, "\\x%02x", c);
-    break;
-
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_ALT:
-    case OP_KET:
-    case OP_ASSERT:
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    case OP_ONCE:
-    fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
-    code += 2;
-    break;
-
-    case OP_REVERSE:
-    fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]);
-    code += 2;
-    break;
-
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    if (*code >= OP_TYPESTAR)
-      fprintf(outfile, "    %s", OP_names[code[1]]);
-    else if (isprint(c = code[1])) fprintf(outfile, "    %c", c);
-      else fprintf(outfile, "    \\x%02x", c);
-    fprintf(outfile, "%s", OP_names[*code++]);
-    break;
-
-    case OP_EXACT:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    if (isprint(c = code[3])) fprintf(outfile, "    %c{", c);
-      else fprintf(outfile, "    \\x%02x{", c);
-    if (*code != OP_EXACT) fprintf(outfile, ",");
-    fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_MINUPTO) fprintf(outfile, "?");
-    code += 3;
-    break;
-
-    case OP_TYPEEXACT:
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    fprintf(outfile, "    %s{", OP_names[code[3]]);
-    if (*code != OP_TYPEEXACT) fprintf(outfile, "0,");
-    fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_TYPEMINUPTO) fprintf(outfile, "?");
-    code += 3;
-    break;
-
-    case OP_NOT:
-    if (isprint(c = *(++code))) fprintf(outfile, "    [^%c]", c);
-      else fprintf(outfile, "    [^\\x%02x]", c);
-    break;
-
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    if (isprint(c = code[1])) fprintf(outfile, "    [^%c]", c);
-      else fprintf(outfile, "    [^\\x%02x]", c);
-    fprintf(outfile, "%s", OP_names[*code++]);
-    break;
-
-    case OP_NOTEXACT:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    if (isprint(c = code[3])) fprintf(outfile, "    [^%c]{", c);
-      else fprintf(outfile, "    [^\\x%02x]{", c);
-    if (*code != OP_NOTEXACT) fprintf(outfile, ",");
-    fprintf(outfile, "%d}", (code[1] << 8) + code[2]);
-    if (*code == OP_NOTMINUPTO) fprintf(outfile, "?");
-    code += 3;
-    break;
-
-    case OP_REF:
-    fprintf(outfile, "    \\%d", *(++code));
-    code++;
-    goto CLASS_REF_REPEAT;
-
-    case OP_CLASS:
-      {
-      int i, min, max;
-      code++;
-      fprintf(outfile, "    [");
-
-      for (i = 0; i < 256; i++)
-        {
-        if ((code[i/8] & (1 << (i&7))) != 0)
-          {
-          int j;
-          for (j = i+1; j < 256; j++)
-            if ((code[j/8] & (1 << (j&7))) == 0) break;
-          if (i == '-' || i == ']') fprintf(outfile, "\\");
-          if (isprint(i)) fprintf(outfile, "%c", i); else fprintf(outfile, "\\x%02x", i);
-          if (--j > i)
-            {
-            fprintf(outfile, "-");
-            if (j == '-' || j == ']') fprintf(outfile, "\\");
-            if (isprint(j)) fprintf(outfile, "%c", j); else fprintf(outfile, "\\x%02x", j);
-            }
-          i = j;
-          }
-        }
-      fprintf(outfile, "]");
-      code += 32;
-
-      CLASS_REF_REPEAT:
-
-      switch(*code)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        fprintf(outfile, "%s", OP_names[*code]);
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        min = (code[1] << 8) + code[2];
-        max = (code[3] << 8) + code[4];
-        if (max == 0) fprintf(outfile, "{%d,}", min);
-        else fprintf(outfile, "{%d,%d}", min, max);
-        if (*code == OP_CRMINRANGE) fprintf(outfile, "?");
-        code += 4;
-        break;
-
-        default:
-        code--;
-        }
-      }
-    break;
-
-    /* Anything else is just a one-node item */
-
-    default:
-    fprintf(outfile, "    %s", OP_names[*code]);
-    break;
-    }
-
-  code++;
-  fprintf(outfile, "\n");
-  }
-}
-
-
-
-/* Character string printing function. A "normal" and a UTF-8 version. */
-
-static void pchars(unsigned char *p, int length, int utf8)
-{
-int c;
-while (length-- > 0)
-  {
-  if (utf8)
-    {
-    int rc = utf82ord(p, &c);
-    if (rc > 0)
-      {
-      length -= rc - 1;
-      p += rc;
-      if (c < 256 && isprint(c)) fprintf(outfile, "%c", c);
-        else fprintf(outfile, "\\x{%02x}", c);
-      continue;
-      }
-    }
-
-   /* Not UTF-8, or malformed UTF-8  */
-
-  if (isprint(c = *(p++))) fprintf(outfile, "%c", c);
-    else fprintf(outfile, "\\x%02x", c);
-  }
-}
-
-
-
-/* Alternative malloc function, to test functionality and show the size of the
-compiled re. */
-
-static void *new_malloc(size_t size)
-{
-gotten_store = size;
-if (log_store)
-  fprintf(outfile, "Memory allocation (code space): %d\n",
-    (int)((int)size - offsetof(real_pcre, code[0])));
-return malloc(size);
-}
-
-
-
-
-/* Get one piece of information from the pcre_fullinfo() function */
-
-static void new_info(pcre *re, pcre_extra *study, int option, void *ptr)
-{
-int rc;
-if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0)
-  fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option);
-}
-
-
-
-
-/* Read lines from named file or stdin and write to named file or stdout; lines
-consist of a regular expression, in delimiters and optionally followed by
-options, followed by a set of test data, terminated by an empty line. */
-
-int main(int argc, char **argv)
-{
-FILE *infile = stdin;
-int options = 0;
-int study_options = 0;
-int op = 1;
-int timeit = 0;
-int showinfo = 0;
-int showstore = 0;
-int posix = 0;
-int debug = 0;
-int done = 0;
-unsigned char buffer[30000];
-unsigned char dbuffer[1024];
-
-/* Static so that new_malloc can use it. */
-
-outfile = stdout;
-
-/* Scan options */
-
-while (argc > 1 && argv[op][0] == '-')
-  {
-  if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0)
-    showstore = 1;
-  else if (strcmp(argv[op], "-t") == 0) timeit = 1;
-  else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
-  else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
-  else if (strcmp(argv[op], "-p") == 0) posix = 1;
-  else
-    {
-    printf("*** Unknown option %s\n", argv[op]);
-    printf("Usage: pcretest [-d] [-i] [-p] [-s] [-t] [<input> [<output>]]\n");
-    printf("  -d   debug: show compiled code; implies -i\n"
-           "  -i   show information about compiled pattern\n"
-           "  -p   use POSIX interface\n"
-           "  -s   output store information\n"
-           "  -t   time compilation and execution\n");
-    return 1;
-    }
-  op++;
-  argc--;
-  }
-
-/* Sort out the input and output files */
-
-if (argc > 1)
-  {
-  infile = fopen(argv[op], "r");
-  if (infile == NULL)
-    {
-    printf("** Failed to open %s\n", argv[op]);
-    return 1;
-    }
-  }
-
-if (argc > 2)
-  {
-  outfile = fopen(argv[op+1], "w");
-  if (outfile == NULL)
-    {
-    printf("** Failed to open %s\n", argv[op+1]);
-    return 1;
-    }
-  }
-
-/* Set alternative malloc function */
-
-pcre_malloc = new_malloc;
-
-/* Heading line, then prompt for first regex if stdin */
-
-fprintf(outfile, "PCRE version %s\n\n", pcre_version());
-
-/* Main loop */
-
-while (!done)
-  {
-  pcre *re = NULL;
-  pcre_extra *extra = NULL;
-
-#if !defined NOPOSIX  /* There are still compilers that require no indent */
-  regex_t preg;
-  int do_posix = 0;
-#endif
-
-  const char *error;
-  unsigned char *p, *pp, *ppp;
-  unsigned const char *tables = NULL;
-  int do_study = 0;
-  int do_debug = debug;
-  int do_G = 0;
-  int do_g = 0;
-  int do_showinfo = showinfo;
-  int do_showrest = 0;
-  int utf8 = 0;
-  int erroroffset, len, delimiter;
-
-  if (infile == stdin) printf("  re> ");
-  if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break;
-  if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-
-  p = buffer;
-  while (isspace(*p)) p++;
-  if (*p == 0) continue;
-
-  /* Get the delimiter and seek the end of the pattern; if is isn't
-  complete, read more. */
-
-  delimiter = *p++;
-
-  if (isalnum(delimiter) || delimiter == '\\')
-    {
-    fprintf(outfile, "** Delimiter must not be alphameric or \\\n");
-    goto SKIP_DATA;
-    }
-
-  pp = p;
-
-  for(;;)
-    {
-    while (*pp != 0)
-      {
-      if (*pp == '\\' && pp[1] != 0) pp++;
-        else if (*pp == delimiter) break;
-      pp++;
-      }
-    if (*pp != 0) break;
-
-    len = sizeof(buffer) - (pp - buffer);
-    if (len < 256)
-      {
-      fprintf(outfile, "** Expression too long - missing delimiter?\n");
-      goto SKIP_DATA;
-      }
-
-    if (infile == stdin) printf("    > ");
-    if (fgets((char *)pp, len, infile) == NULL)
-      {
-      fprintf(outfile, "** Unexpected EOF\n");
-      done = 1;
-      goto CONTINUE;
-      }
-    if (infile != stdin) fprintf(outfile, "%s", (char *)pp);
-    }
-
-  /* If the first character after the delimiter is backslash, make
-  the pattern end with backslash. This is purely to provide a way
-  of testing for the error message when a pattern ends with backslash. */
-
-  if (pp[1] == '\\') *pp++ = '\\';
-
-  /* Terminate the pattern at the delimiter */
-
-  *pp++ = 0;
-
-  /* Look for options after final delimiter */
-
-  options = 0;
-  study_options = 0;
-  log_store = showstore;  /* default from command line */
-
-  while (*pp != 0)
-    {
-    switch (*pp++)
-      {
-      case 'g': do_g = 1; break;
-      case 'i': options |= PCRE_CASELESS; break;
-      case 'm': options |= PCRE_MULTILINE; break;
-      case 's': options |= PCRE_DOTALL; break;
-      case 'x': options |= PCRE_EXTENDED; break;
-
-      case '+': do_showrest = 1; break;
-      case 'A': options |= PCRE_ANCHORED; break;
-      case 'D': do_debug = do_showinfo = 1; break;
-      case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
-      case 'G': do_G = 1; break;
-      case 'I': do_showinfo = 1; break;
-      case 'M': log_store = 1; break;
-
-#if !defined NOPOSIX
-      case 'P': do_posix = 1; break;
-#endif
-
-      case 'S': do_study = 1; break;
-      case 'U': options |= PCRE_UNGREEDY; break;
-      case 'X': options |= PCRE_EXTRA; break;
-      case '8': options |= PCRE_UTF8; utf8 = 1; break;
-
-      case 'L':
-      ppp = pp;
-      while (*ppp != '\n' && *ppp != ' ') ppp++;
-      *ppp = 0;
-      if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
-        {
-        fprintf(outfile, "** Failed to set locale \"%s\"\n", pp);
-        goto SKIP_DATA;
-        }
-      tables = pcre_maketables();
-      pp = ppp;
-      break;
-
-      case '\n': case ' ': break;
-      default:
-      fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);
-      goto SKIP_DATA;
-      }
-    }
-
-  /* Handle compiling via the POSIX interface, which doesn't support the
-  timing, showing, or debugging options, nor the ability to pass over
-  local character tables. */
-
-#if !defined NOPOSIX
-  if (posix || do_posix)
-    {
-    int rc;
-    int cflags = 0;
-    if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE;
-    if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE;
-    rc = regcomp(&preg, (char *)p, cflags);
-
-    /* Compilation failed; go back for another re, skipping to blank line
-    if non-interactive. */
-
-    if (rc != 0)
-      {
-      (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer));
-      fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer);
-      goto SKIP_DATA;
-      }
-    }
-
-  /* Handle compiling via the native interface */
-
-  else
-#endif  /* !defined NOPOSIX */
-
-    {
-    if (timeit)
-      {
-      register int i;
-      clock_t time_taken;
-      clock_t start_time = clock();
-      for (i = 0; i < LOOPREPEAT; i++)
-        {
-        re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
-        if (re != NULL) free(re);
-        }
-      time_taken = clock() - start_time;
-      fprintf(outfile, "Compile time %.3f milliseconds\n",
-        ((double)time_taken * 1000.0) /
-        ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
-      }
-
-    re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
-
-    /* Compilation failed; go back for another re, skipping to blank line
-    if non-interactive. */
-
-    if (re == NULL)
-      {
-      fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset);
-      SKIP_DATA:
-      if (infile != stdin)
-        {
-        for (;;)
-          {
-          if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
-            {
-            done = 1;
-            goto CONTINUE;
-            }
-          len = (int)strlen((char *)buffer);
-          while (len > 0 && isspace(buffer[len-1])) len--;
-          if (len == 0) break;
-          }
-        fprintf(outfile, "\n");
-        }
-      goto CONTINUE;
-      }
-
-    /* Compilation succeeded; print data if required. There are now two
-    info-returning functions. The old one has a limited interface and
-    returns only limited data. Check that it agrees with the newer one. */
-
-    if (do_showinfo)
-      {
-      int old_first_char, old_options, old_count;
-      int count, backrefmax, first_char, need_char;
-      size_t size;
-
-      if (do_debug) print_internals(re);
-
-      new_info(re, NULL, PCRE_INFO_OPTIONS, &options);
-      new_info(re, NULL, PCRE_INFO_SIZE, &size);
-      new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);
-      new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);
-      new_info(re, NULL, PCRE_INFO_FIRSTCHAR, &first_char);
-      new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char);
-
-      old_count = pcre_info(re, &old_options, &old_first_char);
-      if (count < 0) fprintf(outfile,
-        "Error %d from pcre_info()\n", count);
-      else
-        {
-        if (old_count != count) fprintf(outfile,
-          "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count,
-            old_count);
-
-        if (old_first_char != first_char) fprintf(outfile,
-          "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n",
-            first_char, old_first_char);
-
-        if (old_options != options) fprintf(outfile,
-          "Options disagreement: pcre_fullinfo=%d pcre_info=%d\n", options,
-            old_options);
-        }
-
-      if (size != gotten_store) fprintf(outfile,
-        "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n",
-        size, gotten_store);
-
-      fprintf(outfile, "Capturing subpattern count = %d\n", count);
-      if (backrefmax > 0)
-        fprintf(outfile, "Max back reference = %d\n", backrefmax);
-      if (options == 0) fprintf(outfile, "No options\n");
-        else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n",
-          ((options & PCRE_ANCHORED) != 0)? " anchored" : "",
-          ((options & PCRE_CASELESS) != 0)? " caseless" : "",
-          ((options & PCRE_EXTENDED) != 0)? " extended" : "",
-          ((options & PCRE_MULTILINE) != 0)? " multiline" : "",
-          ((options & PCRE_DOTALL) != 0)? " dotall" : "",
-          ((options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
-          ((options & PCRE_EXTRA) != 0)? " extra" : "",
-          ((options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
-          ((options & PCRE_UTF8) != 0)? " utf8" : "");
-
-      if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
-        fprintf(outfile, "Case state changes\n");
-
-      if (first_char == -1)
-        {
-        fprintf(outfile, "First char at start or follows \\n\n");
-        }
-      else if (first_char < 0)
-        {
-        fprintf(outfile, "No first char\n");
-        }
-      else
-        {
-        if (isprint(first_char))
-          fprintf(outfile, "First char = \'%c\'\n", first_char);
-        else
-          fprintf(outfile, "First char = %d\n", first_char);
-        }
-
-      if (need_char < 0)
-        {
-        fprintf(outfile, "No need char\n");
-        }
-      else
-        {
-        if (isprint(need_char))
-          fprintf(outfile, "Need char = \'%c\'\n", need_char);
-        else
-          fprintf(outfile, "Need char = %d\n", need_char);
-        }
-      }
-
-    /* If /S was present, study the regexp to generate additional info to
-    help with the matching. */
-
-    if (do_study)
-      {
-      if (timeit)
-        {
-        register int i;
-        clock_t time_taken;
-        clock_t start_time = clock();
-        for (i = 0; i < LOOPREPEAT; i++)
-          extra = pcre_study(re, study_options, &error);
-        time_taken = clock() - start_time;
-        if (extra != NULL) free(extra);
-        fprintf(outfile, "  Study time %.3f milliseconds\n",
-          ((double)time_taken * 1000.0)/
-          ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
-        }
-
-      extra = pcre_study(re, study_options, &error);
-      if (error != NULL)
-        fprintf(outfile, "Failed to study: %s\n", error);
-      else if (extra == NULL)
-        fprintf(outfile, "Study returned NULL\n");
-
-      else if (do_showinfo)
-        {
-        uschar *start_bits = NULL;
-        new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
-        if (start_bits == NULL)
-          fprintf(outfile, "No starting character set\n");
-        else
-          {
-          int i;
-          int c = 24;
-          fprintf(outfile, "Starting character set: ");
-          for (i = 0; i < 256; i++)
-            {
-            if ((start_bits[i/8] & (1<<(i%8))) != 0)
-              {
-              if (c > 75)
-                {
-                fprintf(outfile, "\n  ");
-                c = 2;
-                }
-              if (isprint(i) && i != ' ')
-                {
-                fprintf(outfile, "%c ", i);
-                c += 2;
-                }
-              else
-                {
-                fprintf(outfile, "\\x%02x ", i);
-                c += 5;
-                }
-              }
-            }
-          fprintf(outfile, "\n");
-          }
-        }
-      }
-    }
-
-  /* Read data lines and test them */
-
-  for (;;)
-    {
-    unsigned char *q;
-    unsigned char *bptr = dbuffer;
-    int count, c;
-    int copystrings = 0;
-    int getstrings = 0;
-    int getlist = 0;
-    int gmatched = 0;
-    int start_offset = 0;
-    int g_notempty = 0;
-    int offsets[45];
-    int size_offsets = sizeof(offsets)/sizeof(int);
-
-    options = 0;
-
-    if (infile == stdin) printf("data> ");
-    if (fgets((char *)buffer, sizeof(buffer), infile) == NULL)
-      {
-      done = 1;
-      goto CONTINUE;
-      }
-    if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
-
-    len = (int)strlen((char *)buffer);
-    while (len > 0 && isspace(buffer[len-1])) len--;
-    buffer[len] = 0;
-    if (len == 0) break;
-
-    p = buffer;
-    while (isspace(*p)) p++;
-
-    q = dbuffer;
-    while ((c = *p++) != 0)
-      {
-      int i = 0;
-      int n = 0;
-      if (c == '\\') switch ((c = *p++))
-        {
-        case 'a': c =    7; break;
-        case 'b': c = '\b'; break;
-        case 'e': c =   27; break;
-        case 'f': c = '\f'; break;
-        case 'n': c = '\n'; break;
-        case 'r': c = '\r'; break;
-        case 't': c = '\t'; break;
-        case 'v': c = '\v'; break;
-
-        case '0': case '1': case '2': case '3':
-        case '4': case '5': case '6': case '7':
-        c -= '0';
-        while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')
-          c = c * 8 + *p++ - '0';
-        break;
-
-        case 'x':
-
-        /* Handle \x{..} specially - new Perl thing for utf8 */
-
-        if (*p == '{')
-          {
-          unsigned char *pt = p;
-          c = 0;
-          while (isxdigit(*(++pt)))
-            c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W');
-          if (*pt == '}')
-            {
-            unsigned char buffer[8];
-            int ii, utn;
-            utn = ord2utf8(c, buffer);
-            for (ii = 0; ii < utn - 1; ii++) *q++ = buffer[ii];
-            c = buffer[ii];   /* Last byte */
-            p = pt + 1;
-            break;
-            }
-          /* Not correct form; fall through */
-          }
-
-        /* Ordinary \x */
-
-        c = 0;
-        while (i++ < 2 && isxdigit(*p))
-          {
-          c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W');
-          p++;
-          }
-        break;
-
-        case 0:   /* Allows for an empty line */
-        p--;
-        continue;
-
-        case 'A':  /* Option setting */
-        options |= PCRE_ANCHORED;
-        continue;
-
-        case 'B':
-        options |= PCRE_NOTBOL;
-        continue;
-
-        case 'C':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        copystrings |= 1 << n;
-        continue;
-
-        case 'G':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        getstrings |= 1 << n;
-        continue;
-
-        case 'L':
-        getlist = 1;
-        continue;
-
-        case 'N':
-        options |= PCRE_NOTEMPTY;
-        continue;
-
-        case 'O':
-        while(isdigit(*p)) n = n * 10 + *p++ - '0';
-        if (n <= (int)(sizeof(offsets)/sizeof(int))) size_offsets = n;
-        continue;
-
-        case 'Z':
-        options |= PCRE_NOTEOL;
-        continue;
-        }
-      *q++ = c;
-      }
-    *q = 0;
-    len = q - dbuffer;
-
-    /* Handle matching via the POSIX interface, which does not
-    support timing. */
-
-#if !defined NOPOSIX
-    if (posix || do_posix)
-      {
-      int rc;
-      int eflags = 0;
-      regmatch_t pmatch[sizeof(offsets)/sizeof(int)];
-      if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
-      if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
-
-      rc = regexec(&preg, (const char *)bptr, size_offsets, pmatch, eflags);
-
-      if (rc != 0)
-        {
-        (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer));
-        fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer);
-        }
-      else
-        {
-        size_t i;
-        for (i = 0; i < size_offsets; i++)
-          {
-          if (pmatch[i].rm_so >= 0)
-            {
-            fprintf(outfile, "%2d: ", (int)i);
-            pchars(dbuffer + pmatch[i].rm_so,
-              pmatch[i].rm_eo - pmatch[i].rm_so, utf8);
-            fprintf(outfile, "\n");
-            if (i == 0 && do_showrest)
-              {
-              fprintf(outfile, " 0+ ");
-              pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf8);
-              fprintf(outfile, "\n");
-              }
-            }
-          }
-        }
-      }
-
-    /* Handle matching via the native interface - repeats for /g and /G */
-
-    else
-#endif  /* !defined NOPOSIX */
-
-    for (;; gmatched++)    /* Loop for /g or /G */
-      {
-      if (timeit)
-        {
-        register int i;
-        clock_t time_taken;
-        clock_t start_time = clock();
-        for (i = 0; i < LOOPREPEAT; i++)
-          count = pcre_exec(re, extra, (char *)bptr, len,
-            start_offset, options | g_notempty, offsets, size_offsets);
-        time_taken = clock() - start_time;
-        fprintf(outfile, "Execute time %.3f milliseconds\n",
-          ((double)time_taken * 1000.0)/
-          ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC));
-        }
-
-      count = pcre_exec(re, extra, (char *)bptr, len,
-        start_offset, options | g_notempty, offsets, size_offsets);
-
-      if (count == 0)
-        {
-        fprintf(outfile, "Matched, but too many substrings\n");
-        count = size_offsets/3;
-        }
-
-      /* Matched */
-
-      if (count >= 0)
-        {
-        int i;
-        for (i = 0; i < count * 2; i += 2)
-          {
-          if (offsets[i] < 0)
-            fprintf(outfile, "%2d: <unset>\n", i/2);
-          else
-            {
-            fprintf(outfile, "%2d: ", i/2);
-            pchars(bptr + offsets[i], offsets[i+1] - offsets[i], utf8);
-            fprintf(outfile, "\n");
-            if (i == 0)
-              {
-              if (do_showrest)
-                {
-                fprintf(outfile, " 0+ ");
-                pchars(bptr + offsets[i+1], len - offsets[i+1], utf8);
-                fprintf(outfile, "\n");
-                }
-              }
-            }
-          }
-
-        for (i = 0; i < 32; i++)
-          {
-          if ((copystrings & (1 << i)) != 0)
-            {
-            char copybuffer[16];
-            int rc = pcre_copy_substring((char *)bptr, offsets, count,
-              i, copybuffer, sizeof(copybuffer));
-            if (rc < 0)
-              fprintf(outfile, "copy substring %d failed %d\n", i, rc);
-            else
-              fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc);
-            }
-          }
-
-        for (i = 0; i < 32; i++)
-          {
-          if ((getstrings & (1 << i)) != 0)
-            {
-            const char *substring;
-            int rc = pcre_get_substring((char *)bptr, offsets, count,
-              i, &substring);
-            if (rc < 0)
-              fprintf(outfile, "get substring %d failed %d\n", i, rc);
-            else
-              {
-              fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc);
-              /* free((void *)substring); */
-              pcre_free_substring(substring);
-              }
-            }
-          }
-
-        if (getlist)
-          {
-          const char **stringlist;
-          int rc = pcre_get_substring_list((char *)bptr, offsets, count,
-            &stringlist);
-          if (rc < 0)
-            fprintf(outfile, "get substring list failed %d\n", rc);
-          else
-            {
-            for (i = 0; i < count; i++)
-              fprintf(outfile, "%2dL %s\n", i, stringlist[i]);
-            if (stringlist[i] != NULL)
-              fprintf(outfile, "string list not terminated by NULL\n");
-            /* free((void *)stringlist); */
-            pcre_free_substring_list(stringlist);
-            }
-          }
-        }
-
-      /* Failed to match. If this is a /g or /G loop and we previously set
-      g_notempty after a null match, this is not necessarily the end.
-      We want to advance the start offset, and continue. Fudge the offset
-      values to achieve this. We won't be at the end of the string - that
-      was checked before setting g_notempty. */
-
-      else
-        {
-        if (g_notempty != 0)
-          {
-          offsets[0] = start_offset;
-          offsets[1] = start_offset + 1;
-          }
-        else
-          {
-          if (gmatched == 0)   /* Error if no previous matches */
-            {
-            if (count == -1) fprintf(outfile, "No match\n");
-              else fprintf(outfile, "Error %d\n", count);
-            }
-          break;  /* Out of the /g loop */
-          }
-        }
-
-      /* If not /g or /G we are done */
-
-      if (!do_g && !do_G) break;
-
-      /* If we have matched an empty string, first check to see if we are at
-      the end of the subject. If so, the /g loop is over. Otherwise, mimic
-      what Perl's /g options does. This turns out to be rather cunning. First
-      we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the
-      same point. If this fails (picked up above) we advance to the next
-      character. */
-
-      g_notempty = 0;
-      if (offsets[0] == offsets[1])
-        {
-        if (offsets[0] == len) break;
-        g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;
-        }
-
-      /* For /g, update the start offset, leaving the rest alone */
-
-      if (do_g) start_offset = offsets[1];
-
-      /* For /G, update the pointer and length */
-
-      else
-        {
-        bptr += offsets[1];
-        len -= offsets[1];
-        }
-      }  /* End of loop for /g and /G */
-    }    /* End of loop for data lines */
-
-  CONTINUE:
-
-#if !defined NOPOSIX
-  if (posix || do_posix) regfree(&preg);
-#endif
-
-  if (re != NULL) free(re);
-  if (extra != NULL) free(extra);
-  if (tables != NULL)
-    {
-    free((void *)tables);
-    setlocale(LC_CTYPE, "C");
-    }
-  }
-
-fprintf(outfile, "\n");
-return 0;
-}
-
-/* End */
diff --git a/pcre/study.c b/pcre/study.c
deleted file mode 100644 (file)
index 676db94..0000000
+++ /dev/null
@@ -1,397 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2000 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-
-/*************************************************
-*      Set a bit and maybe its alternate case    *
-*************************************************/
-
-/* Given a character, set its bit in the table, and also the bit for the other
-version of a letter if we are caseless.
-
-Arguments:
-  start_bits    points to the bit map
-  c             is the character
-  caseless      the caseless flag
-  cd            the block with char table pointers
-
-Returns:        nothing
-*/
-
-static void
-set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd)
-{
-start_bits[c/8] |= (1 << (c&7));
-if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
-  start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
-}
-
-
-
-/*************************************************
-*          Create bitmap of starting chars       *
-*************************************************/
-
-/* This function scans a compiled unanchored expression and attempts to build a
-bitmap of the set of initial characters. If it can't, it returns FALSE. As time
-goes by, we may be able to get more clever at doing this.
-
-Arguments:
-  code         points to an expression
-  start_bits   points to a 32-byte table, initialized to 0
-  caseless     the current state of the caseless flag
-  cd           the block with char table pointers
-
-Returns:       TRUE if table built, FALSE otherwise
-*/
-
-static BOOL
-set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
-  compile_data *cd)
-{
-register int c;
-
-/* This next statement and the later reference to dummy are here in order to
-trick the optimizer of the IBM C compiler for OS/2 into generating correct
-code. Apparently IBM isn't going to fix the problem, and we would rather not
-disable optimization (in this module it actually makes a big difference, and
-the pcre module can use all the optimization it can get). */
-
-volatile int dummy;
-
-do
-  {
-  const uschar *tcode = code + 3;
-  BOOL try_next = TRUE;
-
-  while (try_next)
-    {
-    try_next = FALSE;
-
-    /* If a branch starts with a bracket or a positive lookahead assertion,
-    recurse to set bits from within them. That's all for this branch. */
-
-    if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT)
-      {
-      if (!set_start_bits(tcode, start_bits, caseless, cd))
-        return FALSE;
-      }
-
-    else switch(*tcode)
-      {
-      default:
-      return FALSE;
-
-      /* Skip over lookbehind and negative lookahead assertions */
-
-      case OP_ASSERT_NOT:
-      case OP_ASSERTBACK:
-      case OP_ASSERTBACK_NOT:
-      try_next = TRUE;
-      do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT);
-      tcode += 3;
-      break;
-
-      /* Skip over an option setting, changing the caseless flag */
-
-      case OP_OPT:
-      caseless = (tcode[1] & PCRE_CASELESS) != 0;
-      tcode += 2;
-      try_next = TRUE;
-      break;
-
-      /* BRAZERO does the bracket, but carries on. */
-
-      case OP_BRAZERO:
-      case OP_BRAMINZERO:
-      if (!set_start_bits(++tcode, start_bits, caseless, cd))
-        return FALSE;
-      dummy = 1;
-      do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT);
-      tcode += 3;
-      try_next = TRUE;
-      break;
-
-      /* Single-char * or ? sets the bit and tries the next item */
-
-      case OP_STAR:
-      case OP_MINSTAR:
-      case OP_QUERY:
-      case OP_MINQUERY:
-      set_bit(start_bits, tcode[1], caseless, cd);
-      tcode += 2;
-      try_next = TRUE;
-      break;
-
-      /* Single-char upto sets the bit and tries the next */
-
-      case OP_UPTO:
-      case OP_MINUPTO:
-      set_bit(start_bits, tcode[3], caseless, cd);
-      tcode += 4;
-      try_next = TRUE;
-      break;
-
-      /* At least one single char sets the bit and stops */
-
-      case OP_EXACT:       /* Fall through */
-      tcode++;
-
-      case OP_CHARS:       /* Fall through */
-      tcode++;
-
-      case OP_PLUS:
-      case OP_MINPLUS:
-      set_bit(start_bits, tcode[1], caseless, cd);
-      break;
-
-      /* Single character type sets the bits and stops */
-
-      case OP_NOT_DIGIT:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_digit];
-      break;
-
-      case OP_DIGIT:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_digit];
-      break;
-
-      case OP_NOT_WHITESPACE:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_space];
-      break;
-
-      case OP_WHITESPACE:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_space];
-      break;
-
-      case OP_NOT_WORDCHAR:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_word];
-      break;
-
-      case OP_WORDCHAR:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_word];
-      break;
-
-      /* One or more character type fudges the pointer and restarts, knowing
-      it will hit a single character type and stop there. */
-
-      case OP_TYPEPLUS:
-      case OP_TYPEMINPLUS:
-      tcode++;
-      try_next = TRUE;
-      break;
-
-      case OP_TYPEEXACT:
-      tcode += 3;
-      try_next = TRUE;
-      break;
-
-      /* Zero or more repeats of character types set the bits and then
-      try again. */
-
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      tcode += 2;               /* Fall through */
-
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      switch(tcode[1])
-        {
-        case OP_NOT_DIGIT:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_digit];
-        break;
-
-        case OP_DIGIT:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_digit];
-        break;
-
-        case OP_NOT_WHITESPACE:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_space];
-        break;
-
-        case OP_WHITESPACE:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_space];
-        break;
-
-        case OP_NOT_WORDCHAR:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_word];
-        break;
-
-        case OP_WORDCHAR:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_word];
-        break;
-        }
-
-      tcode += 2;
-      try_next = TRUE;
-      break;
-
-      /* Character class: set the bits and either carry on or not,
-      according to the repeat count. */
-
-      case OP_CLASS:
-        {
-        tcode++;
-        for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
-        tcode += 32;
-        switch (*tcode)
-          {
-          case OP_CRSTAR:
-          case OP_CRMINSTAR:
-          case OP_CRQUERY:
-          case OP_CRMINQUERY:
-          tcode++;
-          try_next = TRUE;
-          break;
-
-          case OP_CRRANGE:
-          case OP_CRMINRANGE:
-          if (((tcode[1] << 8) + tcode[2]) == 0)
-            {
-            tcode += 5;
-            try_next = TRUE;
-            }
-          break;
-          }
-        }
-      break; /* End of class handling */
-
-      }      /* End of switch */
-    }        /* End of try_next loop */
-
-  code += (code[1] << 8) + code[2];   /* Advance to next branch */
-  }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-*          Study a compiled expression           *
-*************************************************/
-
-/* This function is handed a compiled expression that it must study to produce
-information that will speed up the matching. It returns a pcre_extra block
-which then gets handed back to pcre_exec().
-
-Arguments:
-  re        points to the compiled expression
-  options   contains option bits
-  errorptr  points to where to place error messages;
-            set NULL unless error
-
-Returns:    pointer to a pcre_extra block,
-            NULL on error or if no optimization possible
-*/
-
-pcre_extra *
-pcre_study(const pcre *external_re, int options, const char **errorptr)
-{
-uschar start_bits[32];
-real_pcre_extra *extra;
-const real_pcre *re = (const real_pcre *)external_re;
-compile_data compile_block;
-
-*errorptr = NULL;
-
-if (re == NULL || re->magic_number != MAGIC_NUMBER)
-  {
-  *errorptr = "argument is not a compiled regular expression";
-  return NULL;
-  }
-
-if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
-  {
-  *errorptr = "unknown or incorrect option bit(s) set";
-  return NULL;
-  }
-
-/* For an anchored pattern, or an unchored pattern that has a first char, or a
-multiline pattern that matches only at "line starts", no further processing at
-present. */
-
-if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
-  return NULL;
-
-/* Set the character tables in the block which is passed around */
-
-compile_block.lcc = re->tables + lcc_offset;
-compile_block.fcc = re->tables + fcc_offset;
-compile_block.cbits = re->tables + cbits_offset;
-compile_block.ctypes = re->tables + ctypes_offset;
-
-/* See if we can find a fixed set of initial characters for the pattern. */
-
-memset(start_bits, 0, 32 * sizeof(uschar));
-if (!set_start_bits(re->code, start_bits, (re->options & PCRE_CASELESS) != 0,
-  &compile_block)) return NULL;
-
-/* Get an "extra" block and put the information therein. */
-
-extra = (real_pcre_extra *)(pcre_malloc)(sizeof(real_pcre_extra));
-
-if (extra == NULL)
-  {
-  *errorptr = "failed to get memory";
-  return NULL;
-  }
-
-extra->options = PCRE_STUDY_MAPPED;
-memcpy(extra->start_bits, start_bits, sizeof(start_bits));
-
-return (pcre_extra *)extra;
-}
-
-/* End of study.c */
diff --git a/pcre/vc_dftables.dsp b/pcre/vc_dftables.dsp
deleted file mode 100755 (executable)
index a02add5..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-# Microsoft Developer Studio Project File - Name="vc_dftables" - Package Owner=<4>\r
-# Microsoft Developer Studio Generated Build File, Format Version 5.00\r
-# ** DO NOT EDIT **\r
-\r
-# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
-\r
-CFG=vc_dftables - Win32 Debug with Win32 threads\r
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
-!MESSAGE use the Export Makefile command and run\r
-!MESSAGE \r
-!MESSAGE NMAKE /f "vc_dftables.mak".\r
-!MESSAGE \r
-!MESSAGE You can specify a configuration when running NMAKE\r
-!MESSAGE by defining the macro CFG on the command line. For example:\r
-!MESSAGE \r
-!MESSAGE NMAKE /f "vc_dftables.mak"\\r
- CFG="vc_dftables - Win32 Debug with Win32 threads"\r
-!MESSAGE \r
-!MESSAGE Possible choices for configuration are:\r
-!MESSAGE \r
-!MESSAGE "vc_dftables - Win32 Release" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Debug" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Debug with Win32 threads" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE "vc_dftables - Win32 Release with Win32 threads" (based on\\r
- "Win32 (x86) Console Application")\r
-!MESSAGE \r
-\r
-# Begin Project\r
-# PROP Scc_ProjName ""\r
-# PROP Scc_LocalPath ""\r
-CPP=cl.exe\r
-RSC=rc.exe\r
-\r
-!IF  "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "Release"\r
-# PROP BASE Intermediate_Dir "Release"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_dftables"\r
-# PROP Intermediate_Dir "vc_dftables"\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "Debug"\r
-# PROP BASE Intermediate_Dir "Debug"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_dftables_dbg"\r
-# PROP Intermediate_Dir "vc_dftables_dbg"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables_dbg\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "vc_dftab"\r
-# PROP BASE Intermediate_Dir "vc_dftab"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_dftables_dbg"\r
-# PROP Intermediate_Dir "vc_dftables_dbg"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables_dbg\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "vc_dfta0"\r
-# PROP BASE Intermediate_Dir "vc_dfta0"\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_dftables"\r
-# PROP Intermediate_Dir "vc_dftables"\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
-# Begin Special Build Tool\r
-OutDir=.\vc_dftables\r
-SOURCE=$(InputPath)\r
-PostBuild_Desc=Running program to generate chartables.c\r
-PostBuild_Cmds=$(OutDir)\vc_dftables.exe >$(OutDir)\..\chartables.c\r
-# End Special Build Tool\r
-\r
-!ENDIF \r
-\r
-# Begin Target\r
-\r
-# Name "vc_dftables - Win32 Release"\r
-# Name "vc_dftables - Win32 Debug"\r
-# Name "vc_dftables - Win32 Debug with Win32 threads"\r
-# Name "vc_dftables - Win32 Release with Win32 threads"\r
-# Begin Group "File Copy"\r
-\r
-# PROP Default_Filter ""\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h.win\r
-\r
-!IF  "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win\r
-WkspDir=.\r
-InputPath=..\config.h.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-       copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win\r
-WkspDir=.\r
-InputPath=..\config.h.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-       copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h.win32threads.win\r
-\r
-!IF  "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-# PROP Ignore_Default_Tool 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win32threads.win\r
-WkspDir=.\r
-InputPath=..\config.h.win32threads.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-       copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP Ignore_Default_Tool 1\r
-# Begin Custom Build - Copying config.h.win32threads.win\r
-WkspDir=.\r
-InputPath=..\config.h.win32threads.win\r
-\r
-"$(WkspDir)\..\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
-       copy "$(InputPath)" "$(WkspDir)\..\config.h"\r
-\r
-# End Custom Build\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# End Group\r
-# Begin Source File\r
-\r
-SOURCE=..\config.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\config.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\dftables.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\internal.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\maketables.c\r
-\r
-!IF  "$(CFG)" == "vc_dftables - Win32 Release"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_dftables - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\pcre.h\r
-# End Source File\r
-# End Target\r
-# End Project\r
diff --git a/pcrs.c b/pcrs.c
index 45a471b..033268a 100644 (file)
--- a/pcrs.c
+++ b/pcrs.c
@@ -1,83 +1,52 @@
-const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
+const char pcrs_rcs[] = "$Id: pcrs.c,v 1.7 2001/06/29 13:33:04 oes Exp $";
 
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/pcrs.c,v $
  *
- * Purpose     :  pcrs is a supplement to the pcre library by Philip Hazel
- *                <ph10@cam.ac.uk> and adds Perl-style substitution. That
- *                is, it mimics Perl's 's' operator. See pcrs(3) for details.
+ * Purpose     :  This is the alpha release of libpcrs. It is only published
+ *                at this early stage of development, because it is
+ *                needed for a new feature in JunkBuster.
  *
+ *                While no inconsistencies, memory leaks or functional bugs
+ *                are known at this time, there *could* be plenty ;-). Also,
+ *                Many pcre-specific options are not yet supported, and
+ *                error handling needs improvement.
+ *
+ *                pcrs is a supplement to the brilliant pcre library by Philip
+ *                Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That
+ *                is, it mimics Perl's 's' operator.
+ *
+ *                Currently, there's no documentation besides comments and the
+ *                source itself ;-)
+ *
+ *                Short note: I addition to perl's options, 'U' for ungreedy
+ *                and 't' for trivial (i.e.: ignore backrefs in the substitute)
+ *                are supported.
  *
  * Copyright   :  Written and Copyright (C) 2000, 2001 by Andreas S. Oesterhelt
  *                <andreas@oesterhelt.org>
  *
  *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU Lesser
- *                General Public License (LGPL), version 2.1, which  should
- *                be included in this distribution (see LICENSE.txt), with
- *                the exception that the permission to replace that license
- *                with the GNU General Public License (GPL) given in section
- *                3 is restricted to version 2 of the GPL.
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
  *
  *                This program is distributed in the hope that it will
  *                be useful, but WITHOUT ANY WARRANTY; without even the
  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the license for more details.
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
  *
- *                The GNU Lesser General Public License should be included
- *                with this file.  If not, you can view it at
- *                http://www.gnu.org/licenses/lgpl.html
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
  *                or write to the Free Software Foundation, Inc., 59
  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
  * Revisions   :
  *    $Log: pcrs.c,v $
- *    Revision 1.18  2002/03/08 14:17:14  oes
- *    Fixing -Wconversion warnings
- *
- *    Revision 1.17  2002/03/08 13:45:48  oes
- *    Hiding internal functions
- *
- *    Revision 1.16  2001/11/30 21:32:14  jongfoster
- *    Fixing signed/unsigned comparison (Andreas please check this!)
- *    One tab->space
- *
- *    Revision 1.15  2001/09/20 16:11:06  steudten
- *
- *    Add casting for some string functions.
- *
- *    Revision 1.14  2001/09/09 21:41:57  oes
- *    Fixing yet another silly bug
- *
- *    Revision 1.13  2001/09/06 14:05:59  oes
- *    Fixed silly bug
- *
- *    Revision 1.12  2001/08/18 11:35:00  oes
- *    - Introduced pcrs_strerror()
- *    - made some NULL arguments non-fatal
- *    - added support for \n \r \e \b \t \f \a \0 in substitute
- *    - made quoting adhere to standard rules
- *    - added warning for bad backrefs
- *    - added pcrs_execute_list()
- *    - fixed comments
- *    - bugfix & cosmetics
- *
- *    Revision 1.11  2001/08/15 15:32:03  oes
- *     - Added support for Perl's special variables $+, $' and $`
- *     - Improved the substitute parser
- *     - Replaced the hard limit for the maximum number of matches
- *       by dynamic reallocation
- *
- *    Revision 1.10  2001/08/05 13:13:11  jongfoster
- *    Making parameters "const" where possible.
- *
- *    Revision 1.9  2001/07/18 17:27:00  oes
- *    Changed interface; Cosmetics
- *
- *    Revision 1.8  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.7  2001/06/29 13:33:04  oes
  *    - Cleaned up, renamed and reordered functions,
  *      improved comments
@@ -98,12 +67,33 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
  *    - Removed create_pcrs_job() which was useless
  *    - Fixed a bug in pcrs_execute
  *    - Success flag is now handled by pcrs instead of user
+ *    - Removed logentry from cancelled commit
  *
  *    Revision 1.6  2001/06/03 19:12:45  oes
  *    added FIXME
  *
  *    Revision 1.5  2001/05/29 09:50:24  jongfoster
- *    (Fixed one int -> size_t)
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
  *
  *    Revision 1.4  2001/05/25 14:12:40  oes
  *    Fixed bug: Empty substitutes now detected
@@ -113,12 +103,48 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
  *
  *    Revision 1.2  2001/05/22 18:46:04  oes
  *
- *      Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
  *      which is selected by the (nonstandard and therefore
  *      capital) letter 'U' in the option string.
  *      It causes the quantifiers to be ungreedy by default.
  *      Appending a ? turns back to greedy (!).
  *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Some minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
  *    Revision 1.1.1.1  2001/05/15 13:59:02  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -128,71 +154,13 @@ const char pcrs_rcs[] = "$Id: pcrs.c,v 1.18 2002/03/08 14:17:14 oes Exp $";
 
 #include <pcre.h>
 #include <string.h>
-#include <ctype.h>
-
 #include "pcrs.h"
-
 const char pcrs_h_rcs[] = PCRS_H_VERSION;
 
-/*
- * Internal prototypes
- */
-
-static int              pcrs_parse_perl_options(const char *optstring, int *flags);
-static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag,
-                        int capturecount, int *errptr);
 
 /*********************************************************************
  *
- * Function    :  pcrs_strerror
- *
- * Description :  Return a string describing a given error code.
- *             
- * Parameters  :
- *          1  :  error = the error code
- *
- * Returns     :  char * to the descriptive string
- *
- *********************************************************************/
-const char *pcrs_strerror(const int error)
-{
-   if (error < 0)
-   {
-      switch (error)
-      {
-         /* Passed-through PCRE error: */
-         case PCRE_ERROR_NOMEMORY:     return "(pcre:) No memory";
-
-         /* Shouldn't happen unless PCRE or PCRS bug, or user messed with compiled job: */
-         case PCRE_ERROR_NULL:         return "(pcre:) NULL code or subject or ovector";
-         case PCRE_ERROR_BADOPTION:    return "(pcre:) Unrecognized option bit";
-         case PCRE_ERROR_BADMAGIC:     return "(pcre:) Bad magic number in code";
-         case PCRE_ERROR_UNKNOWN_NODE: return "(pcre:) Bad node in pattern";
-
-         /* Can't happen / not passed: */
-         case PCRE_ERROR_NOSUBSTRING:  return "(pcre:) Fire in power supply"; 
-         case PCRE_ERROR_NOMATCH:      return "(pcre:) Water in power supply";
-
-         /* PCRS errors: */
-         case PCRS_ERR_NOMEM:          return "(pcrs:) No memory";
-         case PCRS_ERR_CMDSYNTAX:      return "(pcrs:) Syntax error while parsing command";
-         case PCRS_ERR_STUDY:          return "(pcrs:) PCRE error while studying the pattern";
-         case PCRS_ERR_BADJOB:         return "(pcrs:) Bad job - NULL job, pattern or substitute";
-         case PCRS_WARN_BADREF:        return "(pcrs:) Backreference out of range";
-
-         /* What's that? */
-         default:  return "Unknown error";
-      }
-   }
-   /* error >= 0: No error */
-   return "(pcrs:) Everything's just fine. Thanks for asking.";
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  pcrs_parse_perl_options
+ * Function    :  pcrs_compile_perl_options
  *
  * Description :  This function parses a string containing the options to
  *                Perl's s/// operator. It returns an integer that is the
@@ -209,19 +177,16 @@ const char *pcrs_strerror(const int error)
  * Returns     :  option integer suitable for pcre 
  *
  *********************************************************************/
-static int pcrs_parse_perl_options(const char *optstring, int *flags)
+int pcrs_compile_perl_options(char *optstring, int *flags)
 {
    size_t i;
    int rc = 0;
    *flags = 0;
-
-   if (NULL == optstring) return 0;
-
-   for (i = 0; i < strlen(optstring); i++)
+   for (i=0; i < strlen(optstring); i++)
    {
       switch(optstring[i])
       {
-         case 'e': break; /* ToDo ;-) */
+         case 'e': break;
          case 'g': *flags |= PCRS_GLOBAL; break;
          case 'i': rc |= PCRE_CASELESS; break;
          case 'm': rc |= PCRE_MULTILINE; break;
@@ -229,8 +194,8 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
          case 's': rc |= PCRE_DOTALL; break;
          case 'x': rc |= PCRE_EXTENDED; break;
          case 'U': rc |= PCRE_UNGREEDY; break;
-         case 'T': *flags |= PCRS_TRIVIAL; break;
-         default: break;
+          case 'T': *flags |= PCRS_TRIVIAL; break;
+         default:  break;
       }
    }
    return rc;
@@ -250,11 +215,7 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
  * Parameters  :
  *          1  :  replacement = replacement part of s/// operator
  *                              in perl syntax
- *          2  :  trivialflag = Flag that causes backreferences to be
- *                              ignored.
- *          3  :  capturecount = Number of capturing subpatterns in
- *                               the pattern. Needed for $+ handling.
- *          4  :  errptr = pointer to an integer in which error
+ *          2  :  errptr = pointer to an integer in which error
  *                         conditions can be returned.
  *
  * Returns     :  pcrs_substitute data structure, or NULL if an
@@ -262,178 +223,89 @@ static int pcrs_parse_perl_options(const char *optstring, int *flags)
  *                the reason.
  *
  *********************************************************************/
-static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int trivialflag, int capturecount, int *errptr)
+pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr)
 {
-   int i, k, l, quoted;
-   size_t length;
-   char *text;
+   int length, i, k = 0, l = 0, quoted = 0, idx;
+   char *text, *num_ptr, *numbers = "0123456789";
    pcrs_substitute *r;
 
-   i = k = l = quoted = 0;
-
-   /*
-    * Sanity check
-    */
-   if (NULL == replacement)
-   {
-      replacement = "";
-   }
+   r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute));
+   if (r == NULL) return NULL;
+   memset(r, '\0', sizeof(pcrs_substitute));
 
-   /*
-    * Get memory or fail
-    */
-   if (NULL == (r = (pcrs_substitute *)malloc(sizeof(pcrs_substitute))))
+   text = strdup(replacement);      /* must be free()d by caller */
+   if (text  == NULL)
    {
       *errptr = PCRS_ERR_NOMEM;
+      free(r);
       return NULL;
    }
-   memset(r, '\0', sizeof(pcrs_substitute));
 
    length = strlen(replacement);
 
-   if (NULL == (text = (char *)malloc(length + 1)))
-   {
-      free(r);
-      *errptr = PCRS_ERR_NOMEM;
-      return NULL;
-   }
-   memset(text, '\0', length + 1);
-   
-
-   /*
-    * In trivial mode, just copy the substitute text
-    */
    if (trivialflag)
    {
-      text = strncpy(text, replacement, length + 1);
-      k = length;
+       k = length;
    }
-
-   /*
-    * Else, parse, cut out and record all backreferences
-    */
    else
    {
-      while (i < (int)length)
+      for (i=0; i < length; i++)
       {
-         /* Quoting */
+         /* Backslash treatment */
          if (replacement[i] == '\\')
          {
             if (quoted)
             {
-               text[k++] = replacement[i++];
+               text[k++] = replacement[i];
                quoted = 0;
             }
             else
             {
-               if (replacement[i+1] && strchr("tnrfae0", replacement[i+1]))
-               {
-                  switch (replacement[++i])
-                  {
-                  case 't':
-                     text[k++] = '\t';
-                     break;
-                  case 'n':
-                     text[k++] = '\n';
-                     break;
-                  case 'r':
-                     text[k++] = '\r';
-                     break;
-                  case 'f':
-                     text[k++] = '\f';
-                     break;
-                  case 'a':
-                     text[k++] = 7;
-                     break;
-                  case 'e':
-                     text[k++] = 27;
-                     break;
-                  case '0':
-                     text[k++] = '\0';
-                     break;
-                  }
-                  i++;
-               }
-               else
-               {
-                  quoted = 1;
-                  i++;
-               }
+               quoted = 1;
             }
             continue;
          }
 
-         /* Backreferences */
-         if (replacement[i] == '$' && !quoted && i < (int)(length - 1))
+         /* Dollar treatment */
+         if (replacement[i] == '$' && !quoted && i < length - 1)
          {
-            char *symbol, symbols[] = "'`+&";
-            r->block_length[l] = k - r->block_offset[l];
-
-            /* Numerical backreferences */
-            if (isdigit((int)replacement[i + 1]))
+            if (strchr("0123456789&", replacement[i + 1]) == NULL)
             {
-               while (i < (int)length && isdigit((int)replacement[++i]))
-               {
-                  r->backref[l] = r->backref[l] * 10 + replacement[i] - 48;
-               }
-               if (r->backref[l] > capturecount)
-               {
-                  *errptr = PCRS_WARN_BADREF;
-               }
+               text[k++] = replacement[i];
             }
-
-            /* Symbolic backreferences: */
-            else if (NULL != (symbol = strchr(symbols, replacement[i + 1])))
+            else
             {
-               
-               if (symbol - symbols == 2) /* $+ */
+               r->block_length[l] = k - r->block_offset[l];
+               r->backref[l] = 0;
+               if (replacement[i + 1] != '&')
                {
-                  r->backref[l] = capturecount;
-               }
-               else if (symbol - symbols == 3) /* $& */
-               {
-                  r->backref[l] = 0;
-               }
-               else /* $' or $` */
-               {
-                  r->backref[l] = PCRS_MAX_SUBMATCHES + 1 - (symbol - symbols);
+                  while ((num_ptr = strchr(numbers, replacement[++i])) != NULL && i < length)
+                  {
+                     idx = num_ptr - numbers;
+                     r->backref[l] = r->backref[l] * 10 + idx;
+                  }
+                  i--;
                }
-               i += 2;
-            }
-
-            /* Invalid backref -> plain '$' */
-            else
-            {
-               goto plainchar;
-            }
-
-            /* Valid and in range? -> record */
-            if (r->backref[l] < PCRS_MAX_SUBMATCHES + 2)
-            {
-               r->backref_count[r->backref[l]] += 1;
-               r->block_offset[++l] = k;
+               else
+                  i++;
+               if (r->backref[l] < PCRS_MAX_SUBMATCHES)
+                  r->backref_count[r->backref[l]] += 1;
+               l++;
+               r->block_offset[l] = k;
             }
-            else
-            {
-               *errptr = PCRS_WARN_BADREF;
-            }   
             continue;
          }
-         
-plainchar:
-         /* Plain chars are copied */
-         text[k++] = replacement[i++];
+
+         /* Plain char treatment */
+         text[k++] = replacement[i];
          quoted = 0;
       }
    } /* -END- if (!trivialflag) */
 
-   /*
-    * Finish & return
-    */
+   text[k] = '\0';
    r->text = text;
    r->backrefs = l;
    r->block_length[l] = k - r->block_offset[l];
-
    return r;
 
 }
@@ -444,7 +316,8 @@ plainchar:
  * Function    :  pcrs_free_job
  *
  * Description :  Frees the memory used by a pcrs_job struct and its
- *                dependant structures.
+ *                dependant structures. Returns a pointer to the next
+ *                job, if there was any, or NULL otherwise.
  *
  * Parameters  :
  *          1  :  job = pointer to the pcrs_job structure to be freed
@@ -477,7 +350,6 @@ pcrs_job *pcrs_free_job(pcrs_job *job)
 
 }
 
-
 /*********************************************************************
  *
  * Function    :  pcrs_free_joblist
@@ -503,12 +375,11 @@ void pcrs_free_joblist(pcrs_job *joblist)
 
 /*********************************************************************
  *
- * Function    :  pcrs_compile_command
+ * Function    :  pcrs_compile
  *
- * Description :  Parses a string with a Perl-style s/// command, 
- *                calls pcrs_compile, and returns a corresponding
- *                pcrs_job, or NULL if parsing or compiling the job
- *                fails.
+ * Description :  Main entry point. Takes a string with a Perl-style
+ *                s/// command and returns a corresponding pcrs_job,
+ *                or NULL if compiling the job fails at any stage.
  *
  * Parameters  :
  *          1  :  command = string with perl-style s/// command
@@ -520,16 +391,15 @@ void pcrs_free_joblist(pcrs_job *joblist)
  *                has the reason.
  *
  *********************************************************************/
-pcrs_job *pcrs_compile_command(const char *command, int *errptr)
+pcrs_job *pcrs_compile(char *command, int *errptr)
 {
-   int i, k, l, quoted = FALSE;
-   size_t limit;
+   int i, k, l, limit, quoted = FALSE;
    char delimiter;
    char *tokens[4];   
    pcrs_job *newjob;
-   
+
    i = k = l = 0;
-   
+
    /*
     * Tokenize the perl command
     */
@@ -541,38 +411,36 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
    }
    else
    {
-      delimiter = command[1];
+     delimiter = command[1];
    }
 
    tokens[l] = (char *) malloc(limit + 1);
 
-   for (i = 0; i <= (int)limit; i++)
+   for (i=0; i <= limit; i++)
    {
-      
+
       if (command[i] == delimiter && !quoted)
       {
-         if (l == 3)
-         {
-            l = -1;
+          if (l == 3)
+               {
+                  l = -1;
             break;
          }
-         tokens[0][k++] = '\0';
+          tokens[0][k++] = '\0';
          tokens[++l] = tokens[0] + k;
          continue;
       }
-      
-      else if (command[i] == '\\' && !quoted)
+
+      else if (command[i] == '\\' && !quoted && i+1 < limit && command[i+1] == delimiter)
       {
          quoted = TRUE;
-         if (command[i+1] == delimiter) continue;
-      }
-      else
-      {
-         quoted = FALSE;
+         continue;
       }
       tokens[0][k++] = command[i];
+      quoted = FALSE;
    }
 
+
    /*
     * Syntax error ?
     */
@@ -582,17 +450,17 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
       free(tokens[0]);
       return NULL;
    }
-   
-   newjob = pcrs_compile(tokens[1], tokens[2], tokens[3], errptr);
+
+   newjob = pcrs_make_job(tokens[1], tokens[2], tokens[3], errptr);
    free(tokens[0]);
    return newjob;
-   
+
 }
 
 
 /*********************************************************************
  *
- * Function    :  pcrs_compile
+ * Function    :  pcrs_make_job
  *
  * Description :  Takes the three arguments to a perl s/// command
  *                and compiles a pcrs_job structure from them.
@@ -609,21 +477,18 @@ pcrs_job *pcrs_compile_command(const char *command, int *errptr)
  *                has the reason.
  *
  *********************************************************************/
-pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr)
+pcrs_job *pcrs_make_job(char *pattern, char *substitute, char *options, int *errptr)
 {
    pcrs_job *newjob;
    int flags;
-   int capturecount;
    const char *error;
 
-   *errptr = 0;
-
    /* 
     * Handle NULL arguments
     */
    if (pattern == NULL) pattern = "";
    if (substitute == NULL) substitute = "";
-
+   if (options == NULL) options = "";
 
    /* 
     * Get and init memory
@@ -639,7 +504,7 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
    /*
     * Evaluate the options
     */
-   newjob->options = pcrs_parse_perl_options(options, &flags);
+   newjob->options = pcrs_compile_perl_options(options, &flags);
    newjob->flags = flags;
 
 
@@ -667,21 +532,10 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
    }
  
 
-   /* 
-    * Determine the number of capturing subpatterns. 
-    * This is needed for handling $+ in the substitute.
-    */
-   if (0 > (*errptr = pcre_fullinfo(newjob->pattern, newjob->hints, PCRE_INFO_CAPTURECOUNT, &capturecount)))
-   {
-      pcrs_free_job(newjob);
-      return NULL;
-   }
-
    /*
     * Compile the substitute
     */
-   if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, capturecount, errptr)))
+   if (NULL == (newjob->substitute = pcrs_compile_replacement(substitute, newjob->flags & PCRS_TRIVIAL, errptr)))
    {
       pcrs_free_job(newjob);
       return NULL;
@@ -692,73 +546,16 @@ pcrs_job *pcrs_compile(const char *pattern, const char *substitute, const char *
 }
 
 
-/*********************************************************************
- *
- * Function    :  pcrs_execute_list
- *
- * Description :  This is a multiple job wrapper for pcrs_execute().
- *                Apply the regular substitutions defined by the jobs in
- *                the joblist to the subject.
- *                The subject itself is left untouched, memory for the result
- *                is malloc()ed and it is the caller's responsibility to free
- *                the result when it's no longer needed.
- *
- * Parameters  :
- *          1  :  joblist = the chained list of pcrs_jobs to be executed
- *          2  :  subject = the subject string
- *          3  :  subject_length = the subject's length 
- *                INCLUDING the terminating zero, if string!
- *          4  :  result = char** for returning  the result 
- *          5  :  result_length = size_t* for returning the result's length
- *
- * Returns     :  On success, the number of substitutions that were made.
- *                 May be > 1 if job->flags contained PCRS_GLOBAL
- *                On failiure, the (negative) pcre error code describing the
- *                 failiure, which may be translated to text using pcrs_strerror().
- *
- *********************************************************************/
-int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length)
-{
-   pcrs_job *job;
-   char *old, *new;
-   int hits, total_hits;
-   old = subject;
-   *result_length = subject_length;
-   hits = total_hits = 0;
-
-   for (job = joblist; job != NULL; job = job->next)
-   {
-      hits = pcrs_execute(job, old, *result_length, &new, result_length);
-
-      if (old != subject) free(old);
-
-      if (hits < 0)
-      {
-         return(hits);
-      }
-      else
-      {
-         total_hits += hits;
-         old = new;
-      }
-   }
-
-   *result = new;
-   return(total_hits);
-
-}
-
-
 /*********************************************************************
  *
  * Function    :  pcrs_execute
  *
- * Description :  Apply the regular substitution defined by the job to the
- *                subject.
- *                The subject itself is left untouched, memory for the result
- *                is malloc()ed and it is the caller's responsibility to free
- *                the result when it's no longer needed.
+ * Description :  Modify the subject by executing the regular substitution
+ *                defined by the job. Since the result may be longer than
+ *                the subject, its space requirements are precalculated in
+ *                the matching phase and new memory is allocated accordingly.
+ *                It is the caller's responsibility to free the result when
+ *                it's no longer needed.
  *
  * Parameters  :
  *          1  :  job = the pcrs_job to be executed
@@ -766,30 +563,26 @@ int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c
  *          3  :  subject_length = the subject's length 
  *                INCLUDING the terminating zero, if string!
  *          4  :  result = char** for returning  the result 
- *          5  :  result_length = size_t* for returning the result's length
+ *          5  :  result_length = int* for returning the result's length
  *
- * Returns     :  On success, the number of substitutions that were made.
- *                 May be > 1 if job->flags contained PCRS_GLOBAL
- *                On failiure, the (negative) pcre error code describing the
- *                 failiure, which may be translated to text using pcrs_strerror().
+ * Returns     :  the number of substitutions that were made. May be > 1
+ *                if job->flags contained PCRS_GLOBAL
  *
  *********************************************************************/
-int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length)
+int pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length)
 {
    int offsets[3 * PCRS_MAX_SUBMATCHES],
-       offset,
-       i, k,
+       offset, i, k,
        matches_found,
-       submatches,
-       max_matches = PCRS_MAX_MATCH_INIT;
-   size_t newsize;
-   pcrs_match *matches, *dummy;
+       newsize,
+       submatches;
+   pcrs_match matches[PCRS_MAX_MATCHES];
    char *result_offset;
 
    offset = i = k = 0;
 
    /* 
-    * Sanity check & memory allocation
+    * Sanity check
     */
    if (job == NULL || job->pattern == NULL || job->substitute == NULL)
    {
@@ -797,26 +590,18 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       return(PCRS_ERR_BADJOB);
    }
 
-   if (NULL == (matches = (pcrs_match *)malloc(max_matches * sizeof(pcrs_match))))
-   {
-      *result = NULL;
-      return(PCRS_ERR_NOMEM);
-   }
-   memset(matches, '\0', max_matches * sizeof(pcrs_match));
-
-
+   
    /*
     * Find the pattern and calculate the space
-    * requirements for the result
+    * requirements for the result (newsize)
     */
-   newsize = subject_length;
+   newsize=subject_length;
 
-   while ((submatches = pcre_exec(job->pattern, job->hints, subject, (int)subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0)
+   while ((submatches = pcre_exec(job->pattern, job->hints, subject, subject_length, offset, 0, offsets, 3 * PCRS_MAX_SUBMATCHES)) > 0)
    {
       job->flags |= PCRS_SUCCESS;
       matches[i].submatches = submatches;
-
-      for (k = 0; k < submatches; k++)
+      for (k=0; k < submatches; k++)
       {
          matches[i].submatch_offset[k] = offsets[2 * k];
 
@@ -829,35 +614,12 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       /* plus replacement text size minus match text size */
       newsize += strlen(job->substitute->text) - matches[i].submatch_length[0]; 
 
-      /* chunk before match */
-      matches[i].submatch_offset[PCRS_MAX_SUBMATCHES] = 0;
-      matches[i].submatch_length[PCRS_MAX_SUBMATCHES] = offsets[0];
-      newsize += offsets[0] * job->substitute->backref_count[PCRS_MAX_SUBMATCHES];
-
-      /* chunk after match */
-      matches[i].submatch_offset[PCRS_MAX_SUBMATCHES + 1] = offsets[1];
-      matches[i].submatch_length[PCRS_MAX_SUBMATCHES + 1] = subject_length - offsets[1] - 1;
-      newsize += (subject_length - offsets[1]) * job->substitute->backref_count[PCRS_MAX_SUBMATCHES + 1];
-
-      /* Storage for matches exhausted? -> Extend! */
-      if (++i >= max_matches)
-      {
-         max_matches = (int)(max_matches * PCRS_MAX_MATCH_GROW);
-         if (NULL == (dummy = (pcrs_match *)realloc(matches, max_matches * sizeof(pcrs_match))))
-         {
-            free(matches);
-            *result = NULL;
-            return(PCRS_ERR_NOMEM);
-         }
-         matches = dummy;
-      }
-
       /* Non-global search or limit reached? */
-      if (!(job->flags & PCRS_GLOBAL)) break;
+      if (++i >= PCRS_MAX_MATCHES || !(job->flags & PCRS_GLOBAL) ) break;
 
       /* Don't loop on empty matches */
       if (offsets[1] == offset)
-         if ((size_t)offset < subject_length)
+         if (offset < subject_length)
             offset++;
          else
             break;
@@ -865,12 +627,8 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
       else
          offset = offsets[1];
    }
-   /* Pass pcre error through if (bad) failiure */
-   if (submatches < PCRE_ERROR_NOMATCH)
-   {
-      free(matches);
-      return submatches;   
-   }
+   /* Pass pcre error through if failiure*/
+   if (submatches < -1) return submatches;   
    matches_found = i;
 
 
@@ -879,7 +637,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
     */
    if ((*result = (char *)malloc(newsize)) == NULL)   /* must be free()d by caller */
    {
-      free(matches);
       return PCRS_ERR_NOMEM;
    }
 
@@ -890,27 +647,27 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
    offset = 0;
    result_offset = *result;
 
-   for (i = 0; i < matches_found; i++)
+   for (i=0; i < matches_found; i++)
    {
       /* copy the chunk preceding the match */
-      memcpy(result_offset, subject + offset, (size_t)matches[i].submatch_offset[0] - offset); 
+      memcpy(result_offset, subject + offset, matches[i].submatch_offset[0] - offset); 
       result_offset += matches[i].submatch_offset[0] - offset;
 
       /* For every segment of the substitute.. */
-      for (k = 0; k <= job->substitute->backrefs; k++)
+      for (k=0; k <= job->substitute->backrefs; k++)
       {
          /* ...copy its text.. */
          memcpy(result_offset, job->substitute->text + job->substitute->block_offset[k], job->substitute->block_length[k]);
          result_offset += job->substitute->block_length[k];
 
-         /* ..plus, if it's not the last chunk, i.e.: There *is* a backref.. */
+         /* ..plus, if it's not the last chunk (i.e.: There IS a backref).. */
          if (k != job->substitute->backrefs
-             /* ..in legal range.. */
-             && job->substitute->backref[k] < PCRS_MAX_SUBMATCHES + 2
-             /* ..and referencing a nonempty match.. */
-             && matches[i].submatch_length[job->substitute->backref[k]] > 0)
+             /* ..and a nonempty match.. */
+             && matches[i].submatch_length[job->substitute->backref[k]] > 0
+             /* ..and in legal range, ... */
+             && job->substitute->backref[k] <= PCRS_MAX_SUBMATCHES)
          {
-            /* ..copy the submatch that is ref'd. */
+            /* copy the submatch that is ref'd. */
             memcpy(
                result_offset,
                subject + matches[i].submatch_offset[job->substitute->backref[k]],
@@ -926,7 +683,6 @@ int pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **res
    memcpy(result_offset, subject + offset, subject_length - offset);
 
    *result_length = newsize;
-   free(matches);
    return matches_found;
 
 }
diff --git a/pcrs.h b/pcrs.h
index a14b816..6b635fb 100644 (file)
--- a/pcrs.h
+++ b/pcrs.h
@@ -1,41 +1,31 @@
-#ifndef PCRS_H_INCLUDED
-#define PCRS_H_INCLUDED
+#ifndef _PCRS_H
+#define _PCRS_H
 
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/pcrs.h,v $
  *
- * Purpose     :  Header file for pcrs.c
+ * Purpose     :  This is the pre-pre-alpha realease of libpcrs. It is only
+ *                published at this (ugly) stage of development, because it is
+ *                needed for a new feature in JunkBuster.
  *
- * Copyright   :  see pcrs.c
+ *                Apart from the code being quite a mess, no inconsistencies,
+ *                memory leaks or functional bugs **should** be present.
  *
- * Revisions   :
- *    $Log: pcrs.h,v $
- *    Revision 1.10  2002/03/08 13:44:48  oes
- *    Hiding internal functions, preventing double inclusion of pcre.h
- *
- *    Revision 1.9  2001/08/18 11:35:29  oes
- *    - Introduced pcrs_strerror()
- *    - added pcrs_execute_list()
- *
- *    Revision 1.8  2001/08/15 15:32:50  oes
- *    Replaced the hard limit for the maximum number of matches
- *    by dynamic reallocation
- *
- *    Revision 1.7  2001/08/05 13:13:11  jongfoster
- *    Making parameters "const" where possible.
+ *                While you ROTFL at the code, you could just as well mail me
+ *                (oes@paradis.rhein.de) with advice for improvement.
  *
- *    Revision 1.6  2001/07/29 18:52:06  jongfoster
- *    Renaming _PCRS_H, and adding "extern C {}"
+ *                pcrs is a supplement to the brilliant pcre library by Philip
+ *                Hazel (ph10@cam.ac.uk) and adds Perl-style substitution. That
+ *                is, it mimics Perl's 's' operator.
  *
- *    Revision 1.5  2001/07/18 17:27:00  oes
- *    Changed interface; Cosmetics
+ *                Currently, there's no documentation besides comments and the
+ *                source itself ;-)
  *
- *    Revision 1.4  2001/06/29 13:33:19  oes
- *    - Cleaned up, commented and adapted to reflect the
- *      changes in pcrs.c
- *    - Introduced the PCRS_* flags
+ * Copyright   :  Written and copyright 2001 by Sourceforge IJBSWA team.
  *
+ * Revisions   :
+ *    $Log: pcrs.h,v $
  *    Revision 1.3  2001/06/09 10:58:57  jongfoster
  *    Removing a single unused #define which referenced BUFSIZ
  *
  *
  *********************************************************************/
 
-#define PCRS_H_VERSION "$Id: pcrs.h,v 1.10 2002/03/08 13:44:48 oes Exp $"
+#define PCRS_H_VERSION "$Id: pcrs.h,v 1.3 2001/06/09 10:58:57 jongfoster Exp $"
 \f
 
-#ifndef _PCRE_H
 #include <pcre.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
 
 /*
  * Constants:
@@ -78,88 +62,68 @@ extern "C" {
 #define TRUE 1
 
 /* Capacity */
-#define PCRS_MAX_SUBMATCHES  33     /* Maximum number of capturing subpatterns allowed. MUST be <= 99! FIXME: Should be dynamic */
-#define PCRS_MAX_MATCH_INIT  40     /* Initial amount of matches that can be stored in global searches */
-#define PCRS_MAX_MATCH_GROW  1.6    /* Factor by which storage for matches is extended if exhausted */
+#define PCRS_MAX_MATCHES 300
+#define PCRS_MAX_SUBMATCHES 33
 
 /* Error codes */
 #define PCRS_ERR_NOMEM     -10      /* Failed to acquire memory. */
 #define PCRS_ERR_CMDSYNTAX -11      /* Syntax of s///-command */
 #define PCRS_ERR_STUDY     -12      /* pcre error while studying the pattern */
 #define PCRS_ERR_BADJOB    -13      /* NULL job pointer, pattern or substitute */
-#define PCRS_WARN_BADREF   -14      /* Backreference out of range */
 
 /* Flags */
 #define PCRS_GLOBAL          1      /* Job should be applied globally, as with perl's g option */
-#define PCRS_TRIVIAL         2      /* Backreferences in the substitute are ignored */
-#define PCRS_SUCCESS         4      /* Job did previously match */
-
+#define PCRS_SUCCESS         2      /* Job did previously match */
+#define PCRS_TRIVIAL         4      /* No backreferences need to be parsed in the substitute */
 
 /*
  * Data types:
  */
 
 /* A compiled substitute */
-
-typedef struct {
-  char  *text;                                   /* The plaintext part of the substitute, with all backreferences stripped */
-  int    backrefs;                               /* The number of backreferences */
-  int    block_offset[PCRS_MAX_SUBMATCHES];      /* Array with the offsets of all plaintext blocks in text */
-  size_t block_length[PCRS_MAX_SUBMATCHES];      /* Array with the lengths of all plaintext blocks in text */
-  int    backref[PCRS_MAX_SUBMATCHES];           /* Array with the backref number for all plaintext block borders */
-  int    backref_count[PCRS_MAX_SUBMATCHES + 2]; /* Array with the number of references to each backref index */
+typedef struct S_PCRS_SUBSTITUTE {
+  char *text;                               /* The plaintext part of the substitute, with all backreferences stripped */
+  int backrefs;                             /* The number of backreferences */
+  int block_offset[PCRS_MAX_SUBMATCHES];    /* Array with the offsets of all plaintext blocks in text */
+  int block_length[PCRS_MAX_SUBMATCHES];    /* Array with the lengths of all plaintext blocks in text */
+  int backref[PCRS_MAX_SUBMATCHES];         /* Array with the backref number for all plaintext block borders */
+  int backref_count[PCRS_MAX_SUBMATCHES];   /* Array with the number of reference to each backref index */
 } pcrs_substitute;
 
-
-/*
- * A match, including all captured subpatterns (submatches)
- * Note: The zeroth is the whole match, the PCRS_MAX_SUBMATCHES + 0th
- * is the range before the match, the PCRS_MAX_SUBMATCHES + 1th is the
- * range after the match.
- */
-
-typedef struct {
-  int    submatches;                               /* Number of captured subpatterns */
-  int    submatch_offset[PCRS_MAX_SUBMATCHES + 2]; /* Offset for each submatch in the subject */
-  size_t submatch_length[PCRS_MAX_SUBMATCHES + 2]; /* Length of each submatch in the subject */
+typedef struct S_PCRS_MATCH {
+  /* char *buffer; */
+  int submatches;                           /* Number of submatches. Note: The zeroth is the whole match */
+  int submatch_offset[PCRS_MAX_SUBMATCHES]; /* Offset for each submatch in the subject */
+  int submatch_length[PCRS_MAX_SUBMATCHES]; /* Length of each submatch in the subject */
 } pcrs_match;
 
-
-/* A PCRS job */
-
-typedef struct PCRS_JOB {
+typedef struct S_PCRS_JOB {
   pcre *pattern;                            /* The compiled pcre pattern */
   pcre_extra *hints;                        /* The pcre hints for the pattern */
   int options;                              /* The pcre options (numeric) */
   int flags;                                /* The pcrs and user flags (see "Flags" above) */
-  pcrs_substitute *substitute;              /* The compiled pcrs substitute */
-  struct PCRS_JOB *next;                    /* Pointer for chaining jobs to joblists */
+  pcrs_substitute *substitute;              /* The compiles pcrs substitute */
+  struct S_PCRS_JOB *next;                  /* Pointer for chaining jobs to joblists */
 } pcrs_job;
 
-
 /*
  * Prototypes:
  */
 
 /* Main usage */
-extern pcrs_job        *pcrs_compile_command(const char *command, int *errptr);
-extern pcrs_job        *pcrs_compile(const char *pattern, const char *substitute, const char *options, int *errptr);
-extern int              pcrs_execute(pcrs_job *job, char *subject, size_t subject_length, char **result, size_t *result_length);
-extern int              pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, char **result, size_t *result_length);
+extern pcrs_job        *pcrs_compile(char *command, int *errptr);
+extern pcrs_job        *pcrs_make_job(char *pattern, char *substitute, char *options, int *errptr);
+extern int              pcrs_execute(pcrs_job *job, char *subject, int subject_length, char **result, int *result_length);
 
 /* Freeing jobs */
 extern pcrs_job        *pcrs_free_job(pcrs_job *job);
 extern void             pcrs_free_joblist(pcrs_job *joblist);
 
-/* Info on errors: */
-extern const char *pcrs_strerror(const int error);
-
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
+/* Expert usage */
+extern int              pcrs_compile_perl_options(char *optstring, int *flags);
+extern pcrs_substitute *pcrs_compile_replacement(char *replacement, int trivialflag, int *errptr);
 
-#endif /* ndef PCRS_H_INCLUDED */
+#endif /* ndef _PCRS_H */
 
 /*
   Local Variables:
diff --git a/privoxy-rh.spec b/privoxy-rh.spec
deleted file mode 100644 (file)
index 87c0810..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-# $Id: privoxy-rh.spec,v 1.16 2002/03/26 22:29:55 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-# Defines should happen in the begining of the file
-%define veryoldname junkbust
-%define oldname junkbuster
-%define privoxyconf %{_sysconfdir}/%{name}
-
-Name: privoxy
-# ATTENTION
-# Version and release should be updated acordingly on configure.in and
-# configure. Otherwise, the package can be build with the wrong value
-Version: 2.9.13
-Release: 3
-Summary: Privoxy - privacy enhancing proxy
-License: GPL
-Vendor: http://www.privoxy.org
-Source0: http://www.waldherr.org/%{name}/%{name}-%{version}.tar.gz
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-Group: Networking/Utilities
-URL: http://www.privoxy.org/
-Obsoletes: junkbuster-raw junkbuster-blank junkbuster
-# Prereq: /usr/sbin/useradd , /sbin/chkconfig , /sbin/service 
-Prereq: shadow-utils, chkconfig, initscripts, sh-utils
-BuildRequires: perl gzip sed docbook-utils libtool autoconf
-Conflicts: junkbuster-raw junkbuster-blank junkbuster
-
-%description 
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy has application
-for both stand-alone systems and multi-user networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-%prep
-%setup -q -c
-
-%build
-autoheader
-autoconf
-%configure
-make 
-make redhat-dok
-
-## Explicitily stripping is not recomended.
-## This is handled altomaticaly by RPM, and can couse troubles if
-## anyone wants to build an unstriped version - morcego
-#strip %{name}
-
-%install
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-mkdir -p %{buildroot}%{_sbindir} \
-         %{buildroot}%{_mandir}/man1 \
-         %{buildroot}%{_localstatedir}/log/%{name} \
-         %{buildroot}%{privoxyconf}/templates \
-         %{buildroot}%{_sysconfdir}/logrotate.d \
-         %{buildroot}%{_sysconfdir}/rc.d/init.d 
-
-## Manual gziping of manpages should not be done, once it can
-## break the building on some distributions. Anyway, rpm does it
-## automagicaly these days
-## Gziping the documentation files is not recomended - morcego
-#gzip README AUTHORS ChangeLog %{name}.1 || /bin/true
-
-install -s -m 744 %{name} %{buildroot}%{_sbindir}/%{name}
-
-cp -f %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1
-cp -f *.action %{buildroot}%{privoxyconf}/
-cp -f default.filter %{buildroot}%{privoxyconf}/default.filter
-cp -f trust %{buildroot}%{privoxyconf}/trust
-cp -f templates/*  %{buildroot}%{privoxyconf}/templates/
-cp -f %{name}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name}
-install -m 755 %{name}.init %{buildroot}%{_sysconfdir}/rc.d/init.d/%{name}
-install -m 711 -d %{buildroot}%{_localstatedir}/log/%{name}
-
-# verify all file locations, etc. in the config file
-# don't start with ^ or commented lines are not replaced
-## Changing the sed paramter delimiter to @, so we don't have to
-## escape the slashes
-cat config | \
-    sed 's@^confdir.*@confdir %{privoxyconf}@g' | \
-#    sed 's/^permissionsfile.*/permissionsfile \/etc\/%{name}\/permissionsfile/g' | \
-#    sed 's/^filterfile.*/default.filter \/etc\/%{name}\/default.filter/g' | \
-#    sed 's/^logfile.*/logfile \%{_localstatedir}\/log\/%{name}\/logfile/g' | \
-#    sed 's/^jarfile.*/jarfile \%{_localstatedir}\/log\/%{name}\/jarfile/g' | \
-#    sed 's/^forward.*/forward \/etc\/%{name}\/forward/g' | \
-#    sed 's/^aclfile.*/aclfile \/etc\/%{name}\/aclfile/g' > \
-    sed 's@^logdir.*@logdir %{_localstatedir}/log/%{name}@g' > \
-    %{buildroot}%{privoxyconf}/config
-perl -pe 's/{-no-cookies}/{-no-cookies}\n\.redhat.com/' default.action >\
-    %{buildroot}%{privoxyconf}/default.action
-
-
-# Creating ghost init files
-mkdir -p %{buildroot}/%{_sysconfdir}/rc.d/rc{0,1,2,3,4,5,6}.d
-for i in 0 1 4 6
-do
-ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/K09%{name}
-done
-for i in 2 3 5
-do
-ln -sf ../init.d/%{name} %{buildroot}/%{_sysconfdir}/rc.d/rc${i}.d/S84%{name}
-done
-
-## Macros are expanded even on commentaries. So, we have to use %%
-## -- morcego
-#%%makeinstall
-
-%pre
-# This is where we handle old usernames (junkbust and junkbuster)
-# I'm not sure we should do that, but this is the way we have been
-# doing it for some time now -- morcego
-# We should do it for the group as well -- morcego
-# Doing it by brute force. Much cleaner (no more Mr. Nice Guy) -- morcego
-
-# Change the group name. Remove anything left behind.
-groupmod -n %{name} %{oldname} > /dev/null 2>&1 ||:
-groupmod -n %{name} %{veryoldname} > /dev/null 2>&1 ||:
-groupdel %{oldname} > /dev/null 2>&1 ||:
-groupdel %{veryoldname} > /dev/null 2>&1 ||:
-
-# Same for username
-usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{oldname} > /dev/null 2>&1 || :
-usermod -l %{name} -d %{_sysconfdir}/%{name} -s "" %{veryoldname} > /dev/null 2>&1 || :
-userdel %{oldname} > /dev/null 2>&1 ||:
-userdel %{veryoldname} > /dev/null 2>&1 ||:
-
-# Check to see if everything is okey. Create user if it still does not
-# exist
-id %{name} > /dev/null 2>&1
-if [ $? -eq 1 ]; then
-       /usr/sbin/useradd -d %{_sysconfdir}/%{name} -r -s "" %{name} > /dev/null 2>&1 
-fi
-
-%post
-# for upgrade from 2.0.x
-[ -f %{_localstatedir}/log/%{oldname}/logfile ] &&\
- mv -f %{_localstatedir}/log/%{oldname}/logfile %{_localstatedir}/log/%{name}/logfile || /bin/true
-[ -f %{_localstatedir}/log/%{name}/%{name} ] &&\
- mv -f %{_localstatedir}/log/%{name}/%{name} %{_localstatedir}/log/%{name}/logfile || /bin/true
-chown -R %{name}:%{name} %{_localstatedir}/log/%{name} 2>/dev/null
-chown -R %{name}:%{name} /etc/%{name} 2>/dev/null
-if [ "$1" = "1" ]; then
-       /sbin/service %{name} condrestart > /dev/null 2>&1
-fi
-
-%preun
-/sbin/service %{veryoldname} stop > /dev/null 2>&1 ||:
-/sbin/service %{oldname} stop > /dev/null 2>&1 ||:
-
-if [ "$1" = "0" ]; then
-       /sbin/service %{name} stop > /dev/null 2>&1 ||:
-       # No need to use chkconfig. The %%ghost files will handle it
-fi
-
-%postun
-#if [ "$1" -ge "1" ]; then
-#      /sbin/service %{name} condrestart > /dev/null 2>&1
-#fi
-# We only remove it we this is not an upgrade
-if [ "$1" = "0" ]; then
-       id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true
-fi
-
-%clean
-[ "%{buildroot}" != "/" ] && rm -rf %{buildroot}
-
-%files
-%defattr(0644,root,root,0755)
-%doc README AUTHORS ChangeLog
-%doc doc/text/developer-manual.txt doc/text/user-manual.txt
-%doc doc/webserver/developer-manual
-%doc doc/webserver/user-manual
-%doc doc/webserver/faq
-%doc doc/webserver/ijb_docs.css
-
-%dir %{privoxyconf}
-%dir %{privoxyconf}/templates
-%attr(0744,%{name},%{name}) %dir %{_localstatedir}/log/%{name}
-
-%attr(0744,%{name},%{name})%{_sbindir}/%{name}
-
-# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
-# We should not use wildchars here. This could mask missing files problems
-# -- morcego
-# WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
-%config %{privoxyconf}/config
-%config %{privoxyconf}/advanced.action
-%config %{privoxyconf}/basic.action
-%config %{privoxyconf}/intermediate.action
-%config %{privoxyconf}/default.action
-%config %{privoxyconf}/default.filter
-%config %{privoxyconf}/trust
-
-%config %{privoxyconf}/templates/blocked
-%config %{privoxyconf}/templates/blocked-compact
-%config %{privoxyconf}/templates/cgi-error-404
-%config %{privoxyconf}/templates/cgi-error-bad-param
-%config %{privoxyconf}/templates/cgi-error-disabled
-%config %{privoxyconf}/templates/cgi-error-file
-%config %{privoxyconf}/templates/cgi-error-modified
-%config %{privoxyconf}/templates/cgi-error-parse
-%config %{privoxyconf}/templates/connect-failed
-%config %{privoxyconf}/templates/default
-%config %{privoxyconf}/templates/edit-actions-add-url-form
-%config %{privoxyconf}/templates/edit-actions-for-url
-%config %{privoxyconf}/templates/edit-actions-list
-%config %{privoxyconf}/templates/edit-actions-list-section
-%config %{privoxyconf}/templates/edit-actions-list-url
-%config %{privoxyconf}/templates/edit-actions-remove-url-form
-%config %{privoxyconf}/templates/edit-actions-url-form
-%config %{privoxyconf}/templates/no-such-domain
-%config %{privoxyconf}/templates/show-request
-%config %{privoxyconf}/templates/show-status
-%config %{privoxyconf}/templates/show-status-file
-%config %{privoxyconf}/templates/show-url-info
-%config %{privoxyconf}/templates/show-version
-%config %{privoxyconf}/templates/toggle
-%config %{privoxyconf}/templates/toggle-mini
-%config %{privoxyconf}/templates/untrusted
-%config %{privoxyconf}/templates/edit-actions-for-url-filter
-%config %{_sysconfdir}/logrotate.d/%{name}
-%config %attr(0744,root,root) %{_sysconfdir}/rc.d/init.d/%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc0.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc1.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc2.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc3.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc4.d/K09%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc5.d/S84%{name}
-%ghost %attr(-,root,root) %{_sysconfdir}/rc.d/rc6.d/K09%{name}
-
-%{_mandir}/man1/%{name}.*
-
-%changelog
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Fix typo in Description.
-
-* Tue Mar 26 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ privoxy-2.9.13-3
-- Added commentary asking to update the release value on the configure
-  script
-
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Added the missing edit-actions-for-url-filter to templates.
-
-* Mon Mar 25 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ privoxy-2.9.13-2
-- Fixing Release number
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-2
-- Added faq to docs.
-
-* Sun Mar 24 2002 Rodrigo Barbosa <rodrigob@suespammers.org>
-+ privoxy-2.9.13-2
-- Fixed the init files entries. Now we use %%ghost
-- improved username (and groupname) handling on the %%pre section. By improved
-  I mean: we do it by brute force now. Much easier to maintain. Yeah, you
-  got it right. No more Mr. Nice Guy.
-- Removed the userdel call on %%post. No need, once it's complety handled on
-  the %%pre section
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ junkbusterng-2.9.13-1
-  Added autoheader. Added autoconf to buildrequires.
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-+ junkbusterng-2.9.13-1
-- Fixed build problems re: name conflicts with man page and logrotate.
-- Commented out rc?d/* configs for time being, which are causing a build 
-- failure. /etc/junkbuster is now /etc/privoxy. Stefan did other name 
-- changes. Fixed typo ';' should be ':' causing 'rpm -e' to fail.
-
-* Fri Mar 22 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbusterng-2.9.13-1
-- References to the expression ijb where changed where possible
-- New package name: junkbusterng (all in lower case, acording to
-  the LSB recomendation)
-- Version changed to: 2.9.13
-- Release: 1
-- Added: junkbuster to obsoletes and conflicts (Not sure this is
-  right. If it obsoletes, why conflict ? Have to check it later)
-- Summary changed: Stefan, please check and aprove it
-- Changes description to use the new name
-- Sed string was NOT changed. Have to wait to the manpage to
-  change first
-- Keeping the user junkbuster for now. It will require some aditional
-  changes on the script (scheduled for the next specfile release)
-- Added post entry to move the old logfile to the new log directory
-- Removing "chkconfig --add" entry (not good to have it automaticaly
-  added to the startup list).
-- Added preun section to stop the service with the old name, as well
-  as remove it from the startup list
-- Removed the chkconfig --del entry from the conditional block on
-  the preun scriptlet (now handled on the %files section)
-
-* Thu Mar 21 2002 Hal Burgiss <hal@foobox.net>
-- added ijb_docs.css to docs.
-
-* Mon Mar 11 2002 Hal Burgiss <hal@foobox.net>
-+ junkbuster-2.9.11-8 
-- Take out --enable-no-gifs, breaks some browsers.
-
-* Sun Mar 10 2002 Hal Burgiss <hal@foobox.net>
-+ junkbuster-2.9.11-8 
-- Add --enable-no-gifs to configure.
-
-* Fri Mar 08 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-7
-- Added BuildRequires to libtool.
-
-* Tue Mar 06 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-6
-- Changed the routined that handle the junkbust and junkbuster users on
-  %%pre and %%post to work in a smoother manner
-- %%files now uses hardcoded usernames, to avoid problems with package
-  name changes in the future
-
-* Tue Mar 05 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-5
-- Added "make redhat-dok" to the build process
-- Added docbook-utils to BuildRequires
-
-* Tue Mar 05 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-4
-- Changing man section in the manpage from 1 to 8
-- We now require packages, not files, to avoid issues with apt
-
-* Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-3
-- Fixing permissions of the init script
-
-* Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-+ junkbuster-2.9.11-2
-- General specfile fixup, using the best recomended practices, including:
-       - Adding -q to %%setup
-       - Using macros whereever possible
-       - Not using wildchars on %%files section
-       - Doubling the percentage char on changelog and comments, to
-         avoid rpm expanding them
-
-* Sun Mar 03 2002 Hal Burgiss <hal@foobox.net>
-- /bin/false for shell causes init script to fail. Reverting.
-
-* Wed Jan 09 2002 Hal Burgiss <hal@foobox.net>
-- Removed UID 73. Included user-manual and developer-manual in docs.
-  Include other actions files. Default shell is now /bin/false.
-  Userdel user=junkbust. ChangeLog was not zipped. Removed 
-  RPM_OPT_FLAGS kludge.
-
-* Fri Dec 28 2001 Thomas Steudten <thomas@steudten.ch>
-- add paranoia check for 'rm -rf %%{buildroot}'
-- add gzip to 'BuildRequires'
-
-* Sat Dec  1 2001 Hal Burgiss <hal@foobox.net>
-- actionsfile is now ijb.action.
-
-* Tue Nov  6 2001 Thomas Steudten <thomas@steudten.ch>
-- Compress manpage
-- Add more documents for installation
-- Add version string to name and source
-
-* Wed Oct 24 2001 Hal Burigss <hal@foobox.net>
-- Back to user 'junkbuster' and fix configure macro.
-
-* Wed Oct 10 2001 Hal Burigss <hal@foobox.net>
-- More changes for user 'junkbust'. Init script had 'junkbuster'.
-
-* Sun Sep 23 2001 Hal Burgiss <hal@foobox.net>
-- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files.
-- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise.
-
-* Thu Sep 13 2001 Hal Burgiss <hal@foobox.net>
-- Added $RPM_OPT_FLAGS support, renaming of old logfile, and 
-- made sure no default shell exists for user junkbust.
-
-* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
-- rework of RPM
-
-* Mon Sep 25 2000 Stefan Waldherr <stefan@waldherr.org>
-- CLF Logging patch by davep@cyw.uklinux.net
-- Hal DeVore <haldevore@earthling.net> fix akamaitech in blocklist
-
-* Sun Sep 17 2000 Stefan Waldherr <stefan@waldherr.org>
-- Steve Kemp skx@tardis.ed.ac.uk's javascript popup patch.
-- Markus Breitenbach breitenb@rbg.informatik.tu-darmstadt.de supplied
-  numerous fixes and enhancements for Steve's patch.
-- adamlock@netscape.com (Adam Lock) in the windows version:
-  - Taskbar activity spinner always spins even when logging is
-  turned off (which is the default) - people who don't
-  like the spinner can turn it off from a menu option.
-  - Taskbar popup menu has a options submenu - people can now
-  open the settings files for cookies, blockers etc.
-  without opening the JB window.
-  - Logging functionality works again
-  - Buffer overflow is fixed - new code uses a bigger buffer
-  and snprintf so it shouldn't overflow anymore.
-- Fixed userid swa, group learning problem while installing.
-  root must build RPM.
-- Added patch by Benjamin Low <ben@snrc.uow.edu.au> that prevents JB to
-  core dump when there is no log file.
-- Tweaked SuSE startup with the help of mohataj@gmx.net and Doc.B@gmx.de.
-- Fixed man page to include imagefile and popupfile.
-- Sanity check for the statistics function added.
-- "Patrick D'Cruze" <pdcruze@orac.iinet.net.au>: It seems Microsoft
- are transitioning Hotmail from FreeBSD/Apache to Windows 2000/IIS.
- With IIS/5, it appears to omit the trailing \r\n from http header
- only messages.  eg, when I visit http://www.hotmail.com, IIS/5
- responds with a HTTP 302 redirect header.  However, this header
- message is missing the trailing \r\n.  IIS/5 then closes the
- connection.  Junkbuster, unfortunately, discards the header becomes
- it thinks it is incomplete - and it is.  MS have transmitted an
- incomplete header!
-- Added bug reports and patch submission forms in the docs.
-
-* Mon Mar 20 2000 Stefan Waldherr <stefan@waldherr.org>
-       Andrew <anw@tirana.freewire.co.uk> extended the JB:
-       Display of statistics of the total number of requests and the number
-       of requests filtered by junkbuster, also the percentage of requests
-       filtered. Suppression of the listing of files on the proxy-args page.
-       All stuff optional and configurable.
-
-* Sun Sep 12 1999 Stefan Waldherr <stefan@waldherr.org>
-       Jan Willamowius (jan@janhh.shnet.org) fixed a bug in the 
-       code which prevented the JB from handling URLs of the form
-       user:password@www.foo.com. Fixed.
-
-* Mon Aug  2 1999 Stefan Waldherr <stefan@waldherr.org>
-       Blank images are no longer cached, thanks to a hint from Markus 
-        Breitenbach <breitenb@rbg.informatik.tu-darmstadt.de>. The user 
-        agent is NO longer set by the Junkbuster. Sadly, many sites depend 
-        on the correct browser version nowadays. Incorporated many 
-       suggestions from Jan "Yenya" Kasprzak <kas@fi.muni.cz> for the
-        spec file. Fixed logging problem and since runlevel 2 does not 
-        use networking, I replaced /etc/rc.d/rc2.d/S84junkbuster with
-        /etc/rc.d/rc2.d/K09junkbuster thanks to Shaw Walker 
-        <walker@netgate.net>. You should now be able to build this RPM as 
-        a non-root user (mathias@weidner.sem.lipsia.de).
-
-* Sun Jan 31 1999 Stefan Waldherr <stefan@waldherr.org>
-       %%{_localstatedir}/log/junkbuster set to nobody. Added /etc/junkbuster/imagelist
-       to allow more sophisticated matching of blocked images. Logrotate
-       logfile. Added files for auto-updating the blocklist et al.
-
-* Wed Dec 16 1998 Stefan Waldherr <stefan@waldherr.org>
-       Configure blank version via config file. No separate blank
-       version anymore. Added Roland's <roland@spinnaker.rhein.de>
-       patch to show a logo instead of a blank area. Added a suggestion
-       from Alex <alex@cocoa.demon.co.uk>: %%{_localstatedir}/lock/subsys/junkbuster.
-       More regexps in the blocklist. Prepared the forwardfile for
-       squid. Extended image regexp with help from gabriel 
-       <somlo@CS.ColoState.EDU>.
-
-* Thu Nov 19 1998 Stefan Waldherr <stefan@waldherr.org>
-       All RPMs now identify themselves in the show-proxy-args page.
-       Released Windoze version. Run junkbuster as nobody instead of
-       root. 
-
-* Fri Oct 30 1998 Stefan Waldherr <stefan@waldherr.org>
-       Newest version. First release (hence the little version number
-       mixture -- 2.0.2-0 instead of 2.0-7). This version tightens 
-       security over 2.0.1; some multi-user sites will need to change 
-       the listen-address in the configuration file. The blank version of
-        the Internet Junkbuster has a more sophisticated way of replacing
-       images. All RPMs identify themselves in the show-proxy-args page.
-
-* Thu Sep 23 1998 Stefan Waldherr <stefan@waldherr.org>
-       Modified the blocking feature, so that only GIFs and JPEGs are
-       blocked and replaced but not HTML pages. Thanks to 
-       "Gerd Flender" <plgerd@informatik.uni-siegen.de> for this nice
-       idea. Added numerous stuff to the blocklist. Keep patches in
-        seperate files and no longer in diffs (easier to maintain).
-
-* Tue Jun 16 1998 Stefan Waldherr <swa@cs.cmu.edu>
-        Moved config files to /etc/junkbuster directory, moved man page,
-       added BuildRoot directive (Thanks to Alexey Nogin <ayn2@cornell.edu>)
-        Made new version junkbuster-raw (which is only a stripped version of 
-        the junkuster rpm, i.e. without my blocklist, etc.)
-
-* Tue Jun 16 1998 (2.0-1)
-       Uhm, not that much. Just a new junkbuster version that
-       fixes a couple of bugs ... and of course a bigger 
-       blocklist with the unique Now-less-ads-than-ever(SM)
-       feature.
-       Oh, one thing: I changed the default user agent to Linux -- no 
-       need anymore to support Apple.
-
-* Tue Jun 16 1998 (2.0-0)
-       Now-less-ads-than-ever (SM)
-       compiled with gcc instead of cc
-       compiled with -O3, thus it should be a little faster
-       show-proxy-args now works
-       /etc/junkbuster.init wasn't necessary
-
-* Tue Jun 16 1998 (1.4)
-       some more config files were put into /etc
-       The junkbuster-blank rpm returns a 1x1 pixel image, that gets 
-       displayed by Netscape instead of the blocked image.
-       Read http://www.waldherr.org/junkbuster/ for
-       further info.
-
-* Tue Jun 16 1998 (1.3)
-       The program has been moved to /usr/sbin (from /usr/local/bin)
-       Init- and stopscripts (/etc/rc.d/rc*) have been added so
-       that the junkbuster starts automatically during bootup.
-       The /etc/blocklist file is much more sophisticated. Theoretically
-       one should e.g. browse all major US and German newspapers without
-       seeing one annoying ad.
-       junkbuster.init was modified. It now starts junkbuster with an
-       additional "-r @" flag.
-
-# $Log: privoxy-rh.spec,v $
-# Revision 1.16  2002/03/26 22:29:55  swa
-# we have a new homepage!
-#
-# Revision 1.15  2002/03/26 17:39:54  morcego
-# Adding comment on the specfile to remember the packager to update
-# the release number on the configure script
-#
-# Revision 1.14  2002/03/26 14:25:15  hal9
-# Added edit-actions-for-url-filter to templates in %%config
-#
-# Revision 1.13  2002/03/25 13:31:04  morcego
-# Bumping Release tag.
-#
-# Revision 1.12  2002/03/25 03:11:40  hal9
-# Do it right way this time :/
-#
-# Revision 1.11  2002/03/25 03:09:51  hal9
-# Added faq to docs.
-#
-# Revision 1.10  2002/03/24 22:16:14  morcego
-# Just removing some old commentaries.
-#
-# Revision 1.9  2002/03/24 22:03:22  morcego
-# Should be working now. See %changelog for details
-#
-# Revision 1.8  2002/03/24 21:13:01  morcego
-# Tis broken.
-#
-# Revision 1.7  2002/03/24 21:07:18  hal9
-# Add autoheader, etc.
-#
-# Revision 1.6  2002/03/24 19:56:40  hal9
-# /etc/junkbuster is now /etc/privoxy. Fixed ';' typo.
-#
-# Revision 1.4  2002/03/24 13:32:42  swa
-# name change related issues
-#
-# Revision 1.3  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.2  2002/03/24 11:40:14  swa
-# name change
-#
-# Revision 1.1  2002/03/24 11:23:44  swa
-# name change
-#
-# Revision 1.1  2002/03/22 20:53:03  morcego
-# - Ongoing process to change name to JunkbusterNG
-# - configure/configure.in: no change needed
-# - GNUmakefile.in:
-#         - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#         - PROGRAM    = jbng@EXEEXT@
-#         - rh-spec now references as junkbusterng-rh.spec
-#         - redhat-upload: references changed to junkbusterng-* (package names)
-#         - tarball-dist: references changed to JunkbusterNG-distribution-*
-#         - tarball-src: now JunkbusterNG-*
-#         - install: initscript now junkbusterng.init and junkbusterng (when
-#                    installed)
-# - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-# - junkbusterng.spec:
-#         - References to the expression ijb where changed where possible
-#         - New package name: junkbusterng (all in lower case, acording to
-#           the LSB recomendation)
-#         - Version changed to: 2.9.13
-#         - Release: 1
-#         - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#           right. If it obsoletes, why conflict ? Have to check it later)
-#         - Summary changed: Stefan, please check and aprove it
-#         - Changes description to use the new name
-#         - Sed string was NOT changed. Have to wait to the manpage to
-#           change first
-#         - Keeping the user junkbuster for now. It will require some aditional
-#           changes on the script (scheduled for the next specfile release)
-#         - Added post entry to move the old logfile to the new log directory
-#         - Removing "chkconfig --add" entry (not good to have it automaticaly
-#           added to the startup list).
-#         - Added preun section to stop the service with the old name, as well
-#           as remove it from the startup list
-#         - Removed the chkconfig --del entry from the conditional block on
-#           the preun scriptlet (now handled on the %files section)
-# - junkbuster.init: renamed to junkbusterng.init
-# - junkbusterng.init:
-#         - Changed JB_BIN to jbng
-#         - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#           be used where necessary (config dir)
-#
-# Aditional notes:
-# - The config directory is /etc/junkbuster yet. Have to change it on the
-# specfile, after it is changes on the code
-# - The only files that got renamed on the cvs tree were the rh specfile and
-# the init file. Some file references got changes on the makefile and on the
-# rh-spec (as listed above)
-#
-# Revision 1.43  2002/03/21 16:04:10  hal9
-# added ijb_docs.css to %doc
-#
-# Revision 1.42  2002/03/12 13:41:18  sarantis
-# remove hard-coded "ijbswa" string in build phase
-#
-# Revision 1.41  2002/03/11 22:58:32  hal9
-# Remove --enable-no-gifs
-#
-# Revision 1.39  2002/03/08 18:57:29  swa
-# remove user junkbuster after de-installation.
-#
-# Revision 1.38  2002/03/08 13:45:27  morcego
-# Adding libtool to Buildrequires
-#
-# Revision 1.37  2002/03/07 19:23:49  swa
-# i hate to scroll. suse: wrong configdir.
-#
-# Revision 1.36  2002/03/07 05:06:54  morcego
-# Fixed %pre scriptlet. And, as a bonus, you can even understand it now. :-)
-#
-# Revision 1.34  2002/03/07 00:11:57  morcego
-# Few changes on the %pre and %post sections of the rh specfile to handle
-# usernames more cleanly
-#
-# Revision 1.33  2002/03/05 13:13:57  morcego
-# - Added "make redhat-dok" to the build phase
-# - Added docbook-utils to BuildRequires
-#
-# Revision 1.32  2002/03/05 12:34:24  morcego
-# - Changing section internaly on the manpage from 1 to 8
-# - We now require packages, not files, to avoid issues with apt
-#
-# Revision 1.31  2002/03/04 18:06:09  morcego
-# SPECFILE: fixing permissing of the init script (broken by the last change)
-#
-# Revision 1.30  2002/03/04 16:18:03  morcego
-# General cleanup of the rh specfile.
-#
-# %changelog
-# * Mon Mar 04 2002 Rodrigo Barbosa <rodrigob@tisbrasil.com.br>
-# + junkbuster-2.9.11-2
-# - General specfile fixup, using the best recomended practices, including:
-#         - Adding -q to %%setup
-#         - Using macros whereever possible
-#         - Not using wildchars on %%files section
-#         - Doubling the percentage char on changelog and comments, to
-#           avoid rpm expanding them
-#
-# Revision 1.29  2002/03/03 19:21:22  hal9
-# Init script fails if shell is /bin/false.
-#
-# Revision 1.28  2002/01/09 18:34:03  hal9
-# nit.
-#
-# Revision 1.27  2002/01/09 18:32:02  hal9
-# Removed RPM_OPT_FLAGS kludge.
-#
-# Revision 1.26  2002/01/09 18:21:10  hal9
-# A few minor updates.
-#
-# Revision 1.25  2001/12/28 01:45:36  steudten
-# Add paranoia check and BuildReq: gzip
-#
-# Revision 1.24  2001/12/01 21:43:14  hal9
-# Allowed for new ijb.action file.
-#
-# Revision 1.23  2001/11/06 12:09:03  steudten
-# Compress doc files. Install README and AUTHORS at last as document.
-#
-# Revision 1.22  2001/11/05 21:37:34  steudten
-# Fix to include the actual version for name.
-# Let the 'real' packager be included - sorry stefan.
-#
-# Revision 1.21  2001/10/31 19:27:27  swa
-# consistent description. new name for suse since
-# we had troubles with rpms of identical names
-# on the webserver.
-#
-# Revision 1.20  2001/10/24 15:45:49  hal9
-# To keep Thomas happy (aka correcting my  mistakes)
-#
-# Revision 1.19  2001/10/15 03:23:59  hal9
-# Nits.
-#
-# Revision 1.17  2001/10/10 18:59:28  hal9
-# Minor change for init script.
-#
-# Revision 1.16  2001/09/24 20:56:23  hal9
-# Minor changes.
-#
-# Revision 1.13  2001/09/10 17:44:43  swa
-# integrate three pieces of documentation. needs work.
-# will not build cleanly under redhat.
-#
-# Revision 1.12  2001/09/10 16:25:04  swa
-# copy all templates. version updated.
-#
-# Revision 1.11  2001/07/03 11:00:25  sarantis
-# replaced permissionsfile with actionsfile
-#
-# Revision 1.10  2001/07/03 09:34:44  sarantis
-# bumped up version number.
-#
-# Revision 1.9  2001/06/12 18:15:29  swa
-# the %% in front of configure (see tag below) confused
-# the rpm build process on 7.1.
-#
-# Revision 1.8  2001/06/12 17:15:56  swa
-# fixes, because a clean build on rh6.1 was impossible.
-# GZIP confuses make, %% configure confuses rpm, etc.
-#
-# Revision 1.7  2001/06/11 12:17:26  sarantis
-# fix typo in %%post
-#
-# Revision 1.6  2001/06/11 11:28:25  sarantis
-# Further optimizations and adaptations in the spec file.
-#
-# Revision 1.5  2001/06/09 09:14:11  swa
-# shamelessly adapted RPM stuff from the newest rpm that
-# RedHat provided for the JB.
-#
-# Revision 1.4  2001/06/08 20:54:18  swa
-# type with status file. remove forward et. al from file list.
-#
-# Revision 1.3  2001/06/07 17:28:10  swa
-# cosmetics
-#
-# Revision 1.2  2001/06/04 18:31:58  swa
-# files are now prefixed with either `confdir' or `logdir'.
-# `make redhat-dist' replaces both entries confdir and logdir
-# with redhat values
-#
-# Revision 1.1  2001/06/04 10:44:57  swa
-# `make redhatr-dist' now works. Except for the paths
-# in the config file.
-#
-#
-#
diff --git a/privoxy-suse.spec b/privoxy-suse.spec
deleted file mode 100644 (file)
index 39aa6e0..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-# $Id: privoxy-suse.spec,v 1.6 2002/03/26 22:29:55 swa Exp $
-#
-# Written by and Copyright (C) 2001 the SourceForge
-# Privoxy team. http://www.privoxy.org/
-#
-# Based on the Internet Junkbuster originally written
-# by and Copyright (C) 1997 Anonymous Coders and 
-# Junkbusters Corporation.  http://www.junkbusters.com
-#
-# This program is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at
-# your option) any later version.
-#
-# This program is distributed in the hope that it will
-# be useful, but WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.  See the GNU General Public
-# License for more details.
-#
-# The GNU General Public License should be included with
-# this file.  If not, you can view it at
-# http://www.gnu.org/copyleft/gpl.html
-# or write to the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-
-# do not set to %{name}
-%define ijbconf %{_sysconfdir}/privoxy
-
-Summary:      Privoxy - privacy enhancing proxy
-Vendor:       http://www.privoxy.org
-Name:         privoxy-suse
-Distribution: defineme
-Version: 2.9.13
-Release: 1
-Source: http://www.waldherr.org/%{name}/privoxy-%{version}.tar.gz
-# not sure if this works
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-Packager:     Stefan Waldherr <stefan@waldherr.org>
-Copyright:    GPL
-Group:        Networking/Utilities
-URL:          http://www.privoxy.org/
-Provides:     privoxy
-Obsoletes:    privoxy
-Autoreqprov:  on
-BuildRequires: perl gzip docbktls libtool
-Conflicts: junkbuster-raw junkbuster-blank junkbuster
-
-#
-# -----------------------------------------------------------------------------
-#
-%description
-Privoxy is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. Privoxy has a very flexible configuration and
-can be customized to suit individual needs and tastes. Privoxy has 
-application for both stand-alone systems and multi-user networks.
-
-Privoxy is based on the code of the Internet Junkbuster. Junkbuster
-was originally written by JunkBusters Corporation, and was released as
-free open-source software under the GNU GPL. Stefan Waldherr made many
-improvements, and started the SourceForge project to continue
-development. Several other developers are now contributing.
-
-Authors:
---------
-    http://www.privoxy.org/
-
-SuSE series: n
-
-#
-# -----------------------------------------------------------------------------
-#
-%prep
-%setup -c
-
-#
-# -----------------------------------------------------------------------------
-#
-%build
-autoheader
-autoconf
-./configure
-make
-make dok
-
-## Explicitily stripping is not recomended.
-## This is handled altomaticaly by RPM, and can couse troubles if
-## anyone wants to build an unstriped version - morcego
-#strip privoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%install
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} \
-         ${RPM_BUILD_ROOT}%{_mandir}/man8 \
-         ${RPM_BUILD_ROOT}/var/log/privoxy \
-         ${RPM_BUILD_ROOT}%{ijbconf}/templates \
-         ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d \
-         ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d
-gzip README AUTHORS ChangeLog privoxy.1 || /bin/true
-install -s -m 744 privoxy $RPM_BUILD_ROOT%{_sbindir}/privoxy
-cp -f privoxy.1.gz $RPM_BUILD_ROOT%{_mandir}/man8/privoxy.8.gz
-cp -f *.action $RPM_BUILD_ROOT%{ijbconf}/
-cp -f default.filter $RPM_BUILD_ROOT%{ijbconf}/default.filter
-cp -f trust $RPM_BUILD_ROOT%{ijbconf}/trust
-cp -f templates/*  $RPM_BUILD_ROOT%{ijbconf}/templates/
-cp -f privoxy.logrotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/privoxy
-install -m 755 privoxy.init.suse $RPM_BUILD_ROOT%{_sysconfdir}/init.d/privoxy
-install -m 711 -d $RPM_BUILD_ROOT/var/log/privoxy
-ln -sf /etc/init.d/privoxy $RPM_BUILD_ROOT/usr/sbin/rcprivoxy
-
-# verify all file locations, etc. in the config file
-# don't start with ^ or commented lines are not replaced
-cat config | \
-    sed 's/^confdir.*/confdir \/etc\/privoxy/g' | \
-#    sed 's/^permissionsfile.*/permissionsfile \/etc\/privoxy\/permissionsfile/g' | \
-#    sed 's/^filterfile.*/default.filter \/etc\/privoxy\/default.filter/g' | \
-#    sed 's/^logfile.*/logfile \/var\/log\/privoxy\/logfile/g' | \
-#    sed 's/^jarfile.*/jarfile \/var\/log\/privoxy\/jarfile/g' | \
-#    sed 's/^forward.*/forward \/etc\/privoxy\/forward/g' | \
-#    sed 's/^aclfile.*/aclfile \/etc\/privoxy\/aclfile/g' > \
-    sed 's/^logdir.*/logdir \/var\/log\/privoxy/g' > \
-    $RPM_BUILD_ROOT%{ijbconf}/config
-
-#
-# -----------------------------------------------------------------------------
-#
-%pre
-# We check to see if the user privoxy exists.
-# If it does, we do nothing
-# If we don't, we check to see if the user junkbust exist and, in case it
-# does, we change it do privoxy. If it also does not exist, we create the
-# privoxy user -- morcego
-id privoxy > /dev/null 2>&1 
-if [ $? -eq 1 ]; then
-       id junkbust > /dev/null 2>&1 
-       if [ $? -eq 0 ]; then
-               /usr/sbin/usermod -l privoxy -d %{_sysconfdir}/privoxy -s "" junkbust  > /dev/null 2>&1
-       else
-# -r does not work on suse.
-               /usr/sbin/groupadd privoxy
-               /usr/sbin/useradd -d %{_sysconfdir}/privoxy -g privoxy -s "" privoxy > /dev/null 2>&1 
-       fi
-fi
-
-#
-# -----------------------------------------------------------------------------
-#
-%post
-[ -f /var/log/privoxy/privoxy ] &&\
- mv -f /var/log/privoxy/privoxy /var/log/privoxy/logfile || /bin/true
-chown -R privoxy:privoxy /var/log/privoxy 2>/dev/null
-chown -R privoxy:privoxy /etc/privoxy 2>/dev/null
-# not available on suse
-#if [ "$1" = "1" ]; then
-#     /sbin/chkconfig --add privoxy
-#      /sbin/service privoxy condrestart > /dev/null 2>&1
-#fi
-# 01/09/02 HB, getting rid of any user=junkbust
-# Changed by morcego to use the id command.
-id junkbust > /dev/null 2>&1 && /usr/sbin/userdel junkbust || /bin/true
-sbin/insserv etc/init.d/privoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%preun
-# need to stop the service on suse. swa.
-#if [ "$1" = "0" ]; then
-#      /sbin/service privoxy stop > /dev/null 2>&1 ||:
-#fi
-
-#
-# -----------------------------------------------------------------------------
-#
-%postun
-sbin/insserv etc/init.d/
-# dont forget to remove user and group privoxy
-id privoxy > /dev/null 2>&1 && /usr/sbin/userdel privoxy || /bin/true
-
-#
-# -----------------------------------------------------------------------------
-#
-%clean
-[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
-
-#
-# -----------------------------------------------------------------------------
-#
-%files
-%defattr(-,root,root)
-%doc README.gz AUTHORS.gz ChangeLog.gz
-%doc doc/webserver/developer-manual doc/webserver/user-manual
-%doc doc/webserver/user-manual
-%doc doc/webserver/faq
-%doc doc/webserver/ijb_docs.css
-#%doc privoxy.weekly privoxy.monthly AUTHORS
-%dir %{ijbconf}
-%config %{ijbconf}/*
-%attr(0744,privoxy,privoxy) %dir /var/log/privoxy
-%config %{_sysconfdir}/logrotate.d/privoxy
-%attr(0755,root,root)/usr/sbin/privoxy
-%{_mandir}/man8/*
-%config %{_sysconfdir}/init.d/privoxy
-/usr/sbin/rcprivoxy
-
-#
-# -----------------------------------------------------------------------------
-#
-%changelog
-* Tue Mar 25 2002 Hal Burgiss <hal@foobox.net>
-+ privoxy-2.9.13-3
-- Minor fix to description.
-
-* Sun Mar 24 2002 Hal Burgiss <hal@foobox.net>
-- added faq to docs.
-
-* Thu Mar 21 2002 Hal Burgiss <hal@foobox.net>
-- added ijb_docs.css to docs.
-
-* Mon Mar 11 2002 Hal Burgiss <hal@foobox.net>
-- Remove --enable-no-gifs from configure.
-
-* Sun Mar 03 2002 Hal Burgiss <hal@foobox.net>
-- /bin/false for shell causes init script to fail. Reverting.
-
-* Wed Jan 09 2002 Hal Burgiss <hal@foobox.net>
-- Removed UID 73. Included user-manual and developer-manual in docs.
-  Include other actions files. Default shell is now /bin/false.
-  Userdel user=junkbust. ChangeLog was not zipped. Removed
-  RPM_OPT_FLAGS kludge.
-
-* Fri Dec 28 2001 Thomas Steudten <thomas@steudten.ch>
-- add paranoia check for 'rm -rf $RPM_BUILD_ROOT'
-- add gzip to 'BuildRequires'
-
-* Sat Dec  1 2001 Hal Burgiss <hal@foobox.net>
-- actionsfile is now ijb.action.
-
-* Tue Nov  6 2001 Thomas Steudten <thomas@steudten.ch>
-- Compress manpage
-- Add more documents for installation
-- Add version string to name and source
-
-* Wed Oct 24 2001 Hal Burigss <hal@foobox.net>
-- Back to user 'junkbuster' and fix configure macro.
-
-* Wed Oct 10 2001 Hal Burigss <hal@foobox.net>
-- More changes for user 'junkbust'. Init script had 'junkbuster'.
-
-* Sun Sep 23 2001 Hal Burgiss <hal@foobox.net>
-- Change of $RPM_OPT_FLAGS handling. Added new HTML doc files.
-- Changed owner of /etc/junkbuster to shut up PAM/xauth log noise.
-
-* Thu Sep 13 2001 Hal Burgiss <hal@foobox.net>
-- Added $RPM_OPT_FLAGS support, renaming of old logfile, and
-- made sure no default shell exists for user junkbust.
-
-* Sun Jun  3 2001 Stefan Waldherr <stefan@waldherr.org>
-- rework of RPM
-* Wed Feb 14 2001 - uli@suse.de
-- fixed init script
-* Wed Dec 06 2000 - bjacke@suse.de
-- renamed package to junkbuster
-- fixed copyright tag
-* Thu Nov 30 2000 - uli@suse.de
-- moved init script to /etc/init.d
-* Wed Feb 16 2000 - kukuk@suse.de
-- Move /usr/man -> /usr/share/man
-- Mark /etc/ijb as "config(noreplace)"
-* Mon Sep 20 1999 - uli@suse.de
-- fixed init script
-* Mon Sep 13 1999 - bs@suse.de
-- ran old prepare_spec on spec file to switch to new prepare_spec.
-* Thu Apr 01 1999 - daniel@suse.de
-- do not start ijb as root (security)
-* Tue Mar 30 1999 - daniel@suse.de
-- don´t use saclfile.ini
-* Tue Mar 30 1999 - daniel@suse.de
-- small fix to whitelist-configuration,
-  version is and was 2.0.2 WITHOUT Stefan Waldherr's patches
-  (http://www.waldherr.org/junkbuster/)
-* Mon Mar 01 1999 - daniel@suse.de
-- new package: version 2.0
-
-# $Log: privoxy-suse.spec,v $
-# Revision 1.6  2002/03/26 22:29:55  swa
-# we have a new homepage!
-#
-# Revision 1.5  2002/03/25 03:10:50  hal9
-# Added faq to docs.
-#
-# Revision 1.4  2002/03/24 12:56:21  swa
-# name change related issues.
-#
-# Revision 1.3  2002/03/24 12:44:31  swa
-# new version string
-#
-# Revision 1.2  2002/03/24 11:40:14  swa
-# name change
-#
-# Revision 1.1  2002/03/24 11:23:44  swa
-# name change
-#
-# Revision 1.21  2002/03/21 16:04:33  hal9
-# added ijb_docs.css to %%doc
-#
-# Revision 1.20  2002/03/12 13:42:14  sarantis
-# remove hardcoded "ijbswa" from build phase
-#
-# Revision 1.19  2002/03/11 22:59:05  hal9
-# Remove --enable-no-gifs
-#
-# Revision 1.18  2002/03/11 12:30:31  swa
-# be consistent with rh spec file
-#
-# Revision 1.17  2002/03/08 19:30:23  swa
-# remove user junkbuster after de-installation.
-# synced suse with rh-specfile. installation
-# and de-installation seem to work.
-#
-# Revision 1.16  2002/03/08 18:40:44  swa
-# build requires tools. useradd and del works
-# now.
-#
-# Revision 1.15  2002/03/07 19:23:50  swa
-# i hate to scroll. suse: wrong configdir.
-#
-# Revision 1.14  2002/03/07 19:10:21  swa
-# builds cleanly. thanks to kukuk@suse.de
-# not yet tested.
-#
-# Revision 1.13  2002/03/07 18:25:56  swa
-# synced redhat and suse build process
-#
-# Revision 1.12  2002/03/02 15:50:04  swa
-# 2.9.11 version. more input for docs.
-#
-# Revision 1.11  2001/12/02 10:29:26  swa
-# New version made these changes necessary.
-#
-# Revision 1.10  2001/10/31 19:27:27  swa
-# consistent description. new name for suse since
-# we had troubles with rpms of identical names
-# on the webserver.
-#
-# Revision 1.9  2001/10/26 18:17:23  swa
-# new version string
-#
-# Revision 1.8  2001/09/13 16:22:42  swa
-# man page is legacy. suse rpm now contains html
-# documentation.
-#
-# Revision 1.7  2001/09/10 17:44:22  swa
-# integrate three pieces of documentation.
-#
-# Revision 1.6  2001/09/10 16:29:23  swa
-# binary contained debug info.
-# buildroot definition fucks up the build process under suse.
-# program needs to write in varlogjunkbuster
-# install all templates
-# create varlogjunkbuster
-#
-# Revision 1.5  2001/06/09 09:13:29  swa
-# description shorter
-#
-# Revision 1.4  2001/06/08 20:53:36  swa
-# use buildroot, export init to separate file (better manageability)
-#
-# Revision 1.3  2001/06/07 17:28:10  swa
-# cosmetics
-#
-# Revision 1.2  2001/06/07 17:18:44  swa
-# header fixed
-#
-#
diff --git a/privoxy.1 b/privoxy.1
deleted file mode 100644 (file)
index 0afd892..0000000
--- a/privoxy.1
+++ /dev/null
@@ -1,334 +0,0 @@
-.\" Revised man page 10/13/01, for development version.
-.\" Hal Burgiss <hal@foobox.net> 
-.\" for Privoxy developers: ijbswa-developers@lists.sourceforge.net
-.\"
-.TH PRIVOXY 1 "v2.9.13 (beta) Date: 2002/03/24"
-
-.SH NAME
-\fBprivoxy\fP
-- Privacy enhancing
-Proxy
-.\"\s-2(TM)\s+2
-.SH SYNOPSIS
-\fBprivoxy\fP
-[--help] [--version] [--no-daemon] [--pidfile \fIpidfile\fP] [--user \fIuser\fP[.\fIgroup\fP]] 
-\fI\&[configfile]\fP (Unix)
-.TP
-\fBprivoxy.exe\fP \fI[configfile]\fP (Windows)
-.br
-
-.SH OPTIONS
-\fBPrivoxy\fP may be invoked with the following command-line options:
-.TP
-.BR --version " (unix only)"
-Print version info and exit.
-.TP
-.BR --help " (unix only)"
-Print a short usage info and exit.
-.TP
-.BR --no-daemon " (unix only)"
-Don't become a daemon, i.e. don't fork and become process group
-leader, don't detach from controlling tty, and do all logging
-there.
-.TP
-\fB --pidfile\fP \fIpidfile\fP (unix only)
-On startup, write the process ID to \fIpidfile\fP. Delete the
-\fIpidfile\fP on exit. Failiure to create or delete the
-\fIpidfile\fP is non-fatal. If no \fB--pidfile\fP option
-is given, no PID file will be used.
-.TP
-\fB --user\fP \fIuser\fP[.\fIgroup\fP] (unix only)
-After (optionally) writing the PID file, assume the user ID
-of \fIuser\fP and the GID of \fIgroup\fP, or, if the optional
-\fIgroup\fP was not given, the default group of \fIuser\fP.
-Exit if the privileges are not sufficient to do so.
-
-.PP
-If the \fIconfigfile\fP is not specified on the command line,
-\fBPrivoxy\fP will look for a file named \fBconfig\fP in the 
-current directory (except on Win32 where it will try \fBconfig.txt\fP).
-
-
-.SH DESCRIPTION
-\fBPrivoxy\fP is a web proxy with advanced filtering capabilities for
-protecting privacy, filtering web page content, managing cookies,
-controlling access, and removing ads, banners, pop-ups and other
-obnoxious Internet junk. \fBPrivoxy\fP has a very flexible configuration and
-can be customized to suit individual needs and tastes. \fBPrivoxy\fP has
-application for both stand-alone systems and multi-user networks.
-.PP
-\fBPrivoxy\fP is based on code of the \fBInternet Junkbuster (tm)\fP 
-\fBJunkbuster\fP was originally written by JunkBusters Corporation, and was
-released as free open-source software under the GNU GPL. Stefan Waldherr made
-many improvements, and started the SourceForge project to continue
-development.
-
-.SH INSTALLATION AND USE
-Browsers must be individually configured to use 
-\fBPrivoxy\fP as a HTTP proxy.
-The default setting is for localhost, 
-on port 8118 (configurable in the main config file).
-To set the 
-\s-2HTTP\s0
-proxy in Netscape and Mozilla,
-go through:
-\fB\&Edit\fP;
-\fB\&Preferences\fP;
-\fB\&Advanced\fP;
-\fB\&Proxies\fP;
-\fB\&Manual Proxy Configuration\fP;
-\fB\&View\fP.
-.PP
-For Internet Explorer,
-go through:
-\fB\&Tools\fP;
-\fB\&Internet Properties\fP;
-\fB\&Connections\fP;
-\fB\&LAN Settings\fP.
-.PP
-The
-Secure (SSL) Proxy \" ijbfaq.html#security
-should also be set to the same values,
-otherwise
-\fB\&https:\fP
-\s-2URL\s0s
-will not be proxied.
-.PP
-For other browsers, check the documentation.
-
-.SH CONFIGURATION
-\fBPrivoxy\fP can be configured with the various configuration 
-files. The default configuration files are: \fIconfig\fP, 
-\fIdefault.action\fP, and \fIdefault.filter\fP. These are well commented. 
-On Unix and Unix-like systems, these are located in \fI/etc/privoxy/\fP 
-by default. On Windows, OS/2 and AmigaOS, these files are in the same directory 
-as the \fBPrivoxy\fP executable. 
-.PP
-The name and number of configuration files has changed from previous versions,
-and is subject to change as development progresses. In fact, the configuration
-itself is changed and much more sophisticated. See the user-manual for a brief
-explanation of all configuration options.
-.PP
-The actions list (ad blocks, etc) can also be configured with your 
-web browser at \fIhttp://www.privoxy.org/config\fP.
-\fBPrivoxy's\fP configuration parameters can also be viewed 
-at the same page. In addition, \fBPrivoxy\fP can be toggled on/off.
-This is an internal page. 
-
-.SH "SAMPLE CONFIGURATION"
-.PP
-A brief example of what a \fIdefault.action\fP configuration might look like:
-.PP
-.nf
-
-# Define a few useful custom aliases for later use
-{{alias}}
-
-# Don't accept cookies
-+no-cookies = +no-cookies-set +no-cookies-read
-
-# Do accept cookies
--no-cookies = -no-cookies-set -no-cookies-read
-
-# Treat these blocked URLs as images.
-+imageblock = +block +image
-
-# Define page filters we want to use.
-myfilters = +filter{html-annoyances} +filter{js-annoyances}\\
-            +filter{no-popups} +filter{webbugs}
-
-## Default Policies (actions) ############################
-{ \\
- -block \\
- -downgrade \\
- +fast-redirects \\
- myfilters \\
- +no-compression \\
- +hide-forwarded \\
- +hide-from{block} \\
- +hide-referer{forge} \\
- -hide-user-agent \\
- -image \\
- +image-blocker{blank} \\
- +no-cookies-keep \\
- -no-cookies-read \\
- -no-cookies-set \\
- +no-popups \\
- -vanilla-wafer \\
- -wafer \\
-}
-/
-
-# Now set exceptions to the above defined policies #######
-
-# Sites where we want persistant cookies
-{-no-cookies -no-cookies-keep}
- .redhat.com
- .sun.com
- .yahoo.com
- .msdn.microsoft.com
-
-# This site requires cookies AND 'fast-redirects' on
-{-no-cookies -no-cookies-keep -fast-redirects}
- .nytimes.com
-
-# Add custom headers, and turn off filtering of page source
-{+add-header{X-Privacy: Yes please} #-add-header{*} \\
- +add-header{X-User-Tracking: No thanks!} -filter}
- privacy.net
-
-# Block, and treat these URLs as 'images'.
-{+imageblock}
- .adforce.imgis.com
- .ad.preferences.com/image.*
- .ads.web.aol.com
- .ad-adex3.flycast.com
- .ad.doubleclick.net
- .ln.doubleclick.net
- .ad.de.doubleclick.net
- /.*/count\\.cgi\\?.*df=
- 194.221.183.22[1-7]
- a196.g.akamai.net/7/196/2670/000[12]/images.gmx.net/i4/images/.*/
-
-# Block any URLs that match these patterns
-{+block}
- /.*/(.*[-_.])?ads?[0-9]?(/|[-_.].*|\\.(gif|jpe?g))
- /.*/(plain|live|rotate)[-_.]?ads?/
- /.*/(sponsor)s?[0-9]?/
- /.*/ad(server|stream|juggler)\\.(cgi|pl|dll|exe)
- /.*/adbanners/
- /.*/adv((er)?ts?|ertis(ing|ements?))?/
- /.*/banners?/
- /.*/popupads/
- /.*/advert[0-9]+\\.jpg
- /ad_images/
- /.*/ads/
- /images/.*/.*_anim\\.gif
- /rotations/ 
- /.*(ms)?backoff(ice)?.*\\.(gif|jpe?g)
- 195.63.104.*/(inbox|log|meld|folderlu|folderru|log(in|out)[lmr]u|)
- .images.nytimes.com
- .images.yahoo.com/adv/
- /.*cnnstore\\.gif
-
-.fi
-.sp
-.PP
-See the comments in the configuration files themselves, or the user-manual 
-for explanations of the above syntax, and other \fBPrivoxy\fP configuration 
-options.
-
-.SH "FILES"
-\fI/usr/sbin/privoxy\fP
-.br
-\fI/etc/privoxy/config\fP
-.br
-\fI/etc/privoxy/default.action\fP
-.br
-\fI/etc/privoxy/advanced.action\fP
-.br
-\fI/etc/privoxy/basic.action\fP
-.br
-\fI/etc/privoxy/intermediate.action\fP
-.br
-\fI/etc/privoxy/default.filter\fP
-.br
-\fI/etc/privoxy/trust\fP
-.br
-\fI/etc/privoxy/templates/*\fP
-.br
-\fI/var/log/privoxy/logfile\fP
-
-.PP
-Various other files should be included, but may vary depending on platform 
-and build configuration. More documentation should be included in the local
-documentation directory, though is not complete at this time.
-
-.SH SIGNALS
-\fBPrivoxy\fP terminates on the \fBSIGINT\fP, \fBSIGTERM\fP and \fBSIGABRT\fP
-signals. Log rotation scripts may cause a re-opening of the logfile by sending
-a \fBSIGHUP\fP to \fBPrivoxy\fP. Note that unlike other daemons, \fBPrivoxy\fP
-does not need to be made aware of config file changes by \fBSIGHUP\fP -- it will
-detect them automatically.
-.SH NOTES
-This is a \fBBETA\fP version of \fBPrivoxy\fP. Not all features are  
-complete or well tested.
-.PP
-Please see the user-maual on how to contact the developers for 
-feature requests, reporting problems, and other questions.
-
-.SH BUGS
-Probably. Please see the user-manual for how and where to report bugs.
-
-.SH SEE ALSO
-.br
-http://www.privoxy.org/config
-.br
-http://www.privoxy.org/
-.br
-http://sourceforge.net/projects/ijbswa
-.br
-http://www.waldherr.org/junkbuster/\" waldherr.org#
-.br
-http://www.junkbusters.com/ht/en/cookies.html\" cookies.html#
-.br
-http://privacy.net/analyze/
-.br
-http://www.squid-cache.org/
-.br
-http://linuxalpha.ch/packages/
-
-.SH DEVELOPMENT TEAM
-.br
- Stefan Waldherr 
-.br
- Andreas Oesterhelt 
-.br
- Jon Foster 
-.br
- Markus Breitenbach
-.br
- Thomas Steudten
-.br
- David Schmidt
-.br
- Haroon Rafique
-.br
- Joerg Strohmayer
-.br
- Shamim Mohamed
-.br
- Sarantis Paskalis
-.br
- Gabriel L. Somlo
-.br
- John Venvertloh
-.br
- Hal Burgiss
-.br
- Rodrigo Barbosa
-
-.SH COPYRIGHT AND LICENSE
-\"Orginally written by, and copyrighted by, the Anonymous Coders and Junkbusters
-\"Corporation. 
-\".PP
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-.PP
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-.PP
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-.PP
-Internet Junkbuster
-Proxy
-is a
-trademark \" legal.html#marks
-of Junkbusters Corporation.
diff --git a/privoxy.init b/privoxy.init
deleted file mode 100644 (file)
index a835405..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#  ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.init,v $
-# 
-#  Purpose     :  This shell script takes care of starting and stopping
-#                 privoxy.
-# 
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
-# 
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-#                 This program is free software; you can redistribute it
-#                 and/or modify it under the terms of the GNU General
-#                 Public License as published by the Free Software
-#                 Foundation; either version 2 of the License, or (at
-#                 your option) any later version.
-# 
-#                 This program is distributed in the hope that it will
-#                 be useful, but WITHOUT ANY WARRANTY; without even the
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                 PARTICULAR PURPOSE.  See the GNU General Public
-#                 License for more details.
-# 
-#                 The GNU General Public License should be included with
-#                 this file.  If not, you can view it at
-#                 http://www.gnu.org/copyleft/gpl.html
-#                 or write to the Free Software Foundation, Inc., 59
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
-#  Revisions   :
-#     $Log: privoxy.init,v $
-#     Revision 1.5  2002/03/25 06:14:18  morcego
-#     Removing the OPRG definition (no longer needed)
-#
-#     Revision 1.4  2002/03/25 04:16:48  hal9
-#     Fix proper config file location.
-#
-#     Revision 1.3  2002/03/24 19:12:15  hal9
-#     Fixed some naming conflicts.
-#
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.1  2002/03/22 20:53:03  morcego
-#     - Ongoing process to change name to JunkbusterNG
-#     - configure/configure.in: no change needed
-#     - GNUmakefile.in:
-#             - TAR_ARCH = /tmp/JunkbusterNG-$(RPM_VERSION).tar.gz
-#             - PROGRAM    = jbng@EXEEXT@
-#             - rh-spec now references as junkbusterng-rh.spec
-#             - redhat-upload: references changed to junkbusterng-* (package names)
-#             - tarball-dist: references changed to JunkbusterNG-distribution-*
-#             - tarball-src: now JunkbusterNG-*
-#             - install: initscript now junkbusterng.init and junkbusterng (when
-#                        installed)
-#     - junkbuster-rh.spec: renamed to junkbusterng-rh.spec
-#     - junkbusterng.spec:
-#             - References to the expression ijb where changed where possible
-#             - New package name: junkbusterng (all in lower case, acording to
-#               the LSB recomendation)
-#             - Version changed to: 2.9.13
-#             - Release: 1
-#             - Added: junkbuster to obsoletes and conflicts (Not sure this is
-#               right. If it obsoletes, why conflict ? Have to check it later)
-#             - Summary changed: Stefan, please check and aprove it
-#             - Changes description to use the new name
-#             - Sed string was NOT changed. Have to wait to the manpage to
-#               change first
-#             - Keeping the user junkbuster for now. It will require some aditional
-#               changes on the script (scheduled for the next specfile release)
-#             - Added post entry to move the old logfile to the new log directory
-#             - Removing "chkconfig --add" entry (not good to have it automaticaly
-#               added to the startup list).
-#             - Added preun section to stop the service with the old name, as well
-#               as remove it from the startup list
-#             - Removed the chkconfig --del entry from the conditional block on
-#               the preun scriptlet (now handled on the %files section)
-#     - junkbuster.init: renamed to junkbusterng.init
-#     - junkbusterng.init:
-#             - Changed JB_BIN to jbng
-#             - Created JB_OBIN with the old value of JB_BIN (junkbuster), to
-#               be used where necessary (config dir)
-#
-#     Aditional notes:
-#     - The config directory is /etc/junkbuster yet. Have to change it on the
-#     specfile, after it is changes on the code
-#     - The only files that got renamed on the cvs tree were the rh specfile and
-#     the init file. Some file references got changes on the makefile and on the
-#     rh-spec (as listed above)
-#
-#     Revision 1.15  2002/03/09 15:05:58  swa
-#     wrong user.group
-#
-#     Revision 1.14  2002/03/06 06:13:40  hal9
-#     Adapted for Andreas' changes for --user and --pidfile.
-#
-#     Revision 1.13  2002/03/05 05:10:10  oes
-#     Changed pidfile path to conform with FHS
-#
-#     Revision 1.12  2002/03/04 20:44:36  oes
-#     Changed to new cmdline syntax
-#
-#     Revision 1.11  2001/12/30 14:07:32  steudten
-#     - Add signal handling (unix)
-#     - Add SIGHUP handler (unix)
-#     - Add creation of pidfile (unix)
-#     - Add action 'top' in rc file (RH)
-#     - Add entry 'SIGNALS' to manpage
-#     - Add exit message to logfile (unix)
-#
-#     Revision 1.10  2001/11/05 21:30:23  steudten
-#     Make JB startup without & due to be a 'real' daemon right now.
-#     Make the script easy to change.
-#
-#     Revision 1.9  2001/09/15 01:53:12  steudten
-#
-#     Remove test for subsys flag in start. Some minor changes.
-#
-#     Revision 1.8  2001/06/28 13:50:36  sarantis
-#     swap ?$ with $?; remove bogus ";;"
-#
-#     Revision 1.7  2001/06/28 13:40:26  sarantis
-#     remove single quotes from $JB; it was not expanded.
-#
-#     Revision 1.6  2001/06/28 13:38:42  sarantis
-#     formatting changes; individual return values are returned from the init script.
-#
-#     Revision 1.5  2001/06/11 11:37:40  sarantis
-#     Minor editing changes.
-#
-#     Revision 1.4  2001/06/09 09:14:11  swa
-#     shamelessly adapted RPM stuff from the newest rpm that
-#     RedHat provided for the JB.
-#
-#     Revision 1.3  2001/05/25 10:12:44  oes
-#     Fixed default case in switch statement (# -> *)
-#
-#     Revision 1.2  2001/05/24 07:52:24  swa
-#     added header. removed ^M.
-#
-# 
-# ********************************************************************/
-
-# This is file /etc/rc.d/init.d/privoxy and was put here 
-# by the privoxy rpm
-#
-# chkconfig: 235 84 09
-#
-# description: This shell script takes care of starting and stopping \
-#              privoxy.
-#
-
-
-# Source function library.
-. /etc/rc.d/init.d/functions
-
-. /etc/sysconfig/network
-
-#  Check that networking is up.
-[ ${NETWORKING} = "no" ] && exit 0
-
-JB_PRG="privoxy"
-JB_BIN="/usr/sbin/$JB_PRG"
-JB_CONF="/etc/$JB_PRG/config"
-JB_USER="privoxy"
-JB_PID=/var/run/$JB_PRG.pid
-JB_LOCK=/var/lock/subsys/$JB_PRG
-JB="$JB_BIN --user $JB_USER.$JB_USER --pidfile $JB_PID $JB_CONF"
-
-# some checks for us
-! [ -x $JB_BIN  ] && echo "Can't find $JB_BIN, exit." && exit 0
-! [ -f $JB_CONF ] && echo "Can't find $JB_CONF, exit." && exit 0
-
-# See how we were called.
-
-start () {
-       # start daemon
-       echo -n $"Starting $JB_PRG: "
-     if [ -f $JB_PID ]; then 
-        killproc $JB_PRG && rm -f $JB_LOCK $JB_PID
-        RETVAL=$?
-        [ $RETVAL != 0 ] && return $RETVAL
-     fi
-       daemon $JB 
-       RETVAL=$?
-       echo
-       [ $RETVAL = 0 ] && touch $JB_LOCK
-       return $RETVAL
-}
-
-stop () {
-       # stop daemon
-       echo -n $"Stopping $JB_PRG: "
-       killproc $JB_PRG && rm -f $JB_LOCK $JB_PID
-       RETVAL=$?
-       echo
-       return $RETVAL
-}
-
-case "$1" in
-  start)
-       start   
-       ;;
-  stop)
-       stop
-       ;;
-  reload)
-       if [ -f $JB_PID ] ; then
-        kill -HUP `cat $JB_PID`
-        RETVAL=$?
-     fi
-       ;;
-  restart)
-       stop
-       start
-       RETVAL=$?
-       ;;
-  condrestart)
-       # restart only if already running
-       if [ -f $JB_PID ] ; then
-        stop
-        start
-        RETVAL=$?
-       fi 
-       ;;
-  status)
-       status $JB_PRG 
-       RETVAL=$?
-       ;;
-  top)
-     if [ -f $JB_PID ]; then
-                a=""
-                for i in `pidof $JB_PRG` ; do
-                        a="$a -p $i"
-                done
-                top $a
-     fi
-       ;;
-  *)
-       echo $"Usage: $JB_PRG {start|stop|reload|restart|condrestart|status|top}"
-       exit 1
-esac
-
-exit $RETVAL
diff --git a/privoxy.init.suse b/privoxy.init.suse
deleted file mode 100644 (file)
index 7bab6de..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#! /bin/sh
-#  ********************************************************************
-# 
-#  File        :  $Source: /cvsroot/ijbswa/current/privoxy.init.suse,v $
-# 
-#  Purpose     :  This shell script takes care of starting and stopping
-#                 privoxy.
-# 
-#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                 Privoxy team. http://www.privoxy.org/
-# 
-#                 Based on the Internet Junkbuster originally written
-#                 by and Copyright (C) 1997 Anonymous Coders and
-#                 Junkbusters Corporation.  http://www.junkbusters.com
-# 
-#                 This program is free software; you can redistribute it
-#                 and/or modify it under the terms of the GNU General
-#                 Public License as published by the Free Software
-#                 Foundation; either version 2 of the License, or (at
-#                 your option) any later version.
-# 
-#                 This program is distributed in the hope that it will
-#                 be useful, but WITHOUT ANY WARRANTY; without even the
-#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                 PARTICULAR PURPOSE.  See the GNU General Public
-#                 License for more details.
-# 
-#                 The GNU General Public License should be included with
-#                 this file.  If not, you can view it at
-#                 http://www.gnu.org/copyleft/gpl.html
-#                 or write to the Free Software Foundation, Inc., 59
-#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-# 
-#  Revisions   :
-#     $Log: privoxy.init.suse,v $
-#     Revision 1.2  2002/03/24 11:40:14  swa
-#     name change
-#
-#     Revision 1.1  2002/03/24 11:23:44  swa
-#     name change
-#
-#     Revision 1.7  2002/03/11 11:44:46  oes
-#     Working in suggestions by Thorsten Kukuk <kukuk@suse.de>
-#
-#     Revision 1.6  2002/03/09 14:56:34  swa
-#     wrong user.group
-#
-#     Revision 1.5  2002/03/08 21:39:59  oes
-#     setgid to nogroup
-#
-#     Revision 1.4  2002/03/05 19:54:37  oes
-#     Preliminary version of SuSE 8.0-certified init script ,-)
-#
-#     Revision 1.3  2002/03/05 05:28:05  oes
-#     Added pidfile creation
-#
-#     Revision 1.2  2001/09/10 16:25:46  swa
-#     jb did not start. none of the arguments worked. fixed.
-#
-#     Revision 1.1  2001/06/08 20:53:36  swa
-#     use buildroot, export init to separate file (better manageability)
-#
-#
-# 
-# ********************************************************************/
-### BEGIN INIT INFO
-# Provides:       privoxy
-# Required-Start: $network $syslog $remote_fs
-# Required-Stop:
-# Default-Start:  3 5
-# Default-Stop:   0 1 2 6
-# Description:    Starts Privoxy
-### END INIT INFO
-
-. /etc/rc.config
-rc_reset  
-
-case "$1" in
-    start)
-        echo -n "Starting Privoxy"
-        if [ ! -f /var/run/privoxy.pid ] || ! kill -0 `cat /var/run/privoxy.pid` 2> /dev/null; then
-           /usr/sbin/privoxy --user privoxy.privoxy --pidfile /var/run/privoxy.pid /etc/privoxy/config 2> /dev/null
-        else     
-           false 
-        fi
-       rc_status -v
-        ;;
-    stop)
-        echo -n "Shutting down Privoxy"
-        killproc -TERM /usr/sbin/privoxy && rm -f /var/run/privoxy.pid
-       rc_status -v
-        ;;
-    reload)
-        echo -n "Reloading Privoxy"
-        kill -HUP `cat /var/run/privoxy.pid`
-        rc_status -v
-        ;;
-    try-restart)
-        $0 stop && $0 start
-       rc_status
-        ;;
-    restart)
-        $0 stop
-        $0 start
-        rc_status
-        ;;           
-    status)
-       echo -n "Checking for Privoxy"
-        checkproc /usr/sbin/privoxy
-       rc_status -v
-        ;;
-    *)
-        echo "Usage: $0 {start|restart|reload|status|stop}"
-        exit 1
-esac
-
-rc_exit
index 6ba5c57..7830259 100644 (file)
--- a/project.h
+++ b/project.h
@@ -1,6 +1,6 @@
-#ifndef PROJECT_H_INCLUDED
-#define PROJECT_H_INCLUDED
-#define PROJECT_H_VERSION "$Id: project.h,v 1.61 2002/03/26 22:29:55 swa Exp $"
+#ifndef _PROJECT_H
+#define _PROJECT_H
+#define PROJECT_H_VERSION "$Id: project.h,v 1.19 2001/06/29 13:33:36 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
  *                (though it does declare some macros).
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
+ *                by and Copyright (C) 1997 Anonymous Coders and 
  *                Junkbusters Corporation.  http://www.junkbusters.com
  *
- *                This program is free software; you can redistribute it
+ *                This program is free software; you can redistribute it 
  *                and/or modify it under the terms of the GNU General
  *                Public License as published by the Free Software
  *                Foundation; either version 2 of the License, or (at
  *
  * Revisions   :
  *    $Log: project.h,v $
- *    Revision 1.61  2002/03/26 22:29:55  swa
- *    we have a new homepage!
- *
- *    Revision 1.60  2002/03/24 15:52:17  jongfoster
- *    Changing CGI URL prefixes for new name
- *
- *    Revision 1.59  2002/03/24 15:23:33  jongfoster
- *    Name changes
- *
- *    Revision 1.58  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.57  2002/03/16 20:28:34  oes
- *    Added descriptions to the filters so users will know what they select in the cgi editor
- *
- *    Revision 1.56  2002/03/13 20:27:30  oes
- *    Fixing bug with CT_TABOO
- *
- *    Revision 1.55  2002/03/12 01:42:50  oes
- *    Introduced modular filters
- *
- *    Revision 1.54  2002/03/09 20:03:52  jongfoster
- *    - Making various functions return int rather than size_t.
- *      (Undoing a recent change).  Since size_t is unsigned on
- *      Windows, functions like read_socket that return -1 on
- *      error cannot return a size_t.
- *
- *      THIS WAS A MAJOR BUG - it caused frequent, unpredictable
- *      crashes, and also frequently caused JB to jump to 100%
- *      CPU and stay there.  (Because it thought it had just
- *      read ((unsigned)-1) == 4Gb of data...)
- *
- *    - The signature of write_socket has changed, it now simply
- *      returns success=0/failure=nonzero.
- *
- *    - Trying to get rid of a few warnings --with-debug on
- *      Windows, I've introduced a new type "jb_socket".  This is
- *      used for the socket file descriptors.  On Windows, this
- *      is SOCKET (a typedef for unsigned).  Everywhere else, it's
- *      an int.  The error value can't be -1 any more, so it's
- *      now JB_INVALID_SOCKET (which is -1 on UNIX, and in
- *      Windows it maps to the #define INVALID_SOCKET.)
- *
- *    - The signature of bind_port has changed.
- *
- *    Revision 1.53  2002/03/08 16:48:55  oes
- *    Added FEATURE_NO_GIFS and BUILTIN_IMAGE_MIMETYPE
- *
- *    Revision 1.52  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.51  2002/03/05 04:52:42  oes
- *    Deleted non-errlog debugging code
- *
- *    Revision 1.50  2002/03/04 19:32:07  oes
- *    Changed default port to 8118
- *
- *    Revision 1.49  2002/03/04 18:28:55  oes
- *    Deleted PID_FILE_NAME
- *
- *    Revision 1.48  2002/03/03 14:50:40  oes
- *    Fixed CLF logging: Added ocmd member for client's request to struct http_request
- *
- *    Revision 1.47  2002/02/20 23:15:13  jongfoster
- *    Parsing functions now handle out-of-memory gracefully by returning
- *    an error code.
- *
- *    Revision 1.46  2002/01/17 21:06:09  jongfoster
- *    Now #defining the URLs of the config interface
- *
- *    Minor changes to struct http_request and struct url_spec due to
- *    standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *    Revision 1.45  2002/01/09 14:33:27  oes
- *    Added HOSTENT_BUFFER_SIZE
- *
- *    Revision 1.44  2001/12/30 14:07:32  steudten
- *    - Add signal handling (unix)
- *    - Add SIGHUP handler (unix)
- *    - Add creation of pidfile (unix)
- *    - Add action 'top' in rc file (RH)
- *    - Add entry 'SIGNALS' to manpage
- *    - Add exit message to logfile (unix)
- *
- *    Revision 1.43  2001/11/22 21:57:51  jongfoster
- *    Making action_spec->flags into an unsigned long rather than just an
- *    unsigned int.
- *    Adding ACTION_NO_COOKIE_KEEP
- *
- *    Revision 1.42  2001/11/05 21:42:41  steudten
- *    Include DBG() macro.
- *
- *    Revision 1.41  2001/10/28 19:12:06  jongfoster
- *    Adding ijb_toupper()
- *
- *    Revision 1.40  2001/10/26 17:40:47  oes
- *    Moved ijb_isspace and ijb_tolower to project.h
- *    Removed http->user_agent, csp->referrer and csp->accept_types
- *
- *    Revision 1.39  2001/10/25 03:45:02  david__schmidt
- *    Adding a (void*) cast to freez() because Visual Age C++ won't expand the
- *    macro when called with a cast; so moving the cast to the macro def'n
- *    seems to both eliminate compiler warnings (on darwin and OS/2, anyway) and
- *    doesn't make macro expansion complain.  Hope this works for everyone else
- *    too...
- *
- *    Revision 1.38  2001/10/23 21:19:04  jongfoster
- *    New error-handling support: jb_err type and JB_ERR_xxx constants
- *    CGI functions now return a jb_err, and their parameters map is const.
- *    Support for RUNTIME_FEATUREs to enable/disable config editor
- *    Adding a few comments
- *
- *    Revision 1.37  2001/10/14 22:14:01  jongfoster
- *    Removing name_length field from struct cgi_dispatcher, as this is
- *    now calculated at runtime from the "name" field.
- *
- *    Revision 1.36  2001/10/10 16:45:15  oes
- *    Added LIMIT_CONNECT action and string
- *    Fixed HTTP message line termination
- *    Added CFORBIDDEN HTTP message
- *
- *    Revision 1.35  2001/10/07 18:06:43  oes
- *    Added status member to struct http_request
- *
- *    Revision 1.34  2001/10/07 15:45:25  oes
- *    Added url member to struct http_request and commented all
- *      members
- *
- *    Added CT_TABOO
- *
- *    Added ACTION_DOWNGRADE and ACTION_NO_COMPRESSION
- *
- *    Replaced struct client_state members rejected,
- *      force, active and toggled_on with "flags" bitmap.
- *
- *    Added CSP_FLAG_MODIFIED and CSP_FLAG_CHUNKED
- *
- *    Added buffer_limit to struct configuration_spec
- *
- *    Revision 1.33  2001/09/20 13:30:08  steudten
- *
- *    Make freez() more secure in case of: if (exp) { free(z) ; a=*z }
- *    Last case will set z to NULL in free(z) and thats bad..
- *
- *    Revision 1.32  2001/09/16 23:02:51  jongfoster
- *    Fixing warning
- *
- *    Revision 1.31  2001/09/16 13:20:29  jongfoster
- *    Rewrite of list library.  Now has seperate header and list_entry
- *    structures.  Also added a large sprinking of assert()s to the list
- *    code.
- *
- *    Revision 1.30  2001/09/13 23:52:00  jongfoster
- *    Support for both static and dynamically generated CGI pages
- *
- *    Revision 1.29  2001/09/13 23:29:43  jongfoster
- *    Defining FORWARD_SPEC_INITIALIZER
- *
- *    Revision 1.28  2001/09/13 23:05:50  jongfoster
- *    Changing the string paramater to the header parsers a "const".
- *
- *    Revision 1.27  2001/08/05 16:06:20  jongfoster
- *    Modifiying "struct map" so that there are now separate header and
- *    "map_entry" structures.  This means that functions which modify a
- *    map no longer need to return a pointer to the modified map.
- *    Also, it no longer reverses the order of the entries (which may be
- *    important with some advanced template substitutions).
- *
- *    Revision 1.26  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.25  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.24  2001/07/25 17:20:27  oes
- *    Introduced http->user_agent
- *
- *    Revision 1.23  2001/07/18 12:32:23  oes
- *    - Added ACTION_STRING_DEANIMATE
- *    - moved #define freez from jcc.h to project.h
- *
- *    Revision 1.22  2001/07/15 17:51:41  jongfoster
- *    Renaming #define STATIC to STATIC_PCRE
- *
- *    Revision 1.21  2001/07/13 14:03:19  oes
- *     - Reorganized regex header inclusion and #defines to
- *       comply to the scheme in configure.in
- *     - Added csp->content_type and its CT_* keys
- *     - Added ACTION_DEANIMATE
- *     - Removed all #ifdef PCRS
- *
- *    Revision 1.20  2001/06/29 21:45:41  oes
- *    Indentation, CRLF->LF, Tab-> Space
- *
  *    Revision 1.19  2001/06/29 13:33:36  oes
  *    - Improved comments
  *    - Introduced http_request.host_ip_addr_str
 
 /*
  * Include appropriate regular expression libraries.
- * Note that pcrs and pcre (native) are needed for cgi
- * and are included anyway.
+ *
+ * PCRS           ==> Include pcre
+ * REGEX && PCRE  ==> Include pcre and pcreposix
+ * REGEX && !PCRE ==> Include gnu_regex
+ *
+ * STATIC  ==> Use  #include "pcre.h"  (compiling at same time)
+ * !STATIC ==> Use  #include <pcre.h>  (System library)
+ *
  */
+#if (defined(REGEX) && defined(PCRE)) || defined(PCRS)
+#  ifdef STATIC
+#    include "pcre.h"
+#  else
+#    include <pcre.h>
+#  endif
+#endif /* (defined(REGEX) && defined(PCRE)) || defined(PCRS) */
 
-#if defined(REGEX_PCRE) || defined (REGEX_GNU)
-# define REGEX
-#endif /* defined(REGEX_PCRE) || defined (REGEX_GNU) */
-
-#ifdef STATIC_PCRE
-#  include "pcre.h"
-#else
-#  include <pcre.h>
-#endif
-
-#ifdef STATIC_PCRS
-#  include "pcrs.h"
-#else
-#  include <pcrs.h>
-#endif
-
-#if defined(REGEX_PCRE)
-#  ifdef STATIC_PCRE
+#if defined(REGEX) && defined(PCRE)
+#  ifdef STATIC
 #    include "pcreposix.h"
 #  else
 #    include <pcreposix.h>
 #  endif
-#endif /* defined(REGEX_PCRE) */
+#endif /* defined(REGEX) && defined(PCRE) */
 
-#if defined(REGEX_GNU)
+#if defined(REGEX) && !defined(PCRE)
 #  include "gnu_regex.h"
 #endif
 
-#ifdef AMIGA
-#include "amiga.h"
-#endif /* def AMIGA */
-
-#ifdef _WIN32
-/*
- * I don't want to have to #include all this just for the declaration
- * of SOCKET.  However, it looks like we have to...
- */
-#include <windows.h>
-#endif
+#ifdef PCRS
+#include "pcrs.h"
+#endif /* def PCRS */
 
+#ifdef AMIGA 
+#include "amiga.h" 
+#endif /* def AMIGA */
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/*
- * The type used by sockets.  On UNIX it's an int.  Microsoft decided to
- * make it an unsigned.
- */
-#ifdef _WIN32
-typedef SOCKET jb_socket;
-#define JB_INVALID_SOCKET INVALID_SOCKET
-#else /* ndef _WIN32 */
-typedef int jb_socket;
-#define JB_INVALID_SOCKET (-1)
-#endif /* ndef _WIN32 */
-
-
-/*
- * Error codes.  Functions returning these should return a jb_err
- */
-#define JB_ERR_OK         0 /* Success, no error                        */
-#define JB_ERR_MEMORY     1 /* Out of memory                            */
-#define JB_ERR_CGI_PARAMS 2 /* Missing or corrupt CGI parameters        */
-#define JB_ERR_FILE       3 /* Error opening, reading or writing a file */
-#define JB_ERR_PARSE      4 /* Error parsing file                       */
-#define JB_ERR_MODIFIED   5 /* File has been modified outside of the    */
-                            /* CGI actions editor.                      */
-typedef int jb_err;
-
-
-/*
- * This macro is used to free a pointer that may be NULL
- */
-#define freez(X)  { if(X) { free((void*)X); X = NULL ; } }
-
-
-/* Fix a problem with Solaris.  There should be no effect on other
- * platforms.
- * Solaris's isspace() is a macro which uses it's argument directly
- * as an array index.  Therefore we need to make sure that high-bit
- * characters generate +ve values, and ideally we also want to make
- * the argument match the declared parameter type of "int".
- *
- * Note: Remember to #include <ctype.h> if you use these macros.
- */
-#define ijb_toupper(__X) toupper((int)(unsigned char)(__X))
-#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
-#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))  
-
-/*
- * Use for statically allocated buffers if you have no other choice.
- * Remember to check the length of what you write into the buffer
- * - we don't want any buffer overflows!
- */
 #define BUFFER_SIZE 5000
 
-/*
- * Buffer size for capturing struct hostent data in the
- * gethostby(name|addr)_r library calls. Since we don't
- * loop over gethostbyname_r, the buffer must be sufficient
- * to accomodate multiple IN A RRs, as used in DNS round robin
- * load balancing. W3C's wwwlib uses 1K, so that should be
- * good enough for us, too.
- */
-#define HOSTENT_BUFFER_SIZE 1024
-
-/*
- * So you can say "while (FOREVER) { ...do something... }"
- */
 #define FOREVER 1
 
 /* Default IP and port to listen on */
 #define HADDR_DEFAULT   "127.0.0.1"
-#define HADDR_PORT      8118
+#define HADDR_PORT      8000
 
-/* Forward defs for various structures */
 
 /* Need this for struct client_state */
 struct configuration_spec;
 
-
 /* Generic linked list of strings */
-
-struct list_entry
+struct list /* FIXME: Why not separate entries and header? */
 {
-   const char *str;
-   struct list_entry *next;
-};
-
-struct list
-{
-   struct list_entry *first;
-   struct list_entry *last;
-};
-
-
-/* A map from a string to another string */
-
-struct map_entry
-{
-   const char *name;
-   const char *value;
-   struct map_entry *next;
+   char *       str;  /* valid in an entry */
+   struct list *last; /* valid in header */
+   struct list *next;
 };
 
 struct map
 {
-   struct map_entry *first;
-   struct map_entry *last;
+  char *name;
+  char *value;
+  struct map *next;
 };
 
-
 struct http_request
 {
-   char *cmd;      /* Whole command line: method, URL, Version */
-   char *ocmd;     /* Backup of original cmd for CLF logging */
-   char *gpc;      /* HTTP method: GET, POST, .. */
-   char *url;      /* The URL */
-   char *ver;      /* Protocol version */
-   int status;     /* HTTP Status */
-
-   char *host;     /* Host part of URL */
-   int   port;     /* Port of URL or 80 (default) */
-   char *path;     /* Path of URL */
-   char *hostport; /* host[:port] */
-   int   ssl;      /* Flag if protocol is https */
-
-   char *host_ip_addr_str; /* String with dotted decimal representation
-                            * of host's IP. NULL before connect_to() */
-
-   char  *dbuffer;     /* Buffer with '\0'-delimited domain name.           */
-   char **dvec;        /* List of pointers to the strings in dbuffer.       */
-   int    dcount;      /* How many parts to this domain? (length of dvec)   */
+   char *cmd;
+   char *gpc;
+   char *host;
+   char *host_ip_addr_str; /* NULL before connect_to() */
+   int   port;
+   char *path;
+   char *ver;
+   char *hostport; /* "host[:port]" */
+   int   ssl;
 };
 
-/* 
- * Response generated by CGI, blocker, or error handler
- */
+/* Response generated by CGI, blocker, or error handler */
 struct http_response
 {
-  char  *status;          /* HTTP status (string) */
+  char *status;           /* HTTP status (string)*/
   struct list headers[1]; /* List of header lines */
-  char  *head;            /* Formatted http response head */
-  size_t head_length;     /* Length of http response head */
-  char  *body;            /* HTTP document body */
-  size_t content_length;  /* Length of body, REQUIRED if binary body */
-  int    is_static;       /* Nonzero if the content will never change and
-                           * should be cached by the brwoser (e.g. images) */
+  char *head;             /* Formatted http response head */
+  int   head_length;      /* Length of http response head */
+  char *body;             /* HTTP document body */
+  int   content_length;   /* Length of body, REQUIRED if binary body*/
 };
 
 /* A URL pattern */
@@ -614,11 +311,13 @@ struct url_spec
    char  *spec;        /* The string which was parsed to produce this       */
                        /* url_spec.  Used for debugging or display only.    */
 
-   /* Hostname matching, or dbuffer == NULL to match all hosts */
-   char  *dbuffer;     /* Buffer with '\0'-delimited domain name.           */
-   char **dvec;        /* List of pointers to the strings in dbuffer.       */
-   int    dcount;      /* How many parts to this domain? (length of dvec)   */
-   int    unanchored;  /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT.  */
+   /* Hostname matching: */
+   char  *domain;      /* Fully qalified domain name (FQDN) pattern.        */
+                       /* May contain "*".                                  */
+   char  *dbuf;        /* Buffer with '\0'-delimited fqdn                   */
+   char **dvec;        /* Domain ptr vector into dbuf                       */
+   int    dcnt;        /* How many domains in fqdn?                         */
+   int    unanchored;  /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT   */
 
    /* Port matching: */
    int   port;         /* The port number, or 0 to match all ports.         */
@@ -631,17 +330,12 @@ struct url_spec
    regex_t *preg;      /* Regex for matching path part                      */
 #endif
 };
-#ifdef REGEX
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL }
-#else /* ifndef REGEX */
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0 }
-#endif /* ndef REGEX */
 
-/* Constants for host part matching in URLs */
 #define ANCHOR_LEFT  1
 #define ANCHOR_RIGHT 2
 
 
+
 /* An I/O buffer */
 struct iob
 {
@@ -654,46 +348,35 @@ struct iob
 #define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0)
 #define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
 
-/* Bits for csp->content_type */
-#define CT_TEXT   1 /* Suitable for pcrs filtering */
-#define CT_GIF    2 /* Suitable for GIF filtering */
-#define CT_TABOO  4 /* DONT filter */
+
 
 #define ACTION_MASK_ALL        (~0U)
 
-#define ACTION_MOST_COMPATIBLE 0x00000000UL
-
-#define ACTION_BLOCK           0x00000001UL
-#define ACTION_DEANIMATE       0x00000002UL
-#define ACTION_DOWNGRADE       0x00000004UL
-#define ACTION_FAST_REDIRECTS  0x00000008UL
-#define ACTION_HIDE_FORWARDED  0x00000010UL
-#define ACTION_HIDE_FROM       0x00000020UL
-#define ACTION_HIDE_REFERER    0x00000040UL /* sic - follow HTTP, not English */
-#define ACTION_HIDE_USER_AGENT 0x00000080UL
-#define ACTION_IMAGE           0x00000100UL
-#define ACTION_IMAGE_BLOCKER   0x00000200UL
-#define ACTION_NO_COMPRESSION  0x00000400UL
-#define ACTION_NO_COOKIE_KEEP  0x00000800UL
-#define ACTION_NO_COOKIE_READ  0x00001000UL
-#define ACTION_NO_COOKIE_SET   0x00002000UL
-#define ACTION_NO_POPUPS       0x00004000UL
-#define ACTION_VANILLA_WAFER   0x00008000UL
-#define ACTION_LIMIT_CONNECT   0x00010000UL
-
-#define ACTION_STRING_DEANIMATE     0
-#define ACTION_STRING_FROM          1
-#define ACTION_STRING_IMAGE_BLOCKER 2
-#define ACTION_STRING_REFERER       3
-#define ACTION_STRING_USER_AGENT    4
-#define ACTION_STRING_LIMIT_CONNECT 5
-#define ACTION_STRING_COUNT         6
+#define ACTION_MOST_COMPATIBLE 0x0000U
+
+#define ACTION_BLOCK           0x0001U
+#define ACTION_FAST_REDIRECTS  0x0002U
+#define ACTION_FILTER          0x0004U
+#define ACTION_HIDE_FORWARDED  0x0008U
+#define ACTION_HIDE_FROM       0x0010U
+#define ACTION_HIDE_REFERER    0x0020U /* sic - follow HTTP, not English */
+#define ACTION_HIDE_USER_AGENT 0x0040U
+#define ACTION_IMAGE           0x0080U
+#define ACTION_IMAGE_BLOCKER   0x0100U
+#define ACTION_NO_COOKIE_READ  0x0200U
+#define ACTION_NO_COOKIE_SET   0x0400U
+#define ACTION_NO_POPUPS       0x0800U
+#define ACTION_VANILLA_WAFER   0x1000U
+
+#define ACTION_STRING_FROM          0
+#define ACTION_STRING_IMAGE_BLOCKER 1
+#define ACTION_STRING_REFERER       2
+#define ACTION_STRING_USER_AGENT    3
+#define ACTION_STRING_COUNT         4
 
 #define ACTION_MULTI_ADD_HEADER     0
 #define ACTION_MULTI_WAFER          1
-#define ACTION_MULTI_FILTER         2
-#define ACTION_MULTI_COUNT          3
-
+#define ACTION_MULTI_COUNT          2
 
 /*
  * This structure contains a list of actions to apply to a URL.
@@ -703,7 +386,7 @@ struct iob
  */
 struct current_action_spec
 {
-   unsigned long flags;    /* a bit set to "1" = add action    */
+   unsigned flags;    /* a bit set to "1" = add action    */
 
    /* For those actions that require parameters: */
 
@@ -722,8 +405,8 @@ struct current_action_spec
  */
 struct action_spec
 {
-   unsigned long mask;   /* a bit set to "0" = remove action */
-   unsigned long add;    /* a bit set to "1" = add action    */
+   unsigned mask;   /* a bit set to "0" = remove action */
+   unsigned add;    /* a bit set to "1" = add action    */
 
    /* For those actions that require parameters: */
 
@@ -756,23 +439,29 @@ struct url_actions
 };
 
 
+/* Constants defining bitmask for csp->accept_types */
+
+#ifdef DETECT_MSIE_IMAGES
+
+/* MSIE detected by user-agent string */
+#define ACCEPT_TYPE_IS_MSIE     0x0001
+
 /*
- * Flags for use in csp->flags
+ * *If* this is MSIE, it wants an image.  (Or this is a shift-reload, or
+ * it's got an image from this URL before...  yuck!)
+ * Only meaningful if ACCEPT_TYPE_IS_MSIE set 
  */
-#define CSP_FLAG_ACTIVE     0x01 /* Set if this client is processing data.
-                                  * Cleared when the thread associated with
-                                  * this structure dies. */
-#define CSP_FLAG_CHUNKED    0x02 /* Set if the server's reply is in "chunked"
-                                  * transfer encoding */
-#define CSP_FLAG_FORCED     0x04 /* Set if this request was enforced, although
-                                  * it would normally have been blocked. */
-#define CSP_FLAG_MODIFIED   0x08 /* Set if any modification to the body was done */
-#define CSP_FLAG_REJECTED   0x10 /* Set if request was blocked.  */
-#define CSP_FLAG_TOGGLED_ON 0x20 /* Set if we are toggled on (FEATURE_TOGGLE) */
+#define ACCEPT_TYPE_MSIE_IMAGE  0x0002
 
 /*
- * The state of a Privoxy processing thread.
+ * *If* this is MSIE, it wants a HTML document.
+ * Only meaningful if ACCEPT_TYPE_IS_MSIE set
  */
+#define ACCEPT_TYPE_MSIE_HTML   0x0004
+
+#endif /* def DETECT_MSIE_IMAGES */
+
+
 struct client_state
 {
    /* The proxy's configuration */
@@ -782,13 +471,26 @@ struct client_state
    struct current_action_spec  action[1];
 
    /* socket to talk to client (web browser) */
-   jb_socket cfd;
+   int  cfd;
 
    /* socket to talk to server (web server or proxy) */
-   jb_socket sfd;
+   int  sfd;
+
+
+#ifdef STATISTICS
+   /* 1 if this URL was rejected, 0 otherwise. Allows actual stats inc to 
+    * occur in main thread only for thread-safety. 
+    */
+   int  rejected;
+#endif /* def STATISTICS */
+
+#ifdef FORCE_LOAD
+   int force;
+#endif /* def FORCE_LOAD */
 
-   /* Multi-purpose flag container, see CSP_FLAG_* above */
-   unsigned short int flags;
+#ifdef TOGGLE
+   int   toggled_on;
+#endif /* def TOGGLE */
 
    /*
     * Client PC's IP address, as reported by the accept()_ function.
@@ -805,6 +507,18 @@ struct client_state
    char *my_ip_addr_str;
    char *my_hostname;
 
+#ifdef TRUST_FILES
+   /* The referer in this request, if one was specified. */
+   char *referrer;
+#endif /* def TRUST_FILES */
+
+#if defined(DETECT_MSIE_IMAGES)
+   /* Types the client will accept.
+    * Bitmask - see ACCEPT_TYPE_XXX constants.
+    */
+   int accept_types;
+#endif /* defined(DETECT_MSIE_IMAGES) */
+
    /* The URL that was requested */
    struct http_request http[1];
 
@@ -817,61 +531,51 @@ struct client_state
    /* List of all cookies for this request */
    struct list cookie_list[1];
 
-   /* MIME-Type key, see CT_* above */
-   unsigned short int content_type;
+#if defined(PCRS) || defined(KILLPOPUPS)
+   /* Nonzero if this has a text MIME type */
+   int is_text;
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
 
    /* The "X-Forwarded-For:" header sent by the client */
    char   *x_forwarded;
 
+   /*
+    * Nonzero if this client is processing data.
+    * Set to zero when the thread associated with this structure dies.
+    */
+   int active;
+
    /* files associated with this client */
    struct file_list *actions_list;
 
-   struct file_list *rlist;   /* pcrs job file */
-   size_t content_length;     /* Length after content modification */
+#ifdef PCRS
+     struct file_list *rlist;   /* Perl re_filterfile */
+     size_t content_length;     /* Length after processing */ 
+#endif /* def PCRS */
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
    struct file_list *tlist;   /* trustfile */
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
    struct client_state *next;
 };
 
 
-/*
- * A function to add a header
- */
-typedef jb_err (*add_header_func_ptr)(struct client_state *);
-
-/*
- * A function to process a header
- */
-typedef jb_err (*parser_func_ptr    )(struct client_state *, char **);
-
-/*
- * List of functions to run on a list of headers
- */
 struct parsers
 {
-   char   *str;
-   size_t len;
-   parser_func_ptr parser;
+   char *str;
+   char  len;
+   char *(*parser)(const struct parsers *, char *, struct client_state *);
 };
 
-
-/*
- * List of available CGI functions.
- */
 struct cgi_dispatcher
 {
-   const char * const name;
-   jb_err    (* const handler)(struct client_state *csp, struct http_response *rsp, const struct map *parameters);
-   const char * const description;
+   const char *name;
+   int         name_length;
+   int         (*handler)(struct client_state *csp, struct http_response *rsp, struct map *parameters);
+   const char *description;
 };
 
-
-/*
- * A data file used by Privoxy.  Kept in a linked list.
- */
 struct file_list
 {
    /*
@@ -879,11 +583,11 @@ struct file_list
     * Read-only once the structure has been created.
     */
    void *f;
-
+   
    /* Normally NULL.  When we are finished with file (i.e. when we have
     * loaded a new one), set to a pointer to an unloader function.
     * Unloader will be called by sweep() (called from main loop) when
-    * all clients using this file are done.  This prevents threading
+    * all clients using this file are done.  This prevents threading 
     * problems.
     */
    void (*unloader)(void *);
@@ -891,6 +595,13 @@ struct file_list
    /* Used internally by sweep().  Do not access from elsewhere. */
    int active;
 
+#ifndef SPLIT_PROXY_ARGS
+   /* String to be displayed as part of show-proxy-args display.
+    * Read-only once the structure has been created.
+    */
+   char *proxy_args;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
    /* Following variables allow us to check if file has been changed.
     * Read-only once the structure has been created.
     */
@@ -907,14 +618,14 @@ struct file_list
 };
 
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
 struct block_spec
 {
    struct url_spec url[1];
    int    reject;
    struct block_spec *next;
 };
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 
 #define SOCKS_NONE    0    /* Don't use a SOCKS server */
@@ -939,25 +650,18 @@ struct forward_spec
    /* For the linked list */
    struct forward_spec *next;
 };
-#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
 
 
-/*
- * This struct represents one filter (one block) from
- * the re_filterfile. If there is more than one filter
- * in the file, the file will be represented by a
- * chained list of re_filterfile specs.
- */
+#ifdef PCRS
 struct re_filterfile_spec
 {
-   char *name;                      /* Name from FILTER: statement in re_filterfile */
-   char *description;               /* Description from FILTER: statement in re_filterfile */
-   struct list patterns[1];         /* The patterns from the re_filterfile */
-   pcrs_job *joblist;               /* The resulting compiled pcrs_jobs */
-   struct re_filterfile_spec *next; /* The pointer for chaining */
+   struct list patterns[1];
+   pcrs_job *joblist;
 };
+#endif /* def PCRS */
 
-#ifdef FEATURE_ACL
+
+#ifdef ACL_FILES
 #define ACL_PERMIT   1  /* accept connection request */
 #define ACL_DENY     2  /* reject connection request */
 
@@ -976,17 +680,12 @@ struct access_control_list
    short action;
    struct access_control_list *next;
 };
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
 
 /* Maximum number of loaders (actions, re_filter, ...) */
 #define NLOADERS 8
 
-
-#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS  1
-#define RUNTIME_FEATURE_CGI_TOGGLE        2
-
-
 /*
  * Data loaded from the configuration file.
  *
@@ -997,9 +696,6 @@ struct configuration_spec
    int debug;
    int multi_threaded;
 
-   /* Features that can be enabled/disabled throuigh the config file */
-   unsigned feature_flags;
-
    const char *logfile;
 
    const char *confdir;
@@ -1012,33 +708,41 @@ struct configuration_spec
    /* A URL with info on this proxy */
    char *proxy_info_url;
 
+#ifdef PCRS
    const char *re_filterfile;
+#endif /* def PCRS */
 
-#ifdef FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
    const char * jarfile;
    FILE * jar;
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
 
    /*
     * Port and IP to bind to.
-    * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8118
+    * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8000
     */
    const char *haddr;
    int         hport;
 
-   /* Size limit for IOB */
-   size_t buffer_limit;
+#ifndef SPLIT_PROXY_ARGS
+   const char *suppress_message;
+#endif /* ndef SPLIT_PROXY_ARGS */
 
-#ifdef FEATURE_TRUST
+#ifndef SPLIT_PROXY_ARGS
+   /* suppress listing config files */
+   int suppress_blocklists;
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+#ifdef TRUST_FILES
    const char * trustfile;
 
    struct list trust_info[1];
    struct url_spec *trust_list[64];
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
-#ifdef FEATURE_ACL
+#ifdef ACL_FILES
    struct access_control_list *acl;
-#endif /* def FEATURE_ACL */
+#endif /* def ACL_FILES */
 
    struct forward_spec *forward;
 
@@ -1058,57 +762,28 @@ struct configuration_spec
 
 #define SZ(X)  (sizeof(X) / sizeof(*X))
 
-#ifdef FEATURE_FORCE_LOAD
-#define FORCE_PREFIX "/PRIVOXY-FORCE"
-#endif /* def FEATURE_FORCE_LOAD */
-
-#ifdef FEATURE_NO_GIFS
-#define BUILTIN_IMAGE_MIMETYPE "image/png"
-#else
-#define BUILTIN_IMAGE_MIMETYPE "image/gif"
-#endif /* def FEATURE_NO_GIFS */
-
+#ifdef FORCE_LOAD
+#define FORCE_PREFIX "/IJB-FORCE-LOAD"
+#endif /* def FORCE_LOAD */
 
 /* Hardwired URLs */
-#define HOME_PAGE_URL       "http://www.privoxy.org"
-#define REDIRECT_URL        HOME_PAGE_URL "/redirect.php?v=" VERSION "&to="
-
-/*
- * The "hosts" to intercept and display CGI pages.
- * First one is a hostname only, second one can specify host and path.
- *
- * Notes:
- * 1) Do not specify the http: prefix
- * 2) CGI_SITE_2_PATH must not end with /, one will be added automatically.
- * 3) CGI_SITE_2_PATH must start with /, unless it is the empty string.
- */
-#define CGI_SITE_1_HOST "p.p"
-#define CGI_SITE_2_HOST "config.privoxy.org"
-#define CGI_SITE_2_PATH ""
-
-/*
- * The prefix for CGI pages.  Written out in generated HTML.
- * INCLUDES the trailing slash.
- */
-#define CGI_PREFIX  "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
-
+#define HOME_PAGE_URL  "http://ijbswa.sourceforge.net"
+#define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to="
+#define CGI_PREFIX_HOST "i.j.b"
 
 /* HTTP snipplets */
 static const char CSUCCEED[] =
    "HTTP/1.0 200 Connection established\n"
-   "Proxy-Agent: Privoxy/" VERSION "\r\n\r\n";
+   "Proxy-Agent: IJ/" VERSION "\n\n";
 
 static const char CHEADER[] =
-   "HTTP/1.0 400 Invalid header received from browser\r\n\r\n";
-
-static const char CFORBIDDEN[] =
-   "HTTP/1.0 403 Connection not allowable\r\nX-Hint: If you read this message interactively, then you know why this happens ,-)\r\n\r\n";
+   "HTTP/1.0 400 Invalid header received from browser\n\n";
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
 
-#endif /* ndef PROJECT_H_INCLUDED */
+#endif /* ndef _PROJECT_H */
 
 /*
   Local Variables:
diff --git a/re_filterfile b/re_filterfile
new file mode 100644 (file)
index 0000000..0c6c9f6
--- /dev/null
@@ -0,0 +1,159 @@
+# ********************************************************************
+# 
+#  File        :  $Source: /cvsroot/ijbswa/current/re_filterfile,v $
+# 
+#  Purpose     :  Rules to process the content of web pages
+# 
+#  Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+#                 IJBSWA team.  http://ijbswa.sourceforge.net
+# 
+#                 This program is free software; you can redistribute it
+#                 and/or modify it under the terms of the GNU General
+#                 Public License as published by the Free Software
+#                 Foundation; either version 2 of the License, or (at
+#                 your option) any later version.
+# 
+#                 This program is distributed in the hope that it will
+#                 be useful, but WITHOUT ANY WARRANTY; without even the
+#                 implied warranty of MERCHANTABILITY or FITNESS FOR A
+#                 PARTICULAR PURPOSE.  See the GNU General Public
+#                 License for more details.
+# 
+#                 The GNU General Public License should be included with
+#                 this file.  If not, you can view it at
+#                 http://www.gnu.org/copyleft/gpl.html
+#                 or write to the Free Software Foundation, Inc., 59
+#                 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+# 
+#  Revisions   :
+#     $Log: re_filterfile,v $
+#     Revision 1.7  2001/06/19 14:21:56  oes
+#     Fixed microsuck line
+#
+#     Revision 1.6  2001/06/09 14:01:57  swa
+#     header. cosmetics. default: no messing ala microsuck.
+#
+#
+# 
+# ********************************************************************/
+#
+# Syntax: One Perl-Style substitution per line.
+# For Details see the perlre, perlop and pcre manpages.
+# Note that you are free to choose the delimter as you see fit.
+#
+# Note: In addidion to the Perl options egimosx, the following nonstandard
+# options are supported:
+# 
+# 'U' turns the default to ungreedy matching.  Add ? to quantifiers to
+#     switch back to greedy.
+# 'T' (trivial) prevents parsing for backreferences in the substitute.
+#     Use if you want to include text like '$&' in your substitute without
+#     quoting.
+# 
+
+# ********************************************************************/
+#
+# Kill OnUnload popups. Yummy.
+# check it out on http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
+#
+# ********************************************************************/
+s/(<body .*?)onunload(.*?>)/$1never$2/i
+
+# ********************************************************************/
+#
+# Kill refresh tags. I like to refresh myself. Manually.
+# check it out on http://www.airport-cgn.de/ and go to the arrivals page.
+#
+# ********************************************************************/
+s/<meta[^>]*http-equiv[^>]*refresh.*URL=([^>]*?)"?>/<link rev="x-refresh" href=$1>/i
+s/<meta[^>]*http-equiv="?page-enter"?[^>]*content=[^>]*>/<!--no page enter for me-->/i
+
+# ********************************************************************/
+#
+# If I allow popups, I want them to be resizeable and have a location
+# and status bar: check it out on http://www.airport-cgn.de/ and go to
+# the arrivals page.
+#
+# ********************************************************************/
+# s/resizable="?(no|0)"?/resizable=1/ig s/noresize/yesresize/ig
+# s/location="?(no|0)"?/location=1/ig s/status="?(no|0)"?/status=1/ig
+# s/scrolling="?(no|0|Auto)"?/scrolling=1/ig
+# s/menubar="?(no|0)"?/menubar=1/ig #s/framespacing="?(no|0)"?//ig
+# #s/margin(height|width)=[0-9]*//gi
+
+# ********************************************************************/
+#
+# Remove frameborder=0 and border=0 from framesets
+#
+# ********************************************************************/
+s/(<frameset[^>]+?)border=['"]?(no|0)['"]?/$1/ig
+s/(<frameset[^>]+?)frameborder=['"]?(no|0)['"]?/$1/ig
+
+# ********************************************************************/
+#
+# The status bar is for displaying link targets, not pointless buzzwords.
+# Again, check it out on http://www.airport-cgn.de/
+#
+# ********************************************************************/
+s/status='.*?';*//ig
+
+# ********************************************************************/
+#
+# Kill *all* popups a la popup.c. (But for *all* sites, so I wouldn't do that.)
+#
+# JavaScript: s/window\.open\(/who_wants_this_to.open(/ig
+# HTML      : s/target=['"]?_blank['"]?/target_who/g
+#
+# Kill banners by size:
+# (Sizes from http://www.iab.net/iab_banner_standards/bannersizes.html)
+# Note: Use http://i.j.b/send-banner?type=trans for a transparent 1x1 gif
+# ********************************************************************/
+s|<img\s+[^>]*?(width=['"]?468\D)[^>]*(height=['"]?60)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?234\D)[^>]*(height=['"]?60)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?88\D)[^>]*(height=['"]?31)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?90)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?600)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?60)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?160\D)[^>]*(height=['"]?600)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?125\D)[^>]*(height=['"]?125)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?120\D)[^>]*(height=['"]?240)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?180\D)[^>]*(height=['"]?150)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?300\D)[^>]*(height=['"]?250)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?250\D)[^>]*(height=['"]?250)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?240\D)[^>]*(height=['"]?400)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+s|<img\s+[^>]*?(width=['"]?336\D)[^>]*(height=['"]?280)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+
+# Where is that from?
+s|<img\s+[^>]*?(width=['"]?200\D)[^>]*(height=['"]?50)[^>]*?>|<img src=http://i.j.b/send-banner $1 $2>|sig
+
+# ********************************************************************/
+#
+# Squish WebBugs:
+#
+# ********************************************************************/
+s/<img\s+[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?(width|height)\s+=\s+['"]?1\D[^>]*?>/<!-- Squished WebBug -->/sig
+
+# ********************************************************************/
+#
+# Fun stuff
+#
+# ********************************************************************/
+s/microsoft(?!.com)/MicroSuck/ig
+
+# ********************************************************************/
+#
+# Crude parental filtering?  (Use along with a suitable blocklist).
+# Shows how to deny access to whole page based on a keyword.
+#
+# (Note: Middlesex, Sussex and Essex are counties in the UK, not rude words)
+# (Note #2: Is 'sex' a rude word?!)
+#
+#s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body><h3>Blocked due to possible adult content. Please see <a href="http://dmoz.org/Kids_and_Teens/">this site</a>.</h3></body></html>%is
+#s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is
+
+# ********************************************************************/
+#
+# http://www.farscapezone.com/wwwboard/messages/1451.html
+#
+# ********************************************************************/
+s/(\w+) was tired/<b>$1 needed more coffee<\/b>/ig
diff --git a/showargs.c b/showargs.c
new file mode 100644 (file)
index 0000000..fa4163f
--- /dev/null
@@ -0,0 +1,462 @@
+const char showargs_rcs[] = "$Id: showargs.c,v 1.16 2001/06/29 13:35:07 oes Exp $";
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/showargs.c,v $
+ *
+ * Purpose     :  Contains various utility routines needed to 
+ *                generate the show-proxy-args page.
+ *                FIXME: Is this really stuff for a separate file?
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: showargs.c,v $
+ *    Revision 1.16  2001/06/29 13:35:07  oes
+ *    - Adapted
+ *    - Improved comments
+ *    - Removed init_proxy_args
+ *    - Renamed end_proxy_args(csp) to show_rcs(void)
+ *    - Removed logentry from cancelled commit
+ *    - Destroyed support for ndef SPLIT_PROXY_ARGS (Ooops)
+ *    - Separated the #define list into show_defines()
+ *
+ *    Revision 1.15  2001/06/09 10:55:28  jongfoster
+ *    Changing BUFSIZ ==> BUFFER_SIZE
+ *
+ *    Revision 1.14  2001/06/07 23:15:40  jongfoster
+ *    Removing config->proxy_args_gateways
+ *    Missing return statement added to end_proxy_args().
+ *
+ *    Revision 1.13  2001/06/06 09:37:59  sarantis
+ *    Fix misplaced comment start.
+ *
+ *    Revision 1.12  2001/06/04 10:41:52  swa
+ *    show version string of cgi.h and cgi.c
+ *
+ *    Revision 1.11  2001/06/03 11:03:48  oes
+ *    moved stuff to cgi.c
+ *
+ *    Revision 1.10  2001/05/31 21:36:07  jongfoster
+ *    Added RCS for actions.[ch] and list.[ch]
+ *
+ *    Revision 1.9  2001/05/29 23:11:38  oes
+ *
+ *     - Moved strsav() from showargs to miscutil
+ *
+ *    Revision 1.8  2001/05/29 09:50:24  jongfoster
+ *    Unified blocklist/imagelist/permissionslist.
+ *    File format is still under discussion, but the internal changes
+ *    are (mostly) done.
+ *
+ *    Also modified interceptor behaviour:
+ *    - We now intercept all URLs beginning with one of the following
+ *      prefixes (and *only* these prefixes):
+ *        * http://i.j.b/
+ *        * http://ijbswa.sf.net/config/
+ *        * http://ijbswa.sourceforge.net/config/
+ *    - New interceptors "home page" - go to http://i.j.b/ to see it.
+ *    - Internal changes so that intercepted and fast redirect pages
+ *      are not replaced with an image.
+ *    - Interceptors now have the option to send a binary page direct
+ *      to the client. (i.e. ijb-send-banner uses this)
+ *    - Implemented show-url-info interceptor.  (Which is why I needed
+ *      the above interceptors changes - a typical URL is
+ *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ *      The previous mechanism would not have intercepted that, and
+ *      if it had been intercepted then it then it would have replaced
+ *      it with an image.)
+ *
+ *    Revision 1.7  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.6  2001/05/25 22:32:56  jongfoster
+ *    CRLF->LF
+ *
+ *    Revision 1.5  2001/05/22 18:54:49  oes
+ *
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *      which is selected by the (nonstandard and therefore
+ *      capital) letter 'U' in the option string.
+ *      It causes the quantifiers to be ungreedy by default.
+ *      Appending a ? turns back to greedy (!).
+ *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Some minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
+ *    Revision 1.4  2001/05/20 16:44:47  jongfoster
+ *    Removing last hardcoded JunkBusters.com URLs.
+ *
+ *    Revision 1.3  2001/05/20 01:21:20  jongfoster
+ *    Version 2.9.4 checkin.
+ *    - Merged popupfile and cookiefile, and added control over PCRS
+ *      filtering, in new "permissionsfile".
+ *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
+ *      file error you now get a message box (in the Win32 GUI) rather
+ *      than the program exiting with no explanation.
+ *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
+ *      skipping.
+ *    - Removed tabs from "config"
+ *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
+ *    - Bumped up version number.
+ *
+ *    Revision 1.2  2001/05/17 23:01:01  oes
+ *     - Cleaned CRLF's from the sources and related files
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:03  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+#include <malloc.h>
+#include <errno.h>
+
+#include "project.h"
+#include "showargs.h"
+#include "jcc.h"
+#include "encode.h"
+#include "parsers.h"
+#include "errlog.h"
+#include "miscutil.h"
+#include "gateway.h"
+
+const char showargs_h_rcs[] = SHOWARGS_H_VERSION;
+
+
+/*********************************************************************
+ *
+ * Function    :  savearg
+ *
+ * Description :  Called from `load_config'.  It saves each non-empty
+ *                and non-comment line from config into a list.  This
+ *                list is used to create the show-proxy-args page.
+ *
+ * Parameters  :
+ *          1  :  c = config setting that was found
+ *          2  :  o = the setting's argument (if any)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void savearg(char *c, char *o, struct configuration_spec * config)
+{
+   char buf[BUFFER_SIZE];
+
+   *buf = '\0';
+
+   if ( ( NULL != c ) && ( '\0' != *c ) )
+   {
+      if ((c = html_encode(c)))
+      {
+         sprintf(buf, "<a href=\"" REDIRECT_URL "option#%s\">%s</a> ", c, c);
+      }
+      freez(c);
+   }
+   if ( ( NULL != o ) && ( '\0' != *o ) )
+   {
+      if ((o = html_encode(o)))
+      {
+         if (strncmpic(o, "http://", 7) == 0)
+         {
+            strcat(buf, "<a href=\"");
+            strcat(buf, o);
+            strcat(buf, "\">");
+            strcat(buf, o);
+            strcat(buf, "</a>");
+         }
+         else
+         {
+            strcat(buf, o);
+         }
+      }
+      freez(o);
+   }
+
+   strcat(buf, "<br>\n");
+
+   config->proxy_args = strsav(config->proxy_args, buf);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  show_rcs
+ *
+ * Description :  Create a string with the rcs info for all sourcefiles
+ *
+ * Parameters  :  None
+ *
+ * Returns     :  string 
+ *
+ *********************************************************************/
+char *show_rcs(void)
+{
+   char *b = NULL;
+   char buf[BUFFER_SIZE];
+
+   /* Instead of including *all* dot h's in the project (thus creating a
+    * tremendous amount of dependencies), I will concede to declaring them
+    * as extern's.  This forces the developer to add to this list, but oh well.
+    */
+
+#define SHOW_RCS(__x)            \
+   {                             \
+      extern const char __x[];   \
+      sprintf(buf, "%s\n", __x); \
+      b = strsav(b, buf);        \
+   }
+
+   /* In alphabetical order */
+   SHOW_RCS(actions_h_rcs)
+   SHOW_RCS(actions_rcs)
+   SHOW_RCS(cgi_h_rcs)
+   SHOW_RCS(cgi_rcs)
+#ifdef __MINGW32__
+   SHOW_RCS(cygwin_h_rcs)
+#endif
+   SHOW_RCS(encode_h_rcs)
+   SHOW_RCS(encode_rcs)
+   SHOW_RCS(errlog_h_rcs)
+   SHOW_RCS(errlog_rcs)
+   SHOW_RCS(filters_h_rcs)
+   SHOW_RCS(filters_rcs)
+   SHOW_RCS(gateway_h_rcs)
+   SHOW_RCS(gateway_rcs)
+#ifdef GNU_REGEX
+   SHOW_RCS(gnu_regex_h_rcs)
+   SHOW_RCS(gnu_regex_rcs)
+#endif /* def GNU_REGEX */
+   SHOW_RCS(jbsockets_h_rcs)
+   SHOW_RCS(jbsockets_rcs)
+   SHOW_RCS(jcc_h_rcs)
+   SHOW_RCS(jcc_rcs)
+#ifdef KILLPOPUPS
+   SHOW_RCS(killpopup_h_rcs)
+   SHOW_RCS(killpopup_rcs)
+#endif /* def KILLPOPUPS */
+   SHOW_RCS(list_h_rcs)
+   SHOW_RCS(list_rcs)
+   SHOW_RCS(loadcfg_h_rcs)
+   SHOW_RCS(loadcfg_rcs)
+   SHOW_RCS(loaders_h_rcs)
+   SHOW_RCS(loaders_rcs)
+   SHOW_RCS(miscutil_h_rcs)
+   SHOW_RCS(miscutil_rcs)
+   SHOW_RCS(parsers_h_rcs)
+   SHOW_RCS(parsers_rcs)
+#ifdef PCRS
+   SHOW_RCS(pcrs_rcs)
+   SHOW_RCS(pcrs_h_rcs)
+#endif /* def PCRS */
+   SHOW_RCS(project_h_rcs)
+   SHOW_RCS(showargs_h_rcs)
+   SHOW_RCS(showargs_rcs)
+   SHOW_RCS(ssplit_h_rcs)
+   SHOW_RCS(ssplit_rcs)
+#ifdef _WIN32
+#ifndef _WIN_CONSOLE
+   SHOW_RCS(w32log_h_rcs)
+   SHOW_RCS(w32log_rcs)
+   SHOW_RCS(w32res_h_rcs)
+   SHOW_RCS(w32rulesdlg_h_rcs)
+   SHOW_RCS(w32rulesdlg_rcs)
+   SHOW_RCS(w32taskbar_h_rcs)
+   SHOW_RCS(w32taskbar_rcs)
+#endif /* ndef _WIN_CONSOLE */
+   SHOW_RCS(win32_h_rcs)
+   SHOW_RCS(win32_rcs)
+#endif /* def _WIN32 */
+
+#undef SHOW_RCS
+
+   return(b);
+}
+
+/*********************************************************************
+ *
+ * Function    :  show_defines
+ *
+ * Description :  Create a string with all conditional #defines used
+ *                when building
+ *
+ * Parameters  :  None
+ *
+ * Returns     :  string 
+ *
+ *********************************************************************/
+char *show_defines(void)
+{
+   char *b = NULL;
+
+#ifdef REGEX
+   b = strsav(b, "  <li><code>#define <b>REGEX</b></code> - Support for regular expressions in the path specs.</li>\n");
+#else /* ifndef REGEX */
+   b = strsav(b, "  <li><code>#undef <b>REGEX</b></code> - No support for regular expressions in the path specs.</li>\n");
+#endif /* ndef REGEX */
+
+#ifdef PCRE
+   b = strsav(b, "  <li><code>#define <b>PCRE</b></code> - Use PCRE rather than old GNU regex library.</li>\n");
+#else /* ifndef PCRE */
+   b = strsav(b, "  <li><code>#undef <b>PCRE</b></code> - Use old GNU regex library rather than PCRE.</li>\n");
+#endif /* ndef PCRE */
+
+#ifdef PCRS
+   b = strsav(b, "  <li><code>#define <b>PCRS</b></code> - Enables arbitrary content modification regexps.</li>\n");
+#else /* ifndef PCRS */
+   b = strsav(b, "  <li><code>#undef <b>PCRS</b></code> - Disables arbitrary content modification regexps.</li>\n");
+#endif /* ndef PCRS */
+
+#ifdef TOGGLE
+   b = strsav(b, "  <li><code>#define <b>TOGGLE</b></code> - Allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.</li>\n");
+#else /* ifndef TOGGLE */
+   b = strsav(b, "  <li><code>#undef <b>TOGGLE</b></code> - Do not allow JunkBuster to be \"disabled\" so it is just a normal non-blocking non-anonymizing proxy.</li>\n");
+#endif /* ndef TOGGLE */
+
+#ifdef FORCE_LOAD
+   b = strsav(b, "  <li><code>#define <b>FORCE_LOAD</b></code> - Enables bypassing filtering for a single page using the prefix \"" FORCE_PREFIX "\".</li>\n");
+#else /* ifndef FORCE_LOAD */
+   b = strsav(b, "  <li><code>#undef <b>FORCE_LOAD</b></code> - Disables bypassing filtering for a single page.</li>\n");
+#endif /* ndef FORCE_LOAD */
+
+#ifdef DENY_GZIP
+   b = strsav(b, "  <li><code>#define <b>DENY_GZIP</b></code> - Prevents requests from being compressed - required for PCRS.</li>\n");
+#else /* ifndef DENY_GZIP */
+   b = strsav(b, "  <li><code>#undef <b>DENY_GZIP</b></code> - Allows requests to be compressed if the browser and server support it.</li>\n");
+#endif /* ndef DENY_GZIP */
+
+#ifdef STATISTICS
+   b = strsav(b, "  <li><code>#define <b>STATISTICS</b></code> - Enables statistics function.</li>\n");
+#else /* ifndef STATISTICS */
+   b = strsav(b, "  <li><code>#undef <b>STATISTICS</b></code> - Disables statistics function.</li>\n");
+#endif /* ndef STATISTICS */
+
+#ifdef SPLIT_PROXY_ARGS
+   b = strsav(b, "  <li><code>#define <b>SPLIT_PROXY_ARGS</b></code> - Split this page up by placing the configuration files on separate pages.</li>\n");
+#else /* ifndef SPLIT_PROXY_ARGS */
+   b = strsav(b, "  <li><code>#undef <b>SPLIT_PROXY_ARGS</b></code> - This page contains the text of the configuration files, they are not split onto separate pages.</li>\n");
+#endif /* ndef SPLIT_PROXY_ARGS */
+
+#ifdef KILLPOPUPS
+   b = strsav(b, "  <li><code>#define <b>KILLPOPUPS</b></code> - Enables killing JavaScript popups.</li>\n");
+#else /* ifndef KILLPOPUPS */
+   b = strsav(b, "  <li><code>#undef <b>KILLPOPUPS</b></code> - Disables killing JavaScript popups.</li>\n");
+#endif /* ndef KILLPOPUPS */
+
+#ifdef WEBDAV
+   b = strsav(b, "  <li><code>#define <b>WEBDAV</b></code> - Enables support for webDAV - e.g. stops Microsoft Outlook from accessing HotMail e-mail.</li>\n");
+#else /* ifndef WEBDAV */
+   b = strsav(b, "  <li><code>#undef <b>WEBDAV</b></code> - Disables support for webDAV - e.g. so Microsoft Outlook can access HotMail e-mail.</li>\n");
+#endif /* ndef WEBDAV */
+
+#ifdef DETECT_MSIE_IMAGES
+   b = strsav(b, "  <li><code>#define <b>DETECT_MSIE_IMAGES</b></code> - Enables detecting image requests automatically for MSIE.</li>\n");
+#else /* ifndef DETECT_MSIE_IMAGES */
+   b = strsav(b, "  <li><code>#undef <b>DETECT_MSIE_IMAGES</b></code> - Disables detecting image requests automatically for MSIE.</li>\n");
+#endif /* ndef DETECT_MSIE_IMAGES */
+
+#ifdef IMAGE_BLOCKING
+   b = strsav(b, "  <li><code>#define <b>IMAGE_BLOCKING</b></code> - Enables sending \"blocked\" images instead of HTML.</li>\n");
+#else /* ifndef IMAGE_BLOCKING */
+   b = strsav(b, "  <li><code>#undef <b>IMAGE_BLOCKING</b></code> - Disables sending \"blocked\" images instead of HTML.</li>\n");
+#endif /* ndef IMAGE_BLOCKING */
+
+#ifdef ACL_FILES
+   b = strsav(b, "  <li><code>#define <b>ACL_FILES</b></code> - Enables the use of ACL files to control access to the proxy by IP address.</li>\n");
+#else /* ifndef ACL_FILES */
+   b = strsav(b, "  <li><code>#undef <b>ACL_FILES</b></code> - Disables the use of ACL files to control access to the proxy by IP address.</li>\n");
+#endif /* ndef ACL_FILES */
+
+#ifdef TRUST_FILES
+   b = strsav(b, "  <li><code>#define <b>TRUST_FILES</b></code> - Enables the use of trust files.</li>\n");
+#else /* ifndef TRUST_FILES */
+   b = strsav(b, "  <li><code>#undef <b>TRUST_FILES</b></code> - Disables the use of trust files.</li>\n");
+#endif /* ndef TRUST_FILES */
+
+#ifdef JAR_FILES
+   b = strsav(b, "  <li><code>#define <b>JAR_FILES</b></code> - Enables the use of jar files to capture cookies.</li>\n");
+#else /* ifndef JAR_FILES */
+   b = strsav(b, "  <li><code>#undef <b>JAR_FILES</b></code> - Disables the use of jar files to capture cookies.</li>\n");
+#endif /* ndef JAR_FILES */
+
+#ifdef FAST_REDIRECTS
+   b = strsav(b, "  <li><code>#define <b>FAST_REDIRECTS</b></code> - Enables intercepting remote script redirects.</li>\n");
+#else /* ifndef FAST_REDIRECTS */
+   b = strsav(b, "  <li><code>#undef <b>FAST_REDIRECTS</b></code> - Disables intercepting remote script redirects.</li>\n");
+#endif /* ndef FAST_REDIRECTS */
+
+   return b;
+}
+
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
diff --git a/showargs.h b/showargs.h
new file mode 100644 (file)
index 0000000..48df831
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _SHOWARGS_H
+#define _SHOWARGS_H
+#define SHOWARGS_H_VERSION "$Id: showargs.h,v 1.4 2001/06/03 19:13:05 oes Exp $"
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/showargs.h,v $
+ *
+ * Purpose     :  Contains various utility routines needed to 
+ *                generate the show-proxy-args page.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Based on the Internet Junkbuster originally written
+ *                by and Copyright (C) 1997 Anonymous Coders and 
+ *                Junkbusters Corporation.  http://www.junkbusters.com
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: showargs.h,v $
+ *    Revision 1.4  2001/06/03 19:13:05  oes
+ *    moved stuff to cgi.c
+ *
+ *    Revision 1.3  2001/05/29 23:11:38  oes
+ *
+ *     - Moved strsav() from showargs to miscutil
+ *
+ *    Revision 1.2  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:03  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void savearg(char *c, char *o, struct configuration_spec * config);
+extern char *show_rcs(void);
+extern char *show_defines(void);
+
+/* Revision control strings from this header and associated .c file */
+extern const char showargs_rcs[];
+extern const char showargs_h_rcs[];
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ndef _SHOWARGS_H */
index ff36256..c0315bc 100644 (file)
--- a/ssplit.c
+++ b/ssplit.c
@@ -1,4 +1,4 @@
-const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
+const char ssplit_rcs[] = "$Id: ssplit.c,v 1.2 2001/05/17 23:01:01 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/ssplit.c,v $
@@ -6,7 +6,7 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
  * Purpose     :  A function to split a string at specified deliminters.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
@@ -32,18 +32,6 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
  *
  * Revisions   :
  *    $Log: ssplit.c,v $
- *    Revision 1.5  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.4  2001/11/13 00:16:38  jongfoster
- *    Replacing references to malloc.h with the standard stdlib.h
- *    (See ANSI or K&R 2nd Ed)
- *
- *    Revision 1.3  2001/05/29 08:54:25  jongfoster
- *    Rewrote the innards of ssplit() to be easier to understand,
- *    faster, and to use less memory.  Didn't change the interface
- *    except to give the parameters meaningful names.
- *
  *    Revision 1.2  2001/05/17 23:01:01  oes
  *     - Cleaned CRLF's from the sources and related files
  *
@@ -59,6 +47,10 @@ const char ssplit_rcs[] = "$Id: ssplit.c,v 1.5 2002/03/24 13:25:43 swa Exp $";
 #include <string.h>
 #include <stdlib.h>
 
+#ifdef _WIN32
+#include <malloc.h>
+#endif
+
 #include "ssplit.h"
 #include "miscutil.h"
 
index 397dda2..757a98e 100644 (file)
--- a/ssplit.h
+++ b/ssplit.h
@@ -1,6 +1,6 @@
-#ifndef SSPLIT_H_INCLUDED
-#define SSPLIT_H_INCLUDED
-#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.4 2002/03/24 13:25:43 swa Exp $"
+#ifndef _SSPLIT_H
+#define _SSPLIT_H
+#define SSPLIT_H_VERSION "$Id: ssplit.h,v 1.1.1.1 2001/05/15 13:59:04 oes Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/ssplit.h,v $
@@ -8,7 +8,7 @@
  * Purpose     :  A function to split a string at specified deliminters.
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: ssplit.h,v $
- *    Revision 1.4  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.3  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.2  2001/05/29 08:54:25  jongfoster
- *    Rewrote the innards of ssplit() to be easier to understand,
- *    faster, and to use less memory.  Didn't change the interface
- *    except to give the parameters meaningful names.
- *
  *    Revision 1.1.1.1  2001/05/15 13:59:04  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -68,7 +56,7 @@ extern const char ssplit_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef SSPLIT_H_INCLUDED */
+#endif /* ndef _SSPLIT_H */
 
 /*
   Local Variables:
index 9097b52..4d0d77e 100644 (file)
@@ -1,12 +1,12 @@
 ##########################################################
 #
-# "Blocked" Error Output template for Privoxy.
+# "Blocked" Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
 # ---------------------
 #
-# Template files are written in plain HTML, with a few
+# Template files are written win plain HTML, with a few
 # additions:
 # 
 # - Lines that start with a '#' character like this one
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  force-support:
-#    Privoxy has been compiled with support for forced loading
+#    Junkbuster has been compiled with support for forced loading
 #    of blocked content. In that case, the symbol "force-prefix" is
 #    avaiable, which translates to the FORCE_PREFIX  
 #
 <html>
 
 <head>
-  <title>Request blocked (Privoxy@@my-hostname@)</title>
+  <title>Request blocked (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>BLOCKED</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Request for blocked URL</h2>
         <blockquote>
-          <p>Your request for <b>@hostport@@path@</b> was blocked.
-            <br><a href="@default-cgi@show-url-info?url=@hostport@@path@">See why</a>
+          <p>Your request for <b>@hostport-html@@path-html@</b> was blocked.
+            <br><a href="@default-cgi@/show-url-info?url=@hostport@@path@">See why</a>
     <!-- @if-force-support-start -->
             or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.
 <!-- if-force-support-end@ -->
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
diff --git a/templates/blocked-compact b/templates/blocked-compact
deleted file mode 100644 (file)
index f0ff59f..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-##########################################################
-#
-# "Blocked" Error Output template for Privoxy.
-# Compact variant.
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-#  hostport:
-#    The host and port part of the request that lead to this problem
-#  path:
-#    The path part of the request that lead to this problem
-#
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    This is an alpha or beta release of the proxy software
-#  force-support:
-#    Privoxy has been compiled with support for forced loading
-#    of blocked content. In that case, the symbol "force-prefix" is
-#    avaiable, which translates to the FORCE_PREFIX  
-#
-<html>
-
-  <head>
-    <title>Request blocked (Privoxy@@my-hostname@)</title>
-    <style type="text/css">
-      BODY, P { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-    </style>
-  </head>
-
-  <body bgcolor="#ffffff">
-
-    <p align=center>Your request for <b>@hostport@@path@</b> was blocked.
-      <br><a href="@default-cgi@show-url-info?url=@hostport@@path@">See why</a>
-      <!-- @if-force-support-start -->
-      or <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.
-      <!-- if-force-support-end@ -->
-      <br><a href="@default-cgi@">More info</a>.
-    </p>
-
-  </body>
-</html>
diff --git a/templates/cgi-error-404 b/templates/cgi-error-404
deleted file mode 100644 (file)
index c7e51da..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>404 - Privoxy Configuration Page not found</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#ff0000>
-        <p><font size=+5 color=#ffffff><b>404</b></font></p>
-      </td>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee colspan=2>
-        <h2>Privoxy Configuration page not found</h2>
-          <blockquote>
-            <p>You typed in what looks like a URL used to configure
-               Privoxy, but it cannot be recognised.  Maybe it's
-               for a different Privoxy version, or you typed it
-               in wrong?  Or maybe the Privoxy administrator
-               has decided to disable the feature.</p>
-            <p>If you got here by clicking a link in the
-               configuration interface, please file a bug report!</p>
-            <p>You can use the menu below to select from the available
-               configuration options</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-bad-param b/templates/cgi-error-bad-param
deleted file mode 100644 (file)
index 699b704..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Bad parameter</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Bad parameter to Privoxy configuration page</h2>
-        <blockquote>
-          <p>You've found a page used to configure Privoxy, but the
-             parameters (the part of the web page address after the
-             "?" mark) are wrong or missing.</p>
-          <p>Possible causes:</p>
-          <ul>
-            <li>If you just typed a URL pattern into a form, then you got
-               something wrong.  Press the "back" button on your browser
-               once and correct what you typed.</li>
-            <li>If you tried to type in the URL, then you've found a
-               page where you can't do that.  You can only view this
-               page by following links from elsewhere in the configuration
-               interface.</li>
-            <li>If you got here using your browser's "back" button, then
-               that is deliberately disabled for this page.</li>
-            <li>If you got here by clicking a link in the
-               configuration interface, please file a bug report!</li>
-          </ul>
-          <p>You can use the menu below to select from the available
-             configuration options</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-disabled b/templates/cgi-error-disabled
deleted file mode 100644 (file)
index bfe6715..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Configuration Page Disabled</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Privoxy Configuration page diasabled</h2>
-          <blockquote>
-            <p>The Privoxy administrator has decided to disable this 
-               feature.  If you want to use it, you must ask them to
-               enable it.</p>
-            <p>If you are the Privoxy administrator, you can enable
-               this feature by changing the appropriate line in your
-               configuration file.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-file b/templates/cgi-error-file
deleted file mode 100644 (file)
index d9d0d6a..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Actions file not found</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Actions file not found</h2>
-        <blockquote>
-          <p>The actions file you are trying to edit (<code>@f@.action</code>)
-             does not exist, or cannot be read.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-modified b/templates/cgi-error-modified
deleted file mode 100644 (file)
index af5e5af..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: URL out of date</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>URL out of date - file has changed since it was generated</h2>
-        <blockquote>
-          <p>The URL you're viewing is out of date.  To prevent possible
-             damage to your configuration file, this action has been ignored.
-             </p>
-          <p>Possible causes:</p>
-          <ul>
-            <li>If you got here using your browser's "back" button, then
-               that is deliberately disabled for this page.  Please 
-               navigate around the configuration editor using the
-               links provided.</li>
-            <li>Perhaps you've got more than one browser window open, and
-               you're trying to change the same file in both?  You can
-               only have one editor window open at a time.  Your other edit
-               window should continue to function.</li>
-            <li>You may have modified the file some other way - perhaps by
-               editing it with a text editor.  Simply go back in to the 
-               configuration interface using the links below.</li>
-          </ul>
-          <p>You can go back into the edit interface using the menu below,
-             or by clicking <a 
-             href="edit-actions-list?f=@f@"
-             >here</a>.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/cgi-error-parse b/templates/cgi-error-parse
deleted file mode 100644 (file)
index f96bc9c..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-##########################################################
-#
-# No-Such-Domain Error Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy: Parse error</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Parse error</h2>
-        <blockquote>
-          <p>The file you're trying to edit is not valid.  You need to fix
-             it using a text editor before you can edit it using the
-             web-based editor.</p>
-          <p>This error should only occur if you edited the file using a text
-             editor.  If you managed to take a valid file and break it this
-             badly using the web-based editor, please file a bug report!</p>
-          <p>When you've fixed the problem, you can go back into the edit
-             interface using the menu below, or by clicking <a 
-             href="edit-actions-list?f=@f@">here</a>.</p>
-        </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Problem description:</h2>
-        <p>@parse-error@</p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>The line which caused the problem:</h2>
-        <pre>@line-raw@</pre>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>The line which caused the problem, with comments removed</h2>
-        <p><code>@line-data@</code></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Note</h2>
-        <p>Only the first error is reported - the file may contain other
-           errors, as well as the one reported above.</p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
index 5646891..d60b1bb 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #    The IP address of the host that could not be reached
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>503 - Connect failed (Privoxy@@my-hostname@)</title>
+  <title>503 - Connect failed (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>503</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Connect failed</h2>
           <blockquote>
-            <p>Your request for <b>http://@hostport@@path@</b> could not be fulfilled, because the connection
-              to <b>@host@</b> (@host-ip@) could not be established.</p>
+            <p>Your request for <b>http://@hostport-html@@path-html@</b> could not be fulfilled, because the connection
+              to <b>@host-html@</b> (@host-ip@) could not be established.</p>
             <p>This is often a temporary failiure, so you might just
               <a href="http://@hostport@@path@">try again</a>.</p>
           </blockquote>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
index 263a1c5..b4e4b7b 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Default-CGI Output template for Privoxy.
+# Default-CGI Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@</title>
+  <title>Junkbuster@@my-hostname@</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <p><b>Thank you for using <a href="@homepage@">Privoxy!</a></b></p>
-        <p>Please choose from the following options:</p>
-        <ul>@menu@</ul>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
 # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
     <tr>
       <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
           <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
         </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
 <!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
+    <tr>
+      <td bgcolor=#eeeeee>
+        <p><b>Thank you for using <a href="@homepage@">the SourceForge edition</a> of Internet Junkbuster!</b></p>
+        <p>Please choose from the following options:</p>
+        <ul>@menu@</ul>
+      </td>
+    </tr>
+
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/edit-actions-add-url-form b/templates/edit-actions-add-url-form
deleted file mode 100644 (file)
index d690c86..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-add-url-form,v $
-#
-# Purpose     :  Template used to add a URL pattern to the actions file.
-#
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-add-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:03  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# section
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-<script type="text/javascript">
-<!--
-function validate(text)
-{
-  if (text=="")
-  {
-    alert("You need to type a pattern in order to continue!");
-    return false;
-  }
-
-  return true;
-}
-//-->
-</script>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Add URL Pattern</h2>
-      <form method="GET" action="edit-actions-add-url"
-            onSubmit="return validate(u.value);">
-        <p>
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="s" value="@s@">
-          <input type="text" name="u" value="" size="78"><br>
-          <input type="submit" value="Submit"> &nbsp;
-          <input type="reset" value="Reset"> &nbsp;
-          <a href="edit-actions-list?f=@f@">Cancel</a>
-        </p>
-      </form>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-for-url b/templates/edit-actions-for-url
deleted file mode 100644 (file)
index 93cc322..0000000
+++ /dev/null
@@ -1,815 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url,v $
-#
-# Purpose     :  Template used to edit the actions associated with a
-#                particular section in an actions file.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-for-url,v $
-#    Revision 1.18  2002/03/24 16:32:08  jongfoster
-#    Removing logo option
-#
-#    Revision 1.17  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.16  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.15  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.14  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.13  2002/03/16 14:28:38  jongfoster
-#    First version of modular filters support
-#
-#    Revision 1.12  2002/03/12 01:42:50  oes
-#    Introduced modular filters
-#
-#    Revision 1.11  2002/03/08 18:19:14  jongfoster
-#    Adding +image-blocker{pattern} option to edit interface
-#
-#    Revision 1.10  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.9  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.8  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.7  2002/01/17 21:21:03  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.6  2001/11/22 21:58:41  jongfoster
-#    Adding action +no-cookies-keep
-#
-#    Revision 1.5  2001/11/13 21:12:17  jongfoster
-#    Added support for the following actions:
-#    +downgrade, +limit-connect, +no-compression
-#
-#    Revision 1.4  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Browser support for the JavaScript on this page:
-#   MS Internet Explorer 5.5 - Tested,   Yes
-#   Netscape 6.0             - Tested,   Yes
-#   Netscape 4.75            - Tested,   NO
-#   Opera 5.12               - Tested,   NO
-#   MS Internet Explorer 4+  - Untested, Yes
-#   MS IE 3.x, NS3.x         - Untested, NO
-#   Mozilla >=0.6            - Untested, Yes
-#
-# All browsers should work, you just might not get the pretty DHTML effects.
-#
-# The effects that only work under the browsers marked "Yes" above are:
-#  - Text edit boxes that won't have any effect are disabled.
-#  - Table rows containing additional settings are hidden if the feature in
-#    question is disabled.
-#
-# There are major kludges to get around these problems with NS4, but they
-# screw up the HTML too much for other browsers.  If anyone wants to try,
-# here's some descriptions of the kludges:
-#    http://www.webreference.com/js/tips/991114.html
-#    http://www.webreference.com/dhtml/column12/outDisplay.html
-#
-# If you're favorite browser isn't listed, please test and add it.
-#
-#
-#############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# action-name-y
-# action-name-n
-# action-name-x
-#
-# deanimate-gifs-param-first
-# deanimate-gifs-param-last
-# hide-from-param-block
-# hide-from-param-custom
-# hide-from-param
-# hide-referer-param-forge
-# hide-referer-param-block
-# hide-referer-param-custom
-# hide-referer-param
-# hide-user-agent-param
-# image-blocker-param-pattern
-# image-blocker-param-blank
-# image-blocker-param-custom
-#
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit actions</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.action    { font-weight: bold;
-               font-style: italic;
-               white-space: nowrap       }
-td.subaction { font-style: italic        }
-th           { font-weight: bold;        }
-# This is the key to the color names below:
-# bg=background, en="Enable", dis="Disable", noc="No Change", hdr=header
-# 1=odd rows, 2=even rows, h=Table header
-tr.hdr       { background-color: #999999 }
-tr.bg1       { background-color: #eeeeee }
-td.en1       { background-color: #eeffee }
-td.dis1      { background-color: #ffeeee }
-td.noc1      { background-color: #eeeeff }
-tr.bg2       { background-color: #dddddd }
-td.en2       { background-color: #ddffdd }
-td.dis2      { background-color: #ffdddd }
-td.noc2      { background-color: #ddddff }
-th.enh       { background-color: #99ff99 }
-th.dish      { background-color: #ff9999 }
-th.noch      { background-color: #9999ff }
-table.wide   { border-color: white;
-               border-style: solid;
-               border-left-width: 10px;
-               border-right-width: 10px;
-               border-top-width: 0px;
-               border-bottom-width: 0px  }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-td.green     { background-color: #ddffdd }
-</style>
-
-<script type="text/javascript">
-<!--
-
-function hide_from_param_disable(tf)
-{
-    if (document.getElementById) {
-       // NS6 or IE5
-        document.getElementById("hide_from_param").disabled = tf;
-    } else if (document.all) {
-        // IE4
-        document.myform.hide_from_param.disabled = tf;
-    }
-}
-
-function hide_referer_param_disable(tf)
-{
-    if (document.getElementById) {
-        document.getElementById("hide_referer_param").disabled = tf;
-    } else if (document.all) {
-        document.myform.hide_referer_param.disabled = tf;
-    }
-}
-
-function image_blocker_param_disable(tf)
-{
-    if (document.getElementById) {
-        document.getElementById("image_blocker_param").disabled = tf;
-    } else if (document.all) {
-        document.myform.image_blocker_param.disabled = tf;
-    }
-}
-
-function show_add_header_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("add_header_opts");
-    } else if (document.all) {
-        target = document.add_header_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_deanimate_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("deanimate_opts");
-    } else if (document.all) {
-        target = document.deanimate_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_hide_from_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("hide_from_opts");
-    } else if (document.all) {
-        target = document.hide_from_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_hide_referer_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("hide_referer_opts");
-    } else if (document.all) {
-        target = document.hide_referer_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_user_agent_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("user_agent_opts");
-    } else if (document.all) {
-        target = document.user_agent_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_image_blocker_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("image_blocker_opts");
-    } else if (document.all) {
-        target = document.image_blocker_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_limit_connect_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("limit_connect_opts");
-    } else if (document.all) {
-        target = document.limit_connect_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-function show_wafer_opts(tf)
-{
-    if (document.getElementById) {
-        target = document.getElementById("wafer_opts");
-    } else if (document.all) {
-        target = document.wafer_opts;
-    } else {
-        return;
-    }
-    target.style.display = (tf ? "" : "none");
-}
-
-//-->
-</script>
-</head>
-
-<body>
-
-<form method="GET" action="edit-actions-submit" id="myform" name="myform">
-
-  <table cellpadding="20" cellspacing="10" border="0" width="100%">
-    <tr>
-      <td class="dark">
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td class="light">
-        <h2>Edit Actions
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="s" value="@s@">
-        </h2>
-      </td>
-    </tr>
-  </table>
-
-  <table border="0" width="100%" cellspacing="2" class="wide">
-    <tr class="hdr" align="left">
-      <th class="enh" align="center">Enable</th>
-      <th class="dish" align="center">Disable</th>
-      <th class="noch" align="center">No Change</th>
-      <th>Action</th>
-      <th>Description</th>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="add_header" id="add_header_y" value="Y" @add-header-y@
-        onclick="show_add_header_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="add_header" value="N" @add-header-n@
-        onclick="show_add_header_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="add_header" value="X" @add-header-x@
-        onclick="show_add_header_opts(false)"></td>
-      <td class="action">+add-header</td>
-      <td>Adds HTTP headers.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="add_header_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Editing the settings for this option, or turning
-        it on if it was off, is not yet supported using this web-based
-        editor.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="block" value="Y" @block-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="block" value="N" @block-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="block" value="X" @block-x@
-        ></td>
-      <td class="action">+block</td>
-      <td>Block the request</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" id="deanimate_gifs_y" value="Y" @deanimate-gifs-y@
-        onclick="show_deanimate_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" value="N" @deanimate-gifs-n@
-        onclick="show_deanimate_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="deanimate_gifs" value="X" @deanimate-gifs-x@
-        onclick="show_deanimate_opts(false)"></td>
-      <td class="action">+deanimate-gifs</td>
-      <td>Replace animated GIFs with their (first/last) frame.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="deanimate_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Use the <input type="radio" name="deanimate_gifs_mode"
-        value="first" id="deanimate_first" @deanimate-gifs-param-first@><label
-        for="deanimate_first">first frame</label>&nbsp;&nbsp; <input
-        type="radio" name="deanimate_gifs_mode" value="last" 
-        id="deanimate_last" @deanimate-gifs-param-last@><label
-        for="deanimate_last">last frame</label></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="Y" @fast-redirects-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="N" @fast-redirects-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="fast_redirects" value="X" @fast-redirects-x@
-        ></td>
-      <td class="action">+fast-redirects</td>
-      <td>Bypass some tracking URLs.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="Y" @downgrade-y@></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="N" @downgrade-n@></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="downgrade" value="X" @downgrade-x@></td>
-      <td class="action">+downgrade</td>
-      <td>Change HTTP/1.1 requests to HTTP/1.0.  Only change if you know
-        what you're doing!</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td class="action">+filter</td>
-      <td>Filter the website through regular expression filters.
-        You can enable or disable the filters individually.</td>
-    </tr>
-
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="filter_all" id="filter_all_n" value="N" @filter-all-n@ ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="filter_all" id="filter_all_x" value="X" @filter-all-x@ ></td>
-      <td class="subaction" colspan="2">&nbsp;&nbsp;All filters applied by previous rules</td>
-    </tr>
-@filter-params@
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="Y" @hide-forwarded-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="N" @hide-forwarded-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="hide_forwarded" value="X" @hide-forwarded-x@
-        ></td>
-      <td class="action">+hide-forwarded</td>
-      <td>Block any existing X-Forwarded-for header, and do not add a new one.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="hide_from" id="hide_from_y" value="Y" @hide-from-y@
-        onclick="show_hide_from_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="hide_from" value="N" @hide-from-n@
-        onclick="show_hide_from_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="hide_from" value="X" @hide-from-x@
-        onclick="show_hide_from_opts(false)"></td>
-      <td class="action">+hide-from</td>
-      <td>Stop old web browsers from sending the user's e-mail address with
-        every request.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="hide_from_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="hide_from_mode" value="block"
-        onclick="hide_from_param_disable(true);"
-        @hide-from-param-block@ id="from_mode_block"><label
-        for="from_mode_block">Remove completely</label><br>
-        <input type="radio" name="hide_from_mode" value="CUSTOM" 
-        onclick="hide_from_param_disable(false);"
-        @hide-from-param-custom@ id="from_mode_set"><label
-        for="from_mode_set">Fake e-mail address:</label><br>
-        <input type="text" name="hide_from_param" id="hide_from_param"
-        size="40" value="@hide-from-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_y" value="Y" @hide-referer-y@
-        onclick="show_hide_referer_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_n" value="N" @hide-referer-n@
-        onclick="show_hide_referer_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="hide_referer" id="hide_referer_x" value="X" @hide-referer-x@
-        onclick="show_hide_referer_opts(false)"
-        ></td>
-      <td class="action">+hide-referer</td>
-      <td>Helps prevent tracking by not sending the URL of the previous web
-        page.&nbsp;</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="hide_referer_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="hide_referer_mode" value="block"
-        onclick="hide_referer_param_disable(true)"
-        @hide-referer-param-block@ id="referer_mode_block"><label
-        for="referer_mode_block">Remove completely</label> (breaks images
-        on some free web hosts).<br>
-        <input type="radio" name="hide_referer_mode" value="forge"
-        onclick="hide_referer_param_disable(true)"
-        @hide-referer-param-forge@ id="referer_mode_forge"><label
-        for="referer_mode_forge">Fake as the root directory of the
-        site</label> (fools checks for in-site links.)<br>
-        <input type="radio" name="hide_referer_mode" value="CUSTOM"
-        onclick="hide_referer_param_disable(false)"
-        @hide-referer-param-custom@ id="referer_mode_set"><label
-        for="referer_mode_set">Fake as this web address:</label><br>
-        <input type="text" name="hide_referer_param" 
-        id="hide_referer_param" size="40"
-        value="@hide-referer-param@"></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" id="hide_user_agent_y" value="Y" @hide-user-agent-y@
-        onclick="show_user_agent_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" value="N" @hide-user-agent-n@
-        onclick="show_user_agent_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="hide_user_agent" value="X" @hide-user-agent-x@
-        onclick="show_user_agent_opts(false)"></td>
-      <td class="action">+hide-user-agent</td>
-      <td>Pretend to be using a different web browser.&nbsp; (Breaks many web
-        sites).</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="user_agent_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>User Agent string to send:<br>
-        <input type="text" name="hide_user_agent_mode" size="40"
-        value="@hide-user-agent-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="image" value="Y" @image-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="image" value="N" @image-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="image" value="X" @image-x@
-        ></td>
-      <td class="action">+image</td>
-      <td>Request is for an image (only useful in conjunction with the <i><b>+block</b></i>
-        and <i><b>+image-blocker</b></i> options).</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" id="image_blocker_y" value="Y" @image-blocker-y@
-        onclick="show_image_blocker_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" value="N" @image-blocker-n@
-        onclick="show_image_blocker_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="image_blocker" value="X" @image-blocker-x@
-        onclick="show_image_blocker_opts(false)"></td>
-      <td class="action">+image-blocker</td>
-      <td>Specifies how to block images.&nbsp; Disable to always send a HTML
-        &quot;blocked&quot; page.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="image_blocker_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td><input type="radio" name="image_blocker_mode"
-        onclick="image_blocker_param_disable(true)"
-        value="pattern" id="image_blocker_mode_pattern"
-        @image-blocker-param-pattern@><label
-        for="image_blocker_mode_pattern">Send a pattern (<img
-        src="send-banner?type=p" width="12" height="12"
-        alt="pattern">)</label><br>
-        <input type="radio" name="image_blocker_mode" value="blank"
-        onclick="image_blocker_param_disable(true)"
-        id="image_blocker_mode_blank" @image-blocker-param-blank@><label 
-        for="image_blocker_mode_blank">Send a 1x1 transparent GIF</label><br>
-        <input type="radio" name="image_blocker_mode" value="CUSTOM"
-        onclick="image_blocker_param_disable(false)"
-        id="image_blocker_mode_set" @image-blocker-param-custom@><label
-        for="image_blocker_mode_set">Redirect
-        the browser to this image URL:</label><br>
-        <input type="text" name="image_blocker_param" id="image_blocker_param"
-        size="40" value="@image-blocker-param@"></td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" id="limit_connect_y" value="Y" @limit-connect-y@
-        onclick="show_limit_connect_opts(true)"></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" value="N" @limit-connect-n@
-        onclick="show_limit_connect_opts(false)"></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="limit_connect" value="X" @limit-connect-x@
-        onclick="show_limit_connect_opts(false)"></td>
-      <td class="action">+limit-connect</td>
-      <td>Specify which ports are allowed for SSL (HTTP CONNECT) access.
-        Note that this allows arbitrary tunnelling, so opening all
-        ports would be a security hole.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top" id="limit_connect_opts">
-      <td class="en1">&nbsp;</td>
-      <td class="dis1">&nbsp;</td>
-      <td class="noc1">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Legal SSL ports (comma separated, ranges allowed):<br>
-        <input type="text" name="limit_connect_mode" size="40"
-        value="@limit-connect-param@"></td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="Y" @no-compression-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="N" @no-compression-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_compression" value="X" @no-compression-x@
-        ></td>
-      <td class="action">+no-compression</td>
-      <td>Disables compression.  Compressed web pages are faster to
-        download, but cannot be filtered with +filter or +no-popups.
-        This setting only affects the few web sites which support
-        compression.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="Y" @no-cookies-keep-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="N" @no-cookies-keep-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_keep" value="X" @no-cookies-keep-x@
-        ></td>
-      <td class="action">+no-cookies-keep</td>
-      <td>Any cookies set by the website are changed to temporary
-        ("per-session") ones, which only last until you close your web
-        browser.  This will allow you to use sites that require cookies, but
-        sites will not be able to track you across sessions.  For this to
-        be useful, you should disable <b><i>no-cookies-read</i></b> and
-        <b><i>no-cookies-set</i></b>.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="Y" @no-cookies-read-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="N" @no-cookies-read-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_cookies_read" value="X" @no-cookies-read-x@
-        ></td>
-      <td class="action">+no-cookies-read</td>
-      <td>Prevent the website from reading cookies.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="Y" @no-cookies-set-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="N" @no-cookies-set-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="no_cookies_set" value="X" @no-cookies-set-x@
-        ></td>
-      <td class="action">+no-cookies-set</td>
-      <td>Prevent the website from setting cookies.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="Y" @no-popups-y@
-        ></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="N" @no-popups-n@
-        ></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="no_popups" value="X" @no-popups-x@
-        ></td>
-      <td class="action">+no-popups</td>
-      <td>Filter the website through a built-in filter to disable JavaScript
-        pop-up windows.</td>
-    </tr>
-    <tr class="bg1" align="left" valign="top">
-      <td class="en1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="Y" @vanilla-wafer-y@
-        ></td>
-      <td class="dis1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="N" @vanilla-wafer-n@
-        ></td>
-      <td class="noc1" align="center" valign="middle"><input type="radio"
-        name="vanilla_wafer" value="X" @vanilla-wafer-x@
-        ></td>
-      <td class="action">+vanilla-wafer</td>
-      <td>If you use a jarfile, automatically adds a special wafer.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top">
-      <td class="en2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_y" value="Y" @wafer-y@
-        onclick="show_wafer_opts(true)"></td>
-      <td class="dis2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_n" value="N" @wafer-n@
-        onclick="show_wafer_opts(false)"></td>
-      <td class="noc2" align="center" valign="middle"><input type="radio"
-        name="wafer" id="wafer_x" value="X" @wafer-x@
-        onclick="show_wafer_opts(false)"></td>
-      <td class="action">+wafer</td>
-      <td>Adds user-specified cookies.</td>
-    </tr>
-    <tr class="bg2" align="left" valign="top" id="wafer_opts">
-      <td class="en2">&nbsp;</td>
-      <td class="dis2">&nbsp;</td>
-      <td class="noc2">&nbsp;</td>
-      <td>&nbsp;</td>
-      <td>Editing the settings for this option, or turning
-        it on if it was off, is not yet supported using this web-based
-        editor.</td>
-    </tr>
-  </table>
-
-
-<script type="text/javascript">
-<!--
-
-if (document.getElementById) {
-    // alert("Netscape 6 or IE5");
-    document.getElementById("hide_from_param").disabled = !(document.getElementById("from_mode_set").checked);
-    document.getElementById("hide_referer_param").disabled = !(document.getElementById("referer_mode_set").checked);
-    document.getElementById("image_blocker_param").disabled = !(document.getElementById("image_blocker_mode_set").checked);
-
-    show_add_header_opts    (document.getElementById("add_header_y").checked);
-    show_deanimate_opts     (document.getElementById("deanimate_gifs_y").checked);
-    show_hide_from_opts     (document.getElementById("hide_from_y").checked);
-    show_hide_referer_opts  (document.getElementById("hide_referer_y").checked);
-    show_user_agent_opts    (document.getElementById("hide_user_agent_y").checked);
-    show_image_blocker_opts (document.getElementById("image_blocker_y").checked);
-    show_limit_connect_opts (document.getElementById("limit_connect_y").checked);
-    show_wafer_opts         (document.getElementById("wafer_y").checked);
-} else if (document.all) {
-    // alert("IE4");
-    document.myform.hide_from_param.disabled = !(document.myform.from_mode_set.checked);
-    document.myform.hide_referer_param.disabled = !(document.myform.referer_mode_set.checked);
-    document.myform.image_blocker_param.disabled = !(document.myform.image_blocker_mode_set.checked);
-
-    show_add_header_opts    (document.myform.add_header_y.checked);
-    show_deanimate_opts     (document.myform.deanimate_gifs_y.checked);
-    show_hide_from_opts     (document.myform.hide_from_y.checked);
-    show_hide_referer_opts  (document.myform.hide_referer_y.checked);
-    show_user_agent_opts    (document.myform.hide_user_agent_y.checked);
-    show_image_blocker_opts (document.myform.image_blocker_y.checked);
-    show_limit_connect_opts (document.myform.limit_connect_y.checked);
-    show_wafer_opts         (document.myform.wafer_y.checked);
-} else if (document.layers) {
-    // alert("Netscape 4");
-}
-//-->
-</script>
-
-  <table cellpadding="20" cellspacing="10" border="0" width="100%">
-    <tr>
-      <td class="green" align="center">
-        <p><input type="submit" value="Submit" name="Submit"></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td class="dark">
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-    <tr>
-      <td>
-        <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-      </td>
-    </tr>
-
-  </table>
-</form>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-for-url-filter b/templates/edit-actions-for-url-filter
deleted file mode 100644 (file)
index 06020cb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<tr class="bg2" align="left" valign="top">\r
-  <td class="en2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="Y" @this-filter-y@></td>\r
-  <td class="dis2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="N" @this-filter-n@></td>\r
-  <td class="noc2" align="center" valign="middle"><input type="radio" name="filter_r@index@" value="X" @this-filter-x@></td>\r
-  <td class="subaction" colspan="2">&nbsp;&nbsp;@description@ (@name@) <input type="hidden" name="filter_n@index@" value="@name@"></td>\r
-</tr>\r
diff --git a/templates/edit-actions-list b/templates/edit-actions-list
deleted file mode 100644 (file)
index 24d6295..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list,v $
-#
-# Purpose     :  Template used to edit the actions file.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list,v $
-#    Revision 1.13  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.12  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.11  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.10  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.9  2002/03/05 00:24:51  jongfoster
-#    Patch to always edit the current actions file.
-#
-#    Revision 1.8  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.7  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.6  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.5  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.4  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Browser support for the CSS on this page:
-#   MS Internet Explorer 5.5 - Yes - everything works.
-#   Netscape 6.2             - Yes - everything works.
-#   Netscape 4.75            - No  - CSS buttons look really bad, but they are
-#                                    usable.  Everything else works.
-#   Opera 5.12               - Yes - everything works.
-#   MS Internet Explorer 4+  - Untested
-#   MS IE 3.x, NS3.x         - Untested (Don't support CSS, so everything
-#                              should work, but will look ugly).
-#   Mozilla >=0.6            - Untested
-#
-# All browsers should work, you just might not get the pretty CSS buttons.
-#
-# If you're favorite browser isn't listed/tested, please test and add it.
-#
-#
-#############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-#
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit actions file</title>
-
-<style type="text/css">
-body {
-  font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-  background-color: #ffffff;
-  color: #000000;
-}
-td.light {
-  background-color: #eeeeee;
-}
-td.dark {
-  background-color: #dddddd;
-}
-table.wide {
-  border-color: white;
-  border-style: solid;
-  border-left-width: 10px;
-  border-right-width: 10px;
-  border-top-width: 0px;
-  border-bottom-width: 0px;
-}
-tr.actions {
-  background-color: #eeffee;
-}
-tr.url1 {
-  background-color: #d0d0ff;
-}
-tr.url2 {
-  background-color: #eeeeff;
-}
-tr.rule {
-  background-color: #c0c0c0;
-  height: 3px;
-  max-height: 3px;
-  font-size: 1px
-}
-tr.adv {
-  background-color: #FFFFD0;
-}
-td.header {
-  font-weight: bold;
-}
-td.url {
-  font-weight: bold;
-}
-td.action {
-  font-weight: bold;
-  font-style: italic;
-}
-td.nbr {
-  white-space: nowrap;
-}
-a.cmd, div.buttons a {
-  white-space: nowrap;
-  width: auto;
-  padding: 2px;
-  background-color: #dddddd;
-  color:            #000000;
-  text-decoration: none;
-  border-top:    1px solid #ffffff;
-  border-left:   1px solid #ffffff;
-  border-bottom: 1px solid #000000;
-  border-right:  1px solid #000000;
-}
-a.cmd:hover, div.buttons a:hover {
-  background-color: #eeeeee;
-}
-a.cmd:active, div.buttons a:active {
-  border-top:    1px solid #000000;
-  border-left:   1px solid #000000;
-  border-bottom: 1px solid #ffffff;
-  border-right:  1px solid #ffffff;
-}
-
-</style>
-
-<script type="text/javascript">
-<!--
-function not_yet()
-{
-   window.alert("The feature you are trying to use has not been implemented yet.");
-}
-
-// Non-JS capable browsers will follow the link to a HTML "are you sure?" page
-// JavaScript-capable browsers will call this function, which does a
-// client-side prompt for speed.  It may kick off the delete directly.
-// It always returns false to cancel following the link.
-function rm_p(pattern,curtext)
-{
-   if (window.confirm("Are you sure you want to delete this URL pattern?\nPattern is: "+unescape(curtext)))
-   { window.location.href="edit-actions-remove-url?f=@f@&v=@v@&p="+pattern+"#l"+pattern; }
-   return false;
-}
-
-//-->
-</script>
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-</table>
-
-<div class="buttons">
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="light">
-      <h2>Editing Actions File</h2>
-      <p><a class="cmd" href="edit-actions-section-add?f=@f@&amp;v=@v@&amp;s=0">Insert new section at top</a></p>
-    </td>
-  </tr>
-</table>
-
-@sections@
-
-</div>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
diff --git a/templates/edit-actions-list-section b/templates/edit-actions-list-section
deleted file mode 100644 (file)
index 2de8ce2..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-section,v $
-#
-# Purpose     :  Template which forms part of edit-actions-list
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list-section,v $
-#    Revision 1.6  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.5  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.4  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.3  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# sectionid
-# urls
-#
-#############################################################################
-#
-# ** Important note: **
-#
-# It is important to keep this file small.  That's why all the
-# identifiers in the HTML are short and cryptic.  Currently, the main
-# edit-actions page is ~300k.  Before it was optimized, it was ~550k.
-#
-#############################################################################
-<table border="0" width="100%" cellspacing="0" cellpadding="3" class="wide">
-<tr class="actions" valign="top">
- <td class="header" align="right">Actions:</td>
- <td align="center"><a name="l@s@" href="eas?f=@f@&amp;v=@v@&amp;s=@s@">Edit</a></td>
- <td class="action" align="left">@actions@</td>
-</tr>
-<tr class="rule">
- <td colspan="3"><img src="t" width="2" height="1" alt="----"></td>
-</tr>
-<tr class="url1" valign="top">
- <td class="header" align="right">URLs:</a></td>
- <td align="center"><a href="eaa?f=@f@&amp;v=@v@&amp;s=@s@">Add</a></td>
- <td align="left">&nbsp;</td>
-</tr>
-@urls@
-<tr class="rule">
- <td colspan="3"><img src="t" width="2" height="1" alt="-"></td>
-</tr>
-<tr class="adv" valign="top">
- <td class="header" align="right"><b>Advanced:</b></td>
- <td colspan="2">
-  <table border="0" cellspacing="0" cellpadding="4">
-   <tr valign="middle" align="center">
-    <td class="nbr"> &nbsp; @if-s-prev-exists-start@<a href="eass?f=@f@&amp;v=@v@&amp;s1=@s-prev@&amp;s2=@s@">Move section up</a> &nbsp; @if-s-prev-exists-end@</td>
-    <td class="nbr"> &nbsp; <a href="easa?f=@f@&amp;v=@v@&amp;s=@s@">Insert new section below</a> &nbsp; </td>
-   </tr>
-   <tr valign="middle" align="center">
-    <td class="nbr"> &nbsp; @if-s-next-exists-start@<a href="eass?f=@f@&amp;v=@v@&amp;s1=@s@&amp;s2=@s-next@">Move section down</a> &nbsp; @if-s-next-exists-end@</td>
-    <td class="nbr"> &nbsp; @if-empty-section-start@<a href="easr?f=@f@&amp;v=@v@&amp;s=@s@">Delete whole section</a>&nbsp; @if-empty-section-end@</td>
-   </tr>
-  </table>
- </td>
-</tr>
-</table>
-<p>&nbsp;</p>
-
diff --git a/templates/edit-actions-list-url b/templates/edit-actions-list-url
deleted file mode 100644 (file)
index fcaa7c4..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-list-url,v $
-#
-# Purpose     :  Template which forms part of edit-actions-list
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-list-url,v $
-#    Revision 1.6  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.5  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.4  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.3  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# sectionid
-# urls
-#
-#############################################################################
-#
-# ** Important note: **
-#
-# It is *extremely* important to keep this file small.  That's why all the
-# identifiers in the HTML are short and cryptic.  Currently, the main
-# edit-actions page is ~300k.  Before it was optimized, it was ~550k.
-#
-#############################################################################
-<tr class="url@url-1-2@" valign="top"><td align="left">&nbsp;</td>
-<td align="center" class="nbr"><a name="l@p@"
-href="ear?f=@f@&amp;v=@v@&amp;p=@p@" onclick="return rm_p(@p@,'@url@');">Remove</a>&nbsp;&nbsp;&nbsp;<a
-href="eau?f=@f@&amp;v=@v@&amp;p=@p@">Edit</a>&nbsp;</td>
-<td class="url" align="left">@url-html@</td>
-</tr>
diff --git a/templates/edit-actions-remove-url-form b/templates/edit-actions-remove-url-form
deleted file mode 100644 (file)
index 596391e..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-remove-url-form,v $
-#
-# Purpose     :  Template used to confirm removal of a particular URL
-#                pattern from an actions file.  Only used on browsers that
-#                don't support JavaScript.
-# 
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-remove-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:12  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# filename
-# ver
-# section
-# pattern
-# oldval
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Remove URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Remove URL Pattern</h2>
-      <p>Are you sure you want to delete this URL pattern?  The pattern is:</p>
-      <p><b>@u@</b></p>
-      <p>
-        <a href="edit-actions-remove-url?f=@f@&amp;v=@v@&amp;p=@p@">OK</a>
-        &nbsp;
-        <a href="edit-actions-list?f=@f@">Cancel</a>
-      </p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
diff --git a/templates/edit-actions-url-form b/templates/edit-actions-url-form
deleted file mode 100644 (file)
index f3766b4..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-##############################################################################
-#
-# File        :  $Source: /cvsroot/ijbswa/current/templates/edit-actions-url-form,v $
-#
-# Purpose     :  Template used to edit a URL pattern in an actions file.
-#
-#
-# Copyright   :  Written by and Copyright (C) 2001 the SourceForge
-#                Privoxy team. http://www.privoxy.org/
-#
-#                Original Author: Copyright (C) 2001 Jonathan Foster
-#                http://www.jon-foster.co.uk/
-#
-#                This program is free software; you can redistribute it 
-#                and/or modify it under the terms of the GNU General
-#                Public License as published by the Free Software
-#                Foundation; either version 2 of the License, or (at
-#                your option) any later version.
-#
-#                This program is distributed in the hope that it will
-#                be useful, but WITHOUT ANY WARRANTY; without even the
-#                implied warranty of MERCHANTABILITY or FITNESS FOR A
-#                PARTICULAR PURPOSE.  See the GNU General Public
-#                License for more details.
-#
-#                The GNU General Public License should be included with
-#                this file.  If not, you can view it at
-#                http://www.gnu.org/copyleft/gpl.html
-#                or write to the Free Software Foundation, Inc., 59
-#                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-#
-# Revisions   :
-#    $Log: edit-actions-url-form,v $
-#    Revision 1.9  2002/03/24 15:23:33  jongfoster
-#    Name changes
-#
-#    Revision 1.8  2002/03/24 11:01:06  swa
-#    name change
-#
-#    Revision 1.7  2002/03/23 16:18:15  swa
-#    renamed every reference to the old name with foobar.
-#    fixed "application foobar application" tag, fixed
-#    "the foobar" with "foobar". left junkbuster in cvs
-#    comments and remarks to history untouched. should
-#    make final rename easier.
-#
-#    Revision 1.6  2002/03/16 15:22:19  jongfoster
-#    Moving 'alpha' warning to the end of the page
-#
-#    Revision 1.5  2002/03/03 10:29:13  swa
-#    point users to the right feedback forms,
-#    not necessarily the developer list.
-#
-#    Revision 1.4  2002/01/23 00:26:45  jongfoster
-#    Reducing length of URLs
-#    Where encoded and unencoded versions of a string existed, removing
-#    the unencoded one.
-#
-#    Revision 1.3  2002/01/17 21:33:00  jongfoster
-#    Replacing all references to the URL of the config interface
-#    with @default-cgi@
-#
-#    Revision 1.2  2002/01/17 21:21:05  jongfoster
-#    DOS->Unix line endings
-#
-#    Revision 1.1  2001/11/13 00:58:18  jongfoster
-#    New version of actions file editor templates
-#
-#
-##############################################################################
-#
-# Standard support:
-#
-# This file currently produces valid HTML 4.01 Strict.
-#
-# If you change it, please save the generated page from your web browser
-# and then upload it to http://validator.w3.org/ for checking.
-#
-#############################################################################
-#
-# Available variables include:
-#
-# f - filename
-# v - version
-# s - section
-# p - pattern
-# u - old value of URL
-#
-#############################################################################
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-
-<head>
-<meta http-equiv="Content-Style-Type" content="text/css">
-<meta http-equiv="Content-Script-Type" content="text/javascript">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="robots" content="noindex,nofollow">
-
-<title>Privoxy: Edit URL Pattern</title>
-
-<style type="text/css">
-body         { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif;
-               background-color: #ffffff;
-               color: #000000            }
-td.light     { background-color: #eeeeee }
-td.dark      { background-color: #dddddd }
-</style>
-
-<script type="text/javascript">
-<!--
-function validate(text)
-{
-  if (text=="")
-  {
-    alert("You need to type a pattern in order to continue!");
-    return false;
-  }
-
-  return true;
-}
-//-->
-</script>
-
-</head>
-
-<body>
-
-<table cellpadding="20" cellspacing="10" border="0" width="100%">
-  <tr>
-    <td class="dark">
-      <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="light">
-      <h2>Edit URL Pattern</h2>
-      <form method="GET" action="edit-actions-url"
-            onSubmit="return validate(u.value);">
-        <p>
-          <input type="hidden" name="f" value="@f@">
-          <input type="hidden" name="v" value="@v@">
-          <input type="hidden" name="p" value="@p@">
-          <input type="text" name="u" value="@u@" size="78"><br>
-          <input type="submit" value="Submit"> &nbsp;
-          <input type="reset" value="Reset"> &nbsp;
-          <a href="edit-actions-list?f=@f@">Cancel</a>
-        </p>
-      </form>
-    </td>
-  </tr>
-
-  <tr>
-    <td class="dark">
-      <h2>More Privoxy:</h2>
-      <ul>@menu@</ul>
-    </td>
-  </tr>
-
-  <tr>
-    <td>
-      <small><small>Valid <a href="http://validator.w3.org/">HTML 4.01 Strict</a></small></small>
-    </td>
-  </tr>
-
-</table>
-
-</body>
-
-</html>
-
index e119f75..a8c0202 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# No-Such-Domain Error Output template for Privoxy.
+# No-Such-Domain Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
@@ -32,8 +32,8 @@
 #  my-hostname:
 #    The hostname associated with my-ip-addr
 #  admin-address:
-#    The email address of the proxy's administrator, as configured
-#    in the 'config' file
+#    The email address of the pxoxy's administrator, as configured
+#    in the config file
 #  default-cgi:
 #    The URL for the "main menu" builtin CGI of this proxy
 #  menu:
 #    The URL of the SourceForge ijbswa project, who maintains this
 #    software.
 #
-#  host:
-#    The host part of the request that lead to this problem
+#  host-html:
+#    The host part of the request that lead to this problem, HTML-encoded
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
-#  proxy-info-url:
-#    The URL to local online Privoxy documentation, if define in the
-#    'config' file
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
+#
 #
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 # ------------------------------------------------------------------
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>404 - No such Domain (Privoxy@@my-hostname@)</title>
+  <title>404 - No such Domain (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>404</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>No such domain</h2>
           <blockquote>
-            <p>Your request for <b>http://@hostport@@path@</b> could not be fulfilled, because
-              the domain name <b>@host@</b> could not be resolved.</p>
+            <p>Your request for <b>http://@hostport-html@@path-html@</b> could not be fulfilled, because
+              the domain name <b>@host-html@</b> could not be resolved.</p>
             <p>This is often a temporary failiure, so you might just
               <a href="http://@hostport@@path@">try again</a>.</p>
           </blockquote>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/show-request b/templates/show-request
deleted file mode 100644 (file)
index c1badf4..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-##########################################################
-#
-# Show-Request-CGI Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#  client-request:
-#    The request and headers that the client sent.
-#  processed-request:
-#    What we would have rewritten this request to, if this had not
-#    been intercepted.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#
-<html>
-
-<head>
-  <title>Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-       <h2>Show-Request</h2>
-          <blockquote>
-            Here you see the original headers that your client sent when requesting this page, along with
-            the headers that Privoxy would have sent to the remote server if this request hadn't been
-            intercepted. 
-          </blockquote>
-
-        <h3>Original Client Request:</h3>
-          <blockquote>
-           <pre>@client-request@</pre>
-          </blockquote>
-
-        <h3>Processed Request:</h3>
-          <blockquote>
-           <pre>@processed-request@</pre>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
index 6d9ccfc..e3f8e25 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Status-CGI Output template for Privoxy.
+# Show-Status-CGI Output template for junkbuster 2.9.x
 #
 # USING HTML TEMPLATES:
 # ---------------------
@@ -14,7 +14,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #    software.
 #
 #  redirect-url:
-#    The URL to a script that will redirect to the Privoxy
+#    The URL to a script that will redirect to the junkbuster
 #    documentation for a given item  
 #  invocation:
-#    The command line with whitch Privoxy was invoked
+#    The command line with whitch junkbuster was invoked
 #  options:
 #    The options read from the configfile, linked to their
 #    explanations, plus warnings if parsing acl or forward
@@ -59,7 +59,7 @@
 #    A HTML-formatted list of the individual source file cvs versions
 #  defines:
 #    A HTML-formatted list of all conditional #defines used when
-#    Privoxy was compiled
+#    junkbuster was compiled
 #
 #  
 # CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  statistics:
-#    Privoxy was compiled with statistics support
+#    Junkbuster was compiled with statistics support
 #  have-stats:
 #    There have been previous requests and statistics have
 #    been collected. In this case, the following symbols
 #  have-no-stats:
 #    There haven't any statistics been collected yet
 #  pcrs-support:
-#    Privoxy was compiled with pcrs support
+#    Junkbuster was compiled with pcrs support
 #  trust-support:
-#    Privoxy was compiled with trust support
-#  actions-filename:
-#    The path to the actions file.
-#  re-filter-filename:
-#    The path to the re_filter file. Only available if
-#    pcrs-support is set
-#  trust-filename:
-#    The path to the trust file.Only available if
-#    trust-support is set
+#    Junkbuster was compiled with trust support
+#  split-args:
+#    Junkbuster was compiled with #define SPLIT_PROXY_ARGS
+#    In this case, the following symbols are available:
+#    actions-filename:
+#      The path to the actions file.
+#    re-filter-filename:
+#      The path to the re_filter file. Only available if
+#      pcrs-support is set
+#    trust-filename:
+#      The path to the trust file.Only available if
+#      trust-support is set
+#  no-split-args:
+#    Junkbuster was not compiled with #define SPLIT_PROXY_ARGS
+#    In this case, the following symbols are available:
+#    alist:
+#      The contents of the actionsfile
+#    rlist:
+#      The contents of the re_filterfile. Only available if
+#      pcrs-support is set    
+#    tlist:
+#      The contents of the trustfile. Only available if
+#      trust-support is set
+#
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@: Proxy Status</title>
+  <title>Junkbuster@@my-hostname@: Proxy Status</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
+      </td>
+    </tr>
+
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
+<!-- if-unstable-end@ -->
 
     <tr>
       <td bgcolor=#eeeeee>
         <blockquote>
 <!-- @if-have-stats-start -->
         @requests-blocked@ out of @requests-received@ requests have been blocked,
-        which equals a block rate of @percent-blocked@%.
+        which equals a block rate of @percent-blocked@.
 <!-- if-have-stats-end@ -->
 <!-- @if-have-no-stats-start -->
         There haven't been any requests so far.
     </tr>
 <!-- if-statistics-end@ -->
 
+<!-- @if-split-args-start -->
     <tr>
       <td bgcolor=#eeeeee>
         <h2>The following files are in use:</h2>
         </ul>
       </td>
     </tr>
+<!-- if-split-args-end@ -->
 
+<!-- @if-no-split-args-start -->
     <tr>
       <td bgcolor=#eeeeee>
-        <h2>Conditional #defines:</h2>
-          <table border=1>
-          <tr> 
-            <th>#define</th> <th>Enabled?</th> <th>Effects when enabled</th>
-          </tr>
-          <tr>
-             <td><code>FEATURE_ACL</code></td>
-             <td>@if-FEATURE_ACL-then@ Yes @else-not-FEATURE_ACL@ No @endif-FEATURE_ACL@</td>
-             <td>Allows the use of an ACL to control access to the proxy by IP address.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_CGI_EDIT_ACTIONS</code></td>
-             <td>@if-FEATURE_CGI_EDIT_ACTIONS-then@ Yes @else-not-FEATURE_CGI_EDIT_ACTIONS@ No @endif-FEATURE_CGI_EDIT_ACTIONS@</td>
-             <td>Allows the use of the web-based actions file 
-               editor@if-FEATURE_CGI_EDIT_ACTIONS-then@, which is <a href="@default-cgi@edit-actions">here</a>@else-not-FEATURE_CGI_EDIT_ACTIONS@@endif-FEATURE_CGI_EDIT_ACTIONS@.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_COOKIE_JAR</code></td>
-             <td>@if-FEATURE_COOKIE_JAR-then@ Yes @else-not-FEATURE_COOKIE_JAR@ No @endif-FEATURE_COOKIE_JAR@</td>
-             <td>Allows the use of a "cookie jar" file to capture cookies.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_FAST_REDIRECTS</code></td>
-             <td>@if-FEATURE_FAST_REDIRECTS-then@ Yes @else-not-FEATURE_FAST_REDIRECTS@ No @endif-FEATURE_FAST_REDIRECTS@</td>
-             <td>Allows the +fast-redirects action, to bypass redirect and logging scripts.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_FORCE_LOAD</code></td>
-             <td>@if-FEATURE_FORCE_LOAD-then@ Yes @else-not-FEATURE_FORCE_LOAD@ No @endif-FEATURE_FORCE_LOAD@</td>
-             <td>Allows bypassing all filtering for a single page using the prefix "<code>@FORCE_PREFIX@</code>".</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_IMAGE_BLOCKING</code></td>
-             <td>@if-FEATURE_IMAGE_BLOCKING-then@ Yes @else-not-FEATURE_IMAGE_BLOCKING@ No @endif-FEATURE_IMAGE_BLOCKING@</td>
-             <td>Allows the +image ation, to send "blocked" images instead of HTML.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_IMAGE_DETECT_MSIE</code></td>
-             <td>@if-FEATURE_IMAGE_DETECT_MSIE-then@ Yes @else-not-FEATURE_IMAGE_DETECT_MSIE@ No @endif-FEATURE_IMAGE_DETECT_MSIE@</td>
-             <td>Enables automatic detection of image and HTML requests from
-             Microsoft Internet Explorer users, overriding the setting of 
-             +image in the actions file.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_KILL_POPUPS</code></td>
-             <td>@if-FEATURE_KILL_POPUPS-then@ Yes @else-not-FEATURE_KILL_POPUPS@ No @endif-FEATURE_KILL_POPUPS@</td>
-             <td>Allows the +no-popups action, to block JavaScript popups.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_NO_GIFS</code></td>
-             <td>@if-FEATURE_NO_GIFS-then@ Yes @else-not-FEATURE_NO_GIFS@ No @endif-FEATURE_NO_GIFS@</td>
-             <td>Use PNG instead of GIF for the built-in images.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_PTHREAD</code></td>
-             <td>@if-FEATURE_PTHREAD-then@ Yes @else-not-FEATURE_PTHREAD@ No @endif-FEATURE_PTHREAD@</td>
-             <td>Use POSIX threads rather than native threads</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_STATISTICS</code></td>
-             <td>@if-FEATURE_STATISTICS-then@ Yes @else-not-FEATURE_STATISTICS@ No @endif-FEATURE_STATISTICS@</td>
-             <td>Enables the statistics function.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_TOGGLE</code></td>
-             <td>@if-FEATURE_TOGGLE-then@ Yes @else-not-FEATURE_TOGGLE@ No @endif-FEATURE_TOGGLE@</td>
-             <td>Allow Privoxy to be "disabled" so it is just a normal non-blocking non-anonymizing proxy.</td>
-          </tr>
-          <tr>
-             <td><code>FEATURE_TRUST</code></td>
-             <td>@if-FEATURE_TRUST-then@ Yes @else-not-FEATURE_TRUST@ No @endif-FEATURE_TRUST@</td>
-             <td>Allows the use of trust files.</td>
-          </tr>
-          <tr>
-             <td><code>REGEX_GNU</code></td>
-             <td>@if-REGEX_GNU-then@ Yes @else-not-REGEX_GNU@ No @endif-REGEX_GNU@</td>
-             <td rowspan="2">Changes the type of pattern matching done on URL paths.  PCRE is by far the best.
-             The old GNU style will slow down Privoxy and increase the executable's size.  If both of
-             these are disabled, simple prefix matching is done, but this is very inflexible.</td>
-          </tr>
-          <tr>
-             <td><code>REGEX_PCRE</code></td>
-             <td>@if-REGEX_PCRE-then@ Yes @else-not-REGEX_PCRE@ No @endif-REGEX_PCRE@</td>
-          </tr>
-          <tr>
-             <td><code>STATIC_PCRE</code></td>
-             <td>@if-STATIC_PCRE-then@ Yes @else-not-STATIC_PCRE@ No @endif-STATIC_PCRE@</td>
-             <td>Use the supplied statically-linked PCRE library.  This is set automatically
-             by <code>./configure</code> if you do not have the libpcre installed.</td>
-          </tr>
-          <tr>
-             <td><code>STATIC_PCRS</code></td>
-             <td>@if-STATIC_PCRS-then@ Yes @else-not-STATIC_PCRS@ No @endif-STATIC_PCRS@</td>
-             <td>Use the supplied statically-linked PCRS library.  This is set automatically
-             by <code>./configure</code> if you do not have the libpcrs installed.</td>
-          </tr>
-        </table>
+        <h2>Actions List:</h2>
+        <blockquote><pre>@alist@</pre></blockquote>
       </td>
     </tr>
 
+<!-- @if-pcrs-support-start -->
     <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
+      <td bgcolor=#eeeeee>
+        <h2>Regex Filter List:</h2>
+        <blockquote><pre>@rlist@</pre></blockquote>
       </td>
     </tr>
+<!-- if-pcrs-support-end@ -->
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+<!-- @if-trust-support-start -->
     <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+      <td bgcolor=#eeeeee>
+        <h2>Trust List:</h2>
+        <blockquote><pre>@tlist@</pre></blockquote>
+      </td>
+    </tr>
+<!-- if-trust-support-end@ -->
+<!-- if-no-split-args-end@ -->
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Source code versions:</h2>
+        <blockquote><pre>@sourceversions@</pre></blockquote>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Conditional #defines:</h2>
+        <ul>@defines@</ul>
       </td>
     </tr>
-<!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <h2>More Junkbuster:</h2>
+        <ul>@menu@</ul>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#dddddd>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
index e8a2b7e..659cf0d 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Status-CGI Output template for Privoxy.
+# Show-Status-CGI Output template for junkbuster 2.9.x
 # (Variant for the show-file mode)
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@: Contents of @file-description@</title>
+  <title>Junkbuster@@my-hostname@: Contents of @file-description@</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Contents of @file-description@ (@filepath@)</h2>
-        <blockquote><pre>@contents@</pre></blockquote>
-      </td>
-    </tr>
 <!-- @if-unstable-start -->
 # This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
     <tr>
       <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
           <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
         </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
       </td>
     </tr>
 <!-- if-unstable-end@ -->
 
-<!-- @if-have-help-info-start -->
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Contents of @file-description@ (@filepath@)</h2>
+        <blockquote><pre>@contents@</pre></blockquote>
+      </td>
+    </tr>
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
+        <p>Back to the <a href=@default-cgi@>main page</a>.</p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
index 76fc5f0..56c3373 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# Show-Url-Info-CGI Output template for Privoxy.
+# Show-Url-Info-CGI Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  unstable:
 #    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  url-given:
 #    The CGI was called with a url parameter. In that case, the
 #    following symbols are available:
 #    url:
 #      The given URL
+#    url-html:
+#      The given URL, HTML-encoded
 #    default:
 #      The system default for actions
 #    matches:
@@ -82,7 +76,7 @@
 <html>
 
 <head>
-  <title>Privoxy@@my-hostname@ URL Info</title>
+  <title>Junkbuster@@my-hostname@ URL Info</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
   <table cellpadding=20 cellspacing=10 border=0 width=100%>
     <tr>
       <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
 <!-- @if-url-given-start -->
     <tr>
       <td bgcolor=#eeeeee>
-<!-- @if-https-start -->
-        <h2>NOTE:</h2>
-        <p>This is a secure (https:) URL, so the part after the "/" is ignored.
-          This is a feature of the HTTPS protocol - the exact address of the
-          page you're visiting is hidden.  Privoxy can only detect the host
-          part of the URL.</p>
-        <p>&nbsp;</p>
-<!-- if-https-end@ -->
-        <h2>Matches for <a href="@url@">@url@</a>:</h2>
+        <h2>System default actions:</h2>
+        <p>{@default@}</p>
+      </td>
+    </tr>
+
+    <tr>
+      <td bgcolor=#eeeeee>
+        <h2>Matches for <a href="http://@url@">http://@url-html@</a>:</h2>
         <p>@matches@</p>
       </td>
     </tr>
     <tr>
       <td bgcolor=#eeeeee>
         <h2>Final results:</h2>
-        <p><b>@final@</b></p>
+        <p>@final@</p>
       </td>
     </tr>
 <!-- if-url-given-end@ -->
         <h2>Look up the actions for a 
 <!-- @if-url-given-start -->new<!-- if-url-given-end@ -->
           URL:</h2>
-        <form method="GET" action="@default-cgi@show-url-info">
+        <form method="GET" action="http://i.j.b/show-url-info">
           <input type="text" name="url" size="80" value="@url@"> 
           <input type="submit" value="Go">
         </form>
 
     <tr>
       <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
-    
   </table>
 
 </body>
diff --git a/templates/show-version b/templates/show-version
deleted file mode 100644 (file)
index debd5d7..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-##########################################################
-#
-# Show-Status-CGI Output template for Privoxy.
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-#  redirect-url:
-#    The URL to a script that will redirect to the Privoxy
-#    documentation for a given item  
-#  invocation:
-#    The command line with whitch Privoxy was invoked
-#  options:
-#    The options read from the configfile, linked to their
-#    explanations, plus warnings if parsing acl or forward
-#    statements produced errors.
-#  sourceversions:
-#    A HTML-formatted list of the individual source file cvs versions
-#  defines:
-#    A HTML-formatted list of all conditional #defines used when
-#    Privoxy was compiled
-#
-#  
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  sourceversions
-#    The versions.
-<html>
-
-<head>
-  <title>Privoxy@@my-hostname@: Detailed proxy version information</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Source code versions:</h2>
-        <p><i>(Note: This information is only relevant if you checked out Privoxy from CVS
-           and compiled it yourself.  If you downloaded a binary, .exe, RPM, or a .tgz file, 
-           then when you ask for support just mention the version number <b>@version@</b> 
-           and the type of download you got.)</i></p>
-        <p>&nbsp;</p>
-        <blockquote><pre>@sourceversions@</pre></blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-
-  </table>
-
-</body>
-</html>
diff --git a/templates/toggle b/templates/toggle
deleted file mode 100644 (file)
index 6dc0f00..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-##########################################################
-#
-# Toggle Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@
-#
-<html>
-
-<head>
-  
-  <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#ffffff">
-
-  <table cellpadding=20 cellspacing=10 border=0 width=100%>
-    <tr>
-      <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>Privoxy is @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</h2>
-          <blockquote>
-            <p>When enabled, Privoxy performs its magic - blocking
-               adverts, filtering cookies, regex-filtering, etc.</p>
-            <p>When disabled, Privoxy behaves as a normal HTTP proxy,
-               and will not affect your web browsing.</p>
-            <p><a href="@default-cgi@toggle?set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@">Click
-               here</a> to @if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@ Privoxy.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Bookmarklets</h2>
-          <blockquote>
-            <p>Here are some bookmarklets to allow you to easily access a
-               "mini" version of this page.  They are designed for MS 
-               Internet Explorer, but should work equally well in
-               Netscape, Mozilla, and other browsers which support
-               JavaScript.  They are designed to run directly from
-               your bookmarks - <b>not</b> by clicking the links
-               below (although that will work for testing).</p>
-
-            <p>To save them, right-click the link and choose
-               "Add to Favorites" (IE) or "Add Bookmark" (Netscape).  You
-               will get a warning that the bookmark "may not be safe" - just
-               click OK.  Then you can run the Bookmarklet directly from your
-               favourites/bookmarks.  For even faster access, you can put
-               them on the "Links" bar (IE) or the "Personal Toolbar"
-               (Netscape), and run them with a single click.</p>
-
-            <ul>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=enabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Enable Privoxy</a></li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=disabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Disable Privoxy</a></li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y&set=toggle','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Toggle Privoxy</a>
-                  (Toggles between enabled and disabled)</li>
-              <li><a href="javascript:void(window.open('@default-cgi@toggle?mini=y','ijbstatus','width=250,height=2,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">View Privoxy Status</a></li>
-            </ul>
-
-            <p><b>Credit:</b> The site which gave me the general idea for these
-               bookmarklets is
-               <a href="http://www.bookmarklets.com/">www.bookmarklets.com</a>.
-               They have more information
-               <a href="http://www.bookmarklets.com/about/">about bookmarklets</a>.</p>
-          </blockquote>
-      </td>
-    </tr>
-
-    <tr>
-      <td bgcolor=#eeeeee>
-        <h2>More Privoxy:</h2>
-        <ul>@menu@</ul>
-      </td>
-    </tr>
-
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
-    <tr>
-      <td bgcolor=#dddddd>
-        <h2>Local Privoxy support:</h2>
-
-<!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
-<!-- if-have-proxy-info-end@ -->
-
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
-          who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
-        </p>
-      </td>
-    </tr>
-<!-- if-have-help-info-end@ -->
-    
-  </table>
-
-</body>
-</html>
diff --git a/templates/toggle-mini b/templates/toggle-mini
deleted file mode 100644 (file)
index 68f87f5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-##########################################################
-#
-# Toggle Output template for Privoxy.
-#
-#
-# USING HTML TEMPLATES:
-# ---------------------
-#
-# Template files are written win plain HTML, with a few
-# additions:
-# 
-# - Lines that start with a '#' character like this one
-#   are ignored
-#
-# - Each item in the below list of exported symbols will
-#   be replaced by dynamically generated text, if they
-#   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
-#
-# - One special application of this is to make whole blocks
-#   of the HTML template disappear if the condition <name>
-#   is not given. Simply enclose the block between the two
-#   strings @if-<name>start and if-<name>-end@. The strings
-#   should be placed in HTML comments (<!-- -->), so the
-#   html structure won't be messed when the magic happens.
-#   
-# USABLE SYMBOLS IN THIS TEMPLATE:
-# --------------------------------
-#
-#  my-ip-addr:
-#    The IP-address that the client used to reach this proxy
-#  my-hostname:
-#    The hostname associated with my-ip-addr
-#  admin-address:
-#    The email address of the pxoxy's administrator, as configured
-#    in the config file
-#  default-cgi:
-#    The URL for the "main menu" builtin CGI of this proxy
-#  menu:
-#    List of <li> elements linking to the other available CGIs
-#  version:
-#    The version number of the proxy software
-#  code-status:
-#    The development status of the proxy software: "alpha", "beta",
-#    or "stable".
-#  homepage:
-#    The URL of the SourceForge ijbswa project, who maintains this
-#    software.
-#
-# CONDITIONAL SYMBOLS FOR THIS TEMPLATE AND THEIR DEPANDANT SYMBOLS:
-# ------------------------------------------------------------------
-#
-#  unstable:
-#    this is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
-#  have-proxy-info:
-#    A URL for online documentation about this proxy has been
-#    specified and is available through the "proxy-info-url"
-#    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
-#  @if-enabled-display-then@ on @else-not-enabled-display@ off @endif-enabled-display@
-#
-<html>
-
-<head>
-  
-  <title>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@ - Privoxy@@my-hostname@</title>
-  <style type="text/css">
-    BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
-  </style>
-</head>
-
-<body bgcolor="#eeeeee" marginwidth="3" marginheight="3"
-leftmargin="3" rightmargin="3" topmargin="3" bottommargin="3">
-<center>
-<a href="@default-cgi@" target="_blank">Privoxy</a> is 
-<b>@if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b>.
-<a href="@default-cgi@toggle?mini=y&set=@if-enabled-display-then@disable@else-not-enabled-display@enable@endif-enabled-display@"
->@if-enabled-display-then@[Disable]@else-not-enabled-display@[Enable]@endif-enabled-display@</a>
-<br>
-<a href="" onclick="window.close();">[Close]</a>
-</center>
-</body>
-</html>
index 9db1aa0..2bf2228 100644 (file)
@@ -1,6 +1,6 @@
 ##########################################################
 #
-# "Untrusted" Error Output template for Privoxy.
+# "Untrusted" Error Output template for junkbuster 2.9.x.
 #
 #
 # USING HTML TEMPLATES:
@@ -15,7 +15,7 @@
 # - Each item in the below list of exported symbols will
 #   be replaced by dynamically generated text, if they
 #   are enclosed in '@'-characters. E.g. The string @version@
-#   will be replaced by the version number of Privoxy.
+#   will be replaced by the version number of Junkbuster.
 #
 # - One special application of this is to make whole blocks
 #   of the HTML template disappear if the condition <name>
 #
 #  hostport:
 #    The host and port part of the request that lead to this problem
+#  hostport-html:
+#    The host and port part of the request that lead to this problem, HTML-encoded
 #  path:
 #    The path part of the request that lead to this problem
+#  path-html:
+#    The path part of the request that lead to this problem, HTML-encoded
 #  referrer:
 #    The referrer of the request that lead to this problem
+#  referrer-html:
+#    The referrer of the request that lead to this problem, HTML-encoded
 #  trusted-referrers:
 #    An HTML-formatted list of referrers that are marked as trusted in
 #    the trustfile
 #
 #  unstable:
 #    This is an alpha or beta release of the proxy software
-#  have-adminaddr-info:
-#    An e-mail address for the local Privoxy adminstrator has
-#    been specified and is available through the "admin-address"
-#    symbol
 #  have-proxy-info:
 #    A URL for online documentation about this proxy has been
 #    specified and is available through the "proxy-info-url"
 #    symbol
-#  have-help-info:
-#    If either have-proxy-info is true or have-adminaddr-info is
-#    true, have-help-info is true.  Used to conditionally include
-#    a grey box for any and all help info.
 #  force-support:
-#    Privoxy has been compiled with support for forced loading
+#    Junkbuster has been compiled with support for forced loading
 #    of blocked content. In that case, the symbol "force-prefix" is
 #    avaiable, which translates to the FORCE_PREFIX  
 #  have-trust-info:
@@ -88,7 +86,7 @@
 <html>
 
 <head>
-  <title>Untrusted request (Privoxy@@my-hostname@)</title>
+  <title>Untrusted request (Junkbuster@@my-hostname@)</title>
   <style type="text/css">
     BODY, P, H1, H2, UL, OL, LI { font-family: Helvetica, Helv, Arial, Sans-Serif, sans-serif }
   </style>
         <p><font size=+5 color=#ffffff><b>UNTRUSTED</b></font></p>
       </td>
       <td bgcolor=#dddddd width=100%>
-        <p><big><big><b>This is Privoxy (privacy enhancing proxy) @version@ on @my-hostname@ (@my-ip-address@), port @my-port@, @if-enabled-display-then@Enabled@else-not-enabled-display@Disabled@endif-enabled-display@</b></big></big></p>
+        <p><font size=+2><b>This is the Internet J</b></font><font size=+1><b>UNK<i></font><font color="red">BUSTER</font></i></b>
+          <font size=+2><b>@version@ on @my-hostname@ (@my-ip-address@), port @my-port@</b></font></p>
       </td>
     </tr>
 
+<!-- @if-unstable-start -->
+# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
+    <tr>
+      <td bgcolor=#ffdddd colspan=2>
+        <p><b>Please note that this is a <font color=red>@code-status@</font> release,
+          of the proxy software, not intended for production systems!
+          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
+        </p>
+
+        <p>Feel free to <a href=mailto:ijbswa-developers@lists.sourceforge.net>mail the developers</a>
+          with any problems you might have
+        </p>
+      </td>
+    </tr>
+<!-- if-unstable-end@ -->
+
+
     <tr>
       <td bgcolor=#eeeeee colspan=2>
         <h2>Request for untrusted URL</h2>
         <blockquote>
-          <p>Your request for <b>@hostport@@path@</b> was blocked,
+          <p>Your request for <b>@hostport-html@@path-html@</b> was blocked,
             because neither the request URL itself, nor its referrer
-            (<a href="@referrer@">@referrer@</a>) were trusted.
+            (<a href="@referrer@">@referrer-html@</a>) were trusted.
           </p>
 <!-- @if-force-support-start -->
           <p>(You can <a href="http://@hostport@@force-prefix@@path@">go there anyway</a>.)</p>
 
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>More Privoxy:</h2>
+        <h2>More Junkbuster:</h2>
         <ul>@menu@</ul>
       </td>
     </tr>
 
-<!-- @if-unstable-start -->
-# This will only appear if CODE_STATUS is "alpha" or "beta". See configure.in
-    <tr>
-      <td bgcolor=#ffdddd colspan=2>
-        <p><b>Please note that this <font color=red>@code-status@</font> release
-          of the proxy software is not intended for production systems!
-          <br>Use at your own risk. See the <a href="http://www.gnu.org/copyleft/gpl.html">license</a> for details.</b>
-        </p>
-       <p>
-<h2>Support and Service via Sourceforge</h2>
-<p>
-We value your feedback. However, to provide you with the best support,
-please note:
-<ul>
-  <li>Use the <a href="http://sourceforge.net/tracker/?group_id=11118&atid=211118">support forum</a> to get
-  help.</li>
-  <li>Submit bugs only thru our <a href="http://sourceforge.net/tracker/?group_id=11118&atid=111118">bug
-      forum</a>. Make sure that the bug has not yet been submitted.</li>
-  <li>Submit feature requests only thru our <a
-      href="http://sourceforge.net/tracker/?atid=361118&group_id=11118&func=browse">feature request forum</a>.</li>
-</ul>
-</p>
-<p>
-For any other issues, feel free to use the <a
-href="http://sourceforge.net/mail/?group_id=11118">mailing lists</a>.
-</p>
-      </td>
-    </tr>
-<!-- if-unstable-end@ -->
-
-<!-- @if-have-help-info-start -->
     <tr>
       <td bgcolor=#dddddd colspan=2>
-        <h2>Local Privoxy support:</h2>
+        <p>If you have any questions about this service,
 
 <!-- @if-have-proxy-info-start -->
-        <p>You can consult the <a href="@proxy-info-url@">online documentation</a> for more information about this Privoxy installation.         
+          consult the <a href="@proxy-info-url@">online documentation</a> or
 <!-- if-have-proxy-info-end@ -->
 
-<!-- @if-have-adminaddr-info-start -->
-        <p>Address e-mail questions about this service to
-          <a href=mailto:@admin-address@><code>@admin-address@</code></a>,
+          <a href=mailto:@admin-address@>send mail to <code>@admin-address@</code></a>
           who will be glad to help you.
-<!-- if-have-adminaddr-info-end@ -->
-
         </p>
       </td>
     </tr>
-<!-- if-have-help-info-end@ -->
 
   </table>
 
 </body>
-</html>
+</html>
\ No newline at end of file
diff --git a/testdrive.status b/testdrive.status
deleted file mode 100644 (file)
index 3627548..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-CHUNK:                 ASSIGNED TO:                    RUN1:   RUN2:
----------------------------------------------------------------------
-testdrive-intl-aa      
-testdrive-intl-ab
-testdrive-intl-ac
-testdrive-intl-ad
-testdrive-intl-ae
-testdrive-intl-af
-testdrive-intl-ag
-testdrive-intl-ah
-testdrive-intl-ai      swa                             x       
-testdrive-intl-aj
-testdrive-intl-ak
-testdrive-unstable
-testdrive-us-aa
-testdrive-us-ab
-testdrive-us-ac
-testdrive-us-ad     Hal                        x
-testdrive-us-ae
-testdrive-us-af
-testdrive-us-ag
-testdrive-us-ah
-testdrive-us-ai
-testdrive-us-aj
-testdrive-us-ak
-testdrive-us-al
-testdrive-us-am
-testdrive-us-an
-testdrive-us-ao
-testdrive-us-ap
-
diff --git a/urlmatch.c b/urlmatch.c
deleted file mode 100644 (file)
index 772261d..0000000
+++ /dev/null
@@ -1,824 +0,0 @@
-const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.6 2002/03/24 13:25:43 swa Exp $";
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.c,v $
- *
- * Purpose     :  Declares functions to match URLs against URL
- *                patterns.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: urlmatch.c,v $
- *    Revision 1.6  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.5  2002/03/13 00:27:05  jongfoster
- *    Killing warnings
- *
- *    Revision 1.4  2002/03/07 03:46:17  oes
- *    Fixed compiler warnings
- *
- *    Revision 1.3  2002/03/03 14:51:11  oes
- *    Fixed CLF logging: Added ocmd member for client's request to struct http_request
- *
- *    Revision 1.2  2002/01/21 00:14:09  jongfoster
- *    Correcting comment style
- *    Fixing an uninitialized memory bug in create_url_spec()
- *
- *    Revision 1.1  2002/01/17 20:53:46  jongfoster
- *    Moving all our URL and URL pattern parsing code to the same file - it
- *    was scattered around in filters.c, loaders.c and parsers.c.
- *
- *    Providing a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Providing parse_http_url() so that URLs can be parsed without faking a
- *    HTTP request line for parse_http_request() or repeating the parsing
- *    code (both of which were techniques that were actually in use).
- *
- *    Standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *
- *********************************************************************/
-\f
-
-#include "config.h"
-
-#ifndef _WIN32
-#include <stdio.h>
-#include <sys/types.h>
-#endif
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <assert.h>
-#include <string.h>
-
-#if !defined(_WIN32) && !defined(__OS2__)
-#include <unistd.h>
-#endif
-
-#include "project.h"
-#include "urlmatch.h"
-#include "ssplit.h"
-#include "miscutil.h"
-#include "errlog.h"
-
-const char urlmatch_h_rcs[] = URLMATCH_H_VERSION;
-
-/* Fix a problem with Solaris.  There should be no effect on other
- * platforms.
- * Solaris's isspace() is a macro which uses it's argument directly
- * as an array index.  Therefore we need to make sure that high-bit
- * characters generate +ve values, and ideally we also want to make
- * the argument match the declared parameter type of "int".
- *
- * Why did they write a character function that can't take a simple
- * "char" argument?  Doh!
- */
-#define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
-#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
-
-
-/*********************************************************************
- *
- * Function    :  free_http_request
- *
- * Description :  Freez a http_request structure
- *
- * Parameters  :
- *          1  :  http = points to a http_request structure to free
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_http_request(struct http_request *http)
-{
-   assert(http);
-
-   freez(http->cmd);
-   freez(http->ocmd);
-   freez(http->gpc);
-   freez(http->host);
-   freez(http->url);
-   freez(http->hostport);
-   freez(http->path);
-   freez(http->ver);
-   freez(http->host_ip_addr_str);
-   freez(http->dbuffer);
-   freez(http->dvec);
-   http->dcount = 0;
-}
-
-
-/*********************************************************************
- *
- * Function    :  parse_http_url
- *
- * Description :  Parse out the host and port from the URL.  Find the
- *                hostname & path, port (if ':'), and/or password (if '@')
- *
- * Parameters  :
- *          1  :  url = URL (or is it URI?) to break down
- *          2  :  http = pointer to the http structure to hold elements.
- *                       Will be zeroed before use.  Note that this
- *                       function sets the http->gpc and http->ver
- *                       members to NULL.
- *          3  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out of memory
- *                JB_ERR_CGI_PARAMS on malformed command/URL
- *                                  or >100 domains deep.
- *
- *********************************************************************/
-jb_err parse_http_url(const char * url,
-                      struct http_request *http,
-                      struct client_state *csp)
-{
-   /*
-    * Zero out the results structure
-    */
-   memset(http, '\0', sizeof(*http));
-
-
-   /*
-    * Save our initial URL
-    */
-   http->url = strdup(url);
-   if (http->url == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-
-   /*
-    * Split URL into protocol,hostport,path.
-    */
-   {
-      char *buf;
-      char *url_noproto;
-      char *url_path;
-
-      buf = strdup(url);
-      if (buf == NULL)
-      {
-         return JB_ERR_MEMORY;
-      }
-
-      /* Find the start of the URL in our scratch space */
-      url_noproto = buf;
-      if (strncmpic(url_noproto, "http://",  7) == 0)
-      {
-         url_noproto += 7;
-         http->ssl = 0;
-      }
-      else if (strncmpic(url_noproto, "https://", 8) == 0)
-      {
-         url_noproto += 8;
-         http->ssl = 1;
-      }
-      else
-      {
-         http->ssl = 0;
-      }
-
-      url_path = strchr(url_noproto, '/');
-      if (url_path != NULL)
-      {
-         /*
-          * Got a path.
-          *
-          * NOTE: The following line ignores the path for HTTPS URLS.
-          * This means that you get consistent behaviour if you type a
-          * https URL in and it's parsed by the function.  (When the
-          * URL is actually retrieved, SSL hides the path part).
-          */
-         http->path = strdup(http->ssl ? "/" : url_path);
-         *url_path = '\0';
-         http->hostport = strdup(url_noproto);
-      }
-      else
-      {
-         /*
-          * Repair broken HTTP requests that don't contain a path,
-          * or CONNECT requests
-          */
-         http->path = strdup("/");
-         http->hostport = strdup(url_noproto);
-      }
-
-      free(buf);
-
-      if ( (http->path == NULL)
-        || (http->hostport == NULL))
-      {
-         free(buf);
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-
-   /*
-    * Split hostport into user/password (ignored), host, port.
-    */
-   {
-      char *buf;
-      char *host;
-      char *port;
-
-      buf = strdup(http->hostport);
-      if (buf == NULL)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      /* check if url contains username and/or password */
-      host = strchr(buf, '@');
-      if (host != NULL)
-      {
-         /* Contains username/password, skip it and the @ sign. */
-         host++;
-      }
-      else
-      {
-         /* No username or password. */
-         host = buf;
-      }
-
-      /* check if url contains port */
-      port = strchr(host, ':');
-      if (port != NULL)
-      {
-         /* Contains port */
-         /* Terminate hostname and point to start of port string */
-         *port++ = '\0';
-         http->port = atoi(port);
-      }
-      else
-      {
-         /* No port specified. */
-         http->port = (http->ssl ? 143 : 80);
-      }
-
-      http->host = strdup(host);
-
-      free(buf);
-
-      if (http->host == NULL)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-   }
-
-
-   /*
-    * Split domain name so we can compare it against wildcards
-    */
-   {
-      char *vec[BUFFER_SIZE];
-      size_t size;
-      char *p;
-
-      http->dbuffer = strdup(http->host);
-      if (NULL == http->dbuffer)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      /* map to lower case */
-      for (p = http->dbuffer; *p ; p++)
-      {
-         *p = tolower((int)(unsigned char)*p);
-      }
-
-      /* split the domain name into components */
-      http->dcount = ssplit(http->dbuffer, ".", vec, SZ(vec), 1, 1);
-
-      if (http->dcount <= 0)
-      {
-         /*
-          * Error: More than SZ(vec) components in domain
-          *    or: no components in domain
-          */
-         free_http_request(http);
-         return JB_ERR_PARSE;
-      }
-
-      /* save a copy of the pointers in dvec */
-      size = http->dcount * sizeof(*http->dvec);
-
-      http->dvec = (char **)malloc(size);
-      if (NULL == http->dvec)
-      {
-         free_http_request(http);
-         return JB_ERR_MEMORY;
-      }
-
-      memcpy(http->dvec, vec, size);
-   }
-
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  parse_http_request
- *
- * Description :  Parse out the host and port from the URL.  Find the
- *                hostname & path, port (if ':'), and/or password (if '@')
- *
- * Parameters  :
- *          1  :  req = HTTP request line to break down
- *          2  :  http = pointer to the http structure to hold elements
- *          3  :  csp = Current client state (buffers, headers, etc...)
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out of memory
- *                JB_ERR_CGI_PARAMS on malformed command/URL
- *                                  or >100 domains deep.
- *
- *********************************************************************/
-jb_err parse_http_request(const char *req,
-                          struct http_request *http,
-                          struct client_state *csp)
-{
-   char *buf;
-   char *v[10];
-   int n;
-   jb_err err;
-   int is_connect = 0;
-
-   memset(http, '\0', sizeof(*http));
-
-   buf = strdup(req);
-   if (buf == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
-   if (n != 3)
-   {
-      free(buf);
-      return JB_ERR_PARSE;
-   }
-
-   /* this could be a CONNECT request */
-   if (strcmpic(v[0], "connect") == 0)
-   {
-      /* Secure */
-      is_connect = 1;
-   }
-   /* or it could be any other basic HTTP request type */
-   else if ((0 == strcmpic(v[0], "get"))
-         || (0 == strcmpic(v[0], "head"))
-         || (0 == strcmpic(v[0], "post"))
-         || (0 == strcmpic(v[0], "put"))
-         || (0 == strcmpic(v[0], "delete"))
-         /* or a webDAV extension (RFC2518) */
-         || (0 == strcmpic(v[0], "propfind"))
-         || (0 == strcmpic(v[0], "proppatch"))
-         || (0 == strcmpic(v[0], "move"))
-         || (0 == strcmpic(v[0], "copy"))
-         || (0 == strcmpic(v[0], "mkcol"))
-         || (0 == strcmpic(v[0], "lock"))
-         || (0 == strcmpic(v[0], "unlock"))
-         )
-   {
-      /* Normal */
-      is_connect = 0;
-   }
-   else
-   {
-      /* Unknown HTTP method */
-      free(buf);
-      return JB_ERR_PARSE;
-   }
-
-   err = parse_http_url(v[1], http, csp);
-   if (err)
-   {
-      free(buf);
-      return err;
-   }
-
-   /*
-    * Copy the details into the structure
-    */
-   http->ssl = is_connect;
-   http->cmd = strdup(req);
-   http->gpc = strdup(v[0]);
-   http->ver = strdup(v[2]);
-
-   if ( (http->cmd == NULL)
-     || (http->gpc == NULL)
-     || (http->ver == NULL) )
-   {
-      free(buf);
-      free_http_request(http);
-      return JB_ERR_MEMORY;
-   }
-
-   return JB_ERR_OK;
-}
-
-
-/*********************************************************************
- *
- * Function    :  simple_domaincmp
- *
- * Description :  Domain-wise Compare fqdn's.  The comparison is
- *                both left- and right-anchored.  The individual
- *                domain names are compared with simplematch().
- *                This is only used by domain_match.
- *
- * Parameters  :
- *          1  :  pv = array of patterns to compare
- *          2  :  fv = array of domain components to compare
- *          3  :  len = length of the arrays (both arrays are the
- *                      same length - if they weren't, it couldn't
- *                      possibly be a match).
- *
- * Returns     :  0 => domains are equivalent, else no match.
- *
- *********************************************************************/
-static int simple_domaincmp(char **pv, char **fv, int len)
-{
-   int n;
-
-   for (n = 0; n < len; n++)
-   {
-      if (simplematch(pv[n], fv[n]))
-      {
-         return 1;
-      }
-   }
-
-   return 0;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  domain_match
- *
- * Description :  Domain-wise Compare fqdn's. Governed by the bimap in
- *                pattern->unachored, the comparison is un-, left-,
- *                right-anchored, or both.
- *                The individual domain names are compared with
- *                simplematch().
- *
- * Parameters  :
- *          1  :  pattern = a domain that may contain a '*' as a wildcard.
- *          2  :  fqdn = domain name against which the patterns are compared.
- *
- * Returns     :  0 => domains are equivalent, else no match.
- *
- *********************************************************************/
-static int domain_match(const struct url_spec *pattern, const struct http_request *fqdn)
-{
-   char **pv, **fv;  /* vectors  */
-   int    plen, flen;
-   int unanchored = pattern->unanchored & (ANCHOR_RIGHT | ANCHOR_LEFT);
-
-   plen = pattern->dcount;
-   flen = fqdn->dcount;
-
-   if (flen < plen)
-   {
-      /* fqdn is too short to match this pattern */
-      return 1;
-   }
-
-   pv   = pattern->dvec;
-   fv   = fqdn->dvec;
-
-   if (unanchored == ANCHOR_LEFT)
-   {
-      /*
-       * Right anchored.
-       *
-       * Convert this into a fully anchored pattern with
-       * the fqdn and pattern the same length
-       */
-      fv += (flen - plen); /* flen - plen >= 0 due to check above */
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else if (unanchored == 0)
-   {
-      /* Fully anchored, check length */
-      if (flen != plen)
-      {
-         return 1;
-      }
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else if (unanchored == ANCHOR_RIGHT)
-   {
-      /* Left anchored, ignore all extra in fqdn */
-      return simple_domaincmp(pv, fv, plen);
-   }
-   else
-   {
-      /* Unanchored */
-      int n;
-      int maxn = flen - plen;
-      for (n = 0; n <= maxn; n++)
-      {
-         if (!simple_domaincmp(pv, fv, plen))
-         {
-            return 0;
-         }
-         /*
-          * Doesn't match from start of fqdn
-          * Try skipping first part of fqdn
-          */
-         fv++;
-      }
-      return 1;
-   }
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  create_url_spec
- *
- * Description :  Creates a "url_spec" structure from a string.
- *                When finished, free with unload_url().
- *
- * Parameters  :
- *          1  :  url = Target url_spec to be filled in.  Will be
- *                      zeroed before use.
- *          2  :  buf = Source pattern, null terminated.  NOTE: The
- *                      contents of this buffer are destroyed by this
- *                      function.  If this function succeeds, the
- *                      buffer is copied to url->spec.  If this
- *                      function fails, the contents of the buffer
- *                      are lost forever.
- *
- * Returns     :  JB_ERR_OK - Success
- *                JB_ERR_MEMORY - Out of memory
- *                JB_ERR_PARSE - Cannot parse regex (Detailed message
- *                               written to system log)
- *
- *********************************************************************/
-jb_err create_url_spec(struct url_spec * url, const char * buf)
-{
-   char *p;
-
-   assert(url);
-   assert(buf);
-
-   /* Zero memory */
-   memset(url, '\0', sizeof(*url));
-
-   /* save a copy of the orignal specification */
-   if ((url->spec = strdup(buf)) == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   if ((p = strchr(buf, '/')) != NULL)
-   {
-      if (NULL == (url->path = strdup(p)))
-      {
-         freez(url->spec);
-         return JB_ERR_MEMORY;
-      }
-      url->pathlen = strlen(url->path);
-      *p = '\0';
-   }
-   else
-   {
-      url->path    = NULL;
-      url->pathlen = 0;
-   }
-#ifdef REGEX
-   if (url->path)
-   {
-      int errcode;
-      char rebuf[BUFFER_SIZE];
-
-      if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
-      {
-         freez(url->spec);
-         freez(url->path);
-         return JB_ERR_MEMORY;
-      }
-
-      sprintf(rebuf, "^(%s)", url->path);
-
-      errcode = regcomp(url->preg, rebuf,
-            (REG_EXTENDED|REG_NOSUB|REG_ICASE));
-      if (errcode)
-      {
-         size_t errlen = regerror(errcode,
-            url->preg, rebuf, sizeof(rebuf));
-
-         if (errlen > (sizeof(rebuf) - (size_t)1))
-         {
-            errlen = sizeof(rebuf) - (size_t)1;
-         }
-         rebuf[errlen] = '\0';
-
-         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s",
-            url->spec, rebuf);
-
-         freez(url->spec);
-         freez(url->path);
-         freez(url->preg);
-
-         return JB_ERR_PARSE;
-      }
-   }
-#endif
-   if ((p = strchr(buf, ':')) == NULL)
-   {
-      url->port = 0;
-   }
-   else
-   {
-      *p++ = '\0';
-      url->port = atoi(p);
-   }
-
-   if (buf[0] != '\0')
-   {
-      char *v[150];
-      size_t size;
-
-      /* Parse domain part */
-      if (buf[strlen(buf) - 1] == '.')
-      {
-         url->unanchored |= ANCHOR_RIGHT;
-      }
-      if (buf[0] == '.')
-      {
-         url->unanchored |= ANCHOR_LEFT;
-      }
-
-      /* split domain into components */
-
-      url->dbuffer = strdup(buf);
-      if (NULL == url->dbuffer)
-      {
-         freez(url->spec);
-         freez(url->path);
-#ifdef REGEX
-         freez(url->preg);
-#endif /* def REGEX */
-         return JB_ERR_MEMORY;
-      }
-
-      /* map to lower case */
-      for (p = url->dbuffer; *p ; p++)
-      {
-         *p = tolower((int)(unsigned char)*p);
-      }
-
-      /* split the domain name into components */
-      url->dcount = ssplit(url->dbuffer, ".", v, SZ(v), 1, 1);
-
-      if (url->dcount < 0)
-      {
-         freez(url->spec);
-         freez(url->path);
-#ifdef REGEX
-         freez(url->preg);
-#endif /* def REGEX */
-         freez(url->dbuffer);
-         url->dcount = 0;
-         return JB_ERR_MEMORY;
-      }
-      else if (url->dcount != 0)
-      {
-
-         /* save a copy of the pointers in dvec */
-         size = url->dcount * sizeof(*url->dvec);
-
-         url->dvec = (char **)malloc(size);
-         if (NULL == url->dvec)
-         {
-            freez(url->spec);
-            freez(url->path);
-#ifdef REGEX
-            freez(url->preg);
-#endif /* def REGEX */
-            freez(url->dbuffer);
-            url->dcount = 0;
-            return JB_ERR_MEMORY;
-         }
-
-         memcpy(url->dvec, v, size);
-      }
-   }
-
-   return JB_ERR_OK;
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  free_url_spec
- *
- * Description :  Called from the "unloaders".  Freez the url
- *                structure elements.
- *
- * Parameters  :
- *          1  :  url = pointer to a url_spec structure.
- *
- * Returns     :  N/A
- *
- *********************************************************************/
-void free_url_spec(struct url_spec *url)
-{
-   if (url == NULL) return;
-
-   freez(url->spec);
-   freez(url->dbuffer);
-   freez(url->dvec);
-   freez(url->path);
-#ifdef REGEX
-   if (url->preg)
-   {
-      regfree(url->preg);
-      freez(url->preg);
-   }
-#endif
-
-}
-
-
-/*********************************************************************
- *
- * Function    :  url_match
- *
- * Description :  Compare a URL against a URL pattern.
- *
- * Parameters  :
- *          1  :  pattern = a URL pattern
- *          2  :  url = URL to match
- *
- * Returns     :  0 iff the URL matches the pattern, else nonzero.
- *
- *********************************************************************/
-int url_match(const struct url_spec *pattern,
-              const struct http_request *url)
-{
-   return ((pattern->port == 0) || (pattern->port == url->port))
-       && ((pattern->dbuffer == NULL) || (domain_match(pattern, url) == 0))
-       && ((pattern->path == NULL) ||
-#ifdef REGEX
-            (regexec(pattern->preg, url->path, 0, NULL, 0) == 0)
-#else
-            (strncmp(pattern->path, url->path, pattern->pathlen) == 0)
-#endif
-      );
-}
-
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
diff --git a/urlmatch.h b/urlmatch.h
deleted file mode 100644 (file)
index 09fa639..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef URLMATCH_H_INCLUDED
-#define URLMATCH_H_INCLUDED
-#define URLMATCH_H_VERSION "$Id: urlmatch.h,v 1.2 2002/03/24 13:25:43 swa Exp $"
-/*********************************************************************
- *
- * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.h,v $
- *
- * Purpose     :  Declares functions to match URLs against URL
- *                patterns.
- *
- * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
- *                Privoxy team. http://www.privoxy.org/
- *
- *                Based on the Internet Junkbuster originally written
- *                by and Copyright (C) 1997 Anonymous Coders and 
- *                Junkbusters Corporation.  http://www.junkbusters.com
- *
- *                This program is free software; you can redistribute it 
- *                and/or modify it under the terms of the GNU General
- *                Public License as published by the Free Software
- *                Foundation; either version 2 of the License, or (at
- *                your option) any later version.
- *
- *                This program is distributed in the hope that it will
- *                be useful, but WITHOUT ANY WARRANTY; without even the
- *                implied warranty of MERCHANTABILITY or FITNESS FOR A
- *                PARTICULAR PURPOSE.  See the GNU General Public
- *                License for more details.
- *
- *                The GNU General Public License should be included with
- *                this file.  If not, you can view it at
- *                http://www.gnu.org/copyleft/gpl.html
- *                or write to the Free Software Foundation, Inc., 59
- *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * Revisions   :
- *    $Log: urlmatch.h,v $
- *    Revision 1.2  2002/03/24 13:25:43  swa
- *    name change related issues
- *
- *    Revision 1.1  2002/01/17 20:53:46  jongfoster
- *    Moving all our URL and URL pattern parsing code to the same file - it
- *    was scattered around in filters.c, loaders.c and parsers.c.
- *
- *    Providing a single, simple url_match(pattern,url) function - rather than
- *    the 3-line match routine which was repeated all over the place.
- *
- *    Renaming free_url to free_url_spec, since it frees a struct url_spec.
- *
- *    Providing parse_http_url() so that URLs can be parsed without faking a
- *    HTTP request line for parse_http_request() or repeating the parsing
- *    code (both of which were techniques that were actually in use).
- *
- *    Standardizing that struct http_request is used to represent a URL, and
- *    struct url_spec is used to represent a URL pattern.  (Before, URLs were
- *    represented as seperate variables and a partially-filled-in url_spec).
- *
- *
- *********************************************************************/
-\f
-
-#include "project.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void free_http_request(struct http_request *http);
-extern jb_err parse_http_request(const char *req,
-                                 struct http_request *http,
-                                 struct client_state *csp);
-extern jb_err parse_http_url(const char * url,
-                             struct http_request *http,
-                             struct client_state *csp);
-
-extern int url_match(const struct url_spec *pattern,
-                     const struct http_request *url);
-
-extern jb_err create_url_spec(struct url_spec * url, const char * buf);
-extern void free_url_spec(struct url_spec *url);
-
-
-/* Revision control strings from this header and associated .c file */
-extern const char urlmatch_rcs[];
-extern const char urlmatch_h_rcs[];
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* ndef URLMATCH_H_INCLUDED */
-
-/*
-  Local Variables:
-  tab-width: 3
-  end:
-*/
similarity index 61%
rename from vc_privoxy.dsp
rename to vc_junkbuster.dsp
index 1baff50..f140050 100644 (file)
@@ -1,29 +1,24 @@
-# Microsoft Developer Studio Project File - Name="vc_privoxy" - Package Owner=<4>\r
+# Microsoft Developer Studio Project File - Name="vc_junkbuster" - Package Owner=<4>\r
 # Microsoft Developer Studio Generated Build File, Format Version 5.00\r
 # ** DO NOT EDIT **\r
 \r
 # TARGTYPE "Win32 (x86) Application" 0x0101\r
 \r
-CFG=vc_privoxy - Win32 Debug with Win32 threads\r
+CFG=vc_junkbuster - Win32 Release\r
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
 !MESSAGE use the Export Makefile command and run\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_privoxy.mak".\r
+!MESSAGE NMAKE /f "vc_junkbuster.mak".\r
 !MESSAGE \r
 !MESSAGE You can specify a configuration when running NMAKE\r
 !MESSAGE by defining the macro CFG on the command line. For example:\r
 !MESSAGE \r
-!MESSAGE NMAKE /f "vc_privoxy.mak"\\r
- CFG="vc_privoxy - Win32 Debug with Win32 threads"\r
+!MESSAGE NMAKE /f "vc_junkbuster.mak" CFG="vc_junkbuster - Win32 Release"\r
 !MESSAGE \r
 !MESSAGE Possible choices for configuration are:\r
 !MESSAGE \r
-!MESSAGE "vc_privoxy - Win32 Release" (based on "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Debug" (based on "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Release with Win32 threads" (based on\\r
- "Win32 (x86) Application")\r
-!MESSAGE "vc_privoxy - Win32 Debug with Win32 threads" (based on\\r
- "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Release" (based on "Win32 (x86) Application")\r
+!MESSAGE "vc_junkbuster - Win32 Debug" (based on "Win32 (x86) Application")\r
 !MESSAGE \r
 \r
 # Begin Project\r
@@ -33,7 +28,7 @@ CPP=cl.exe
 MTL=midl.exe\r
 RSC=rc.exe\r
 \r
-!IF  "$(CFG)" == "vc_privoxy - Win32 Release"\r
+!IF  "$(CFG)" == "vc_junkbuster - Win32 Release"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 0\r
@@ -57,9 +52,9 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /machine:I386\r
 \r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug"\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug"\r
 \r
 # PROP BASE Use_MFC 0\r
 # PROP BASE Use_Debug_Libraries 1\r
@@ -73,7 +68,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0\r
 # PROP Target_Dir ""\r
 # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c\r
 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
 # ADD BASE RSC /l 0x809 /d "_DEBUG"\r
@@ -83,70 +78,14 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
-\r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 0\r
-# PROP BASE Output_Dir "vc_junkb"\r
-# PROP BASE Intermediate_Dir "vc_junkb"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "vc_release_winthr"\r
-# PROP Intermediate_Dir "vc_release_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /Ob2 /I "pcre" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32\r
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32\r
-# ADD BASE RSC /l 0x809 /d "NDEBUG"\r
-# ADD RSC /l 0x809 /d "NDEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /machine:I386\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /machine:I386\r
-\r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Use_MFC 0\r
-# PROP BASE Use_Debug_Libraries 1\r
-# PROP BASE Output_Dir "vc_junk0"\r
-# PROP BASE Intermediate_Dir "vc_junk0"\r
-# PROP BASE Ignore_Export_Lib 0\r
-# PROP BASE Target_Dir ""\r
-# PROP Use_MFC 0\r
-# PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "vc_debug_winthr"\r
-# PROP Intermediate_Dir "vc_debug_winthr"\r
-# PROP Ignore_Export_Lib 0\r
-# PROP Target_Dir ""\r
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /O2 /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /YX /FD /c\r
-# ADD CPP /nologo /MTd /W4 /Gm /GX /Zi /Od /I "pcre" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FR /YX /FD /c\r
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32\r
-# ADD BASE RSC /l 0x809 /d "_DEBUG"\r
-# ADD RSC /l 0x809 /d "_DEBUG"\r
-BSC32=bscmake.exe\r
-# ADD BASE BSC32 /nologo\r
-# ADD BSC32 /nologo\r
-LINK32=link.exe\r
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib pthreadVC.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib ws2_32.lib comctl32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
 \r
 !ENDIF \r
 \r
 # Begin Target\r
 \r
-# Name "vc_privoxy - Win32 Release"\r
-# Name "vc_privoxy - Win32 Debug"\r
-# Name "vc_privoxy - Win32 Release with Win32 threads"\r
-# Name "vc_privoxy - Win32 Debug with Win32 threads"\r
+# Name "vc_junkbuster - Win32 Release"\r
+# Name "vc_junkbuster - Win32 Debug"\r
 # Begin Group "JunkBuster"\r
 \r
 # PROP Default_Filter ""\r
@@ -180,34 +119,10 @@ SOURCE=.\cgi.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\cgiedit.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgiedit.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\cgisimple.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\config.h\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\deanimate.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\deanimate.h\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\errlog.c\r
 # End Source File\r
 # Begin Source File\r
@@ -268,16 +183,49 @@ SOURCE=.\project.h
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.c\r
+SOURCE=.\showargs.c\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\urlmatch.h\r
+SOURCE=.\showargs.h\r
 # End Source File\r
 # End Group\r
 # Begin Group "Win32"\r
 \r
 # PROP Default_Filter ""\r
+# Begin Group "File Copy"\r
+\r
+# PROP Default_Filter ".win"\r
+# Begin Source File\r
+\r
+SOURCE=.\config.h.win\r
+\r
+!IF  "$(CFG)" == "vc_junkbuster - Win32 Release"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ELSEIF  "$(CFG)" == "vc_junkbuster - Win32 Debug"\r
+\r
+# Begin Custom Build - Copying config.h.win\r
+InputDir=.\r
+InputPath=.\config.h.win\r
+\r
+"$(InputDir)\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\r
+       copy $(InputPath) $(InputDir)\config.h\r
+\r
+# End Custom Build\r
+\r
+!ENDIF \r
+\r
+# End Source File\r
+# End Group\r
 # Begin Source File\r
 \r
 SOURCE=.\cygwin.h\r
@@ -296,6 +244,14 @@ SOURCE=.\w32res.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\w32rulesdlg.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\w32rulesdlg.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\w32taskbar.c\r
 # End Source File\r
 # Begin Source File\r
@@ -316,6 +272,10 @@ SOURCE=.\win32.h
 # PROP Default_Filter "rc,ico,bmp"\r
 # Begin Source File\r
 \r
+SOURCE=.\icons\denyrule.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\icons\ico00001.ico\r
 # End Source File\r
 # Begin Source File\r
@@ -348,11 +308,15 @@ SOURCE=.\icons\ico00008.ico
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\icons\icon1.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\icons\idle.ico\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\icons\privoxy.ico\r
+SOURCE=.\icons\junkbust.ico\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -365,27 +329,7 @@ SOURCE=.\w32.rc
 # Begin Source File\r
 \r
 SOURCE=.\pcre\chartables.c\r
-\r
-!IF  "$(CFG)" == "vc_privoxy - Win32 Release"\r
-\r
 # PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug"\r
-\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Release with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ELSEIF  "$(CFG)" == "vc_privoxy - Win32 Debug with Win32 threads"\r
-\r
-# PROP BASE Exclude_From_Build 1\r
-# PROP Exclude_From_Build 1\r
-\r
-!ENDIF \r
-\r
 # End Source File\r
 # Begin Source File\r
 \r
similarity index 68%
rename from vc_privoxy.dsw
rename to vc_junkbuster.dsw
index 3bee927..d119bd5 100644 (file)
@@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 5.00
 \r
 ###############################################################################\r
 \r
-Project: "vc_console"=".\vc_console.dsp" - Package Owner=<4>\r
+Project: "console_junkbuster"=".\console_junkbuster.dsp" - Package Owner=<4>\r
 \r
 Package=<5>\r
 {{{\r
@@ -11,9 +11,6 @@ Package=<5>
 \r
 Package=<4>\r
 {{{\r
-    Begin Project Dependency\r
-    Project_Dep_Name vc_dftables\r
-    End Project Dependency\r
 }}}\r
 \r
 ###############################################################################\r
@@ -30,7 +27,7 @@ Package=<4>
 \r
 ###############################################################################\r
 \r
-Project: "vc_privoxy"=".\vc_privoxy.dsp" - Package Owner=<4>\r
+Project: "vc_junkbuster"=".\vc_junkbuster.dsp" - Package Owner=<4>\r
 \r
 Package=<5>\r
 {{{\r
@@ -38,9 +35,6 @@ Package=<5>
 \r
 Package=<4>\r
 {{{\r
-    Begin Project Dependency\r
-    Project_Dep_Name vc_dftables\r
-    End Project Dependency\r
 }}}\r
 \r
 ###############################################################################\r
diff --git a/w32.rc b/w32.rc
index c8c09af..e3ae74b 100644 (file)
--- a/w32.rc
+++ b/w32.rc
@@ -4,8 +4,8 @@
  *
  * Purpose     :  Windows GUI resource script.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: w32.rc,v $
- *    Revision 1.15  2002/03/24 14:29:25  jongfoster
- *    Renaming icon file
- *
- *    Revision 1.14  2002/03/24 12:07:36  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.13  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.12  2001/07/30 22:16:07  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.11  2001/07/21 17:53:41  jongfoster
- *    Adding version information block.
- *
- *    Revision 1.10  2001/07/19 19:14:19  haroon
- *    -  Removed all #ifdef PCRS. The .rc file extension had eluded Andreas.
- *
- *    Revision 1.9  2001/06/07 23:08:54  jongfoster
- *    Forward and ACL edit options removed.
- *    Config edit option renamed from "&Junkbuster" to "&Configuration".
- *
  *    Revision 1.8  2001/05/31 21:37:11  jongfoster
  *    GUI changes to rename "permissions file" to "actions file".
  *
  * Icon with lowest ID value placed first to ensure application icon
  * remains consistent on all systems.
  */
-IDI_MAINICON            ICON    DISCARDABLE     "icons/privoxy.ico"
-IDI_ANIMATED1           ICON    DISCARDABLE     "icons/ico00001.ico"
-IDI_ANIMATED2           ICON    DISCARDABLE     "icons/ico00002.ico"
-IDI_ANIMATED3           ICON    DISCARDABLE     "icons/ico00003.ico"
-IDI_ANIMATED4           ICON    DISCARDABLE     "icons/ico00004.ico"
-IDI_ANIMATED5           ICON    DISCARDABLE     "icons/ico00005.ico"
-IDI_ANIMATED6           ICON    DISCARDABLE     "icons/ico00006.ico"
-IDI_ANIMATED7           ICON    DISCARDABLE     "icons/ico00007.ico"
-IDI_ANIMATED8           ICON    DISCARDABLE     "icons/ico00008.ico"
+IDI_JUNKBUSTER          ICON    DISCARDABLE     "icons/junkbust.ico"
+IDI_JUNKBUSTER1         ICON    DISCARDABLE     "icons/ico00001.ico"
+IDI_JUNKBUSTER2         ICON    DISCARDABLE     "icons/ico00002.ico"
+IDI_JUNKBUSTER3         ICON    DISCARDABLE     "icons/ico00003.ico"
+IDI_JUNKBUSTER4         ICON    DISCARDABLE     "icons/ico00004.ico"
+IDI_JUNKBUSTER5         ICON    DISCARDABLE     "icons/ico00005.ico"
+IDI_JUNKBUSTER6         ICON    DISCARDABLE     "icons/ico00006.ico"
+IDI_JUNKBUSTER7         ICON    DISCARDABLE     "icons/ico00007.ico"
+IDI_JUNKBUSTER8         ICON    DISCARDABLE     "icons/ico00008.ico"
 IDI_IDLE                ICON    DISCARDABLE     "icons/idle.ico"
 
 #endif /* Neutral resources */
@@ -168,47 +143,6 @@ IDI_IDLE                ICON    DISCARDABLE     "icons/idle.ico"
 #pragma code_page(1252)
 #endif /* def _WIN32 */
 
-/*
- * File Version
- */
-#ifndef _MAC
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_POINT,0
- PRODUCTVERSION VERSION_MAJOR,VERSION_MINOR,VERSION_POINT,0
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x40004L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904b0"
-        BEGIN
-            VALUE "CompanyName", "The Privoxy team - www.privoxy.org\0"
-            VALUE "FileDescription", "Privoxy\0"
-            VALUE "FileVersion", VERSION "\0"
-            VALUE "InternalName", "Privoxy\0"
-            VALUE "LegalCopyright", "Distributed under the GNU GPL\0"
-            VALUE "OriginalFilename", "privoxy.exe\0"
-            VALUE "ProductName", "Privoxy\0"
-            VALUE "ProductVersion", VERSION "\0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1200
-    END
-END
-
-#endif /* ndef _MAC */
-
-
 /*
  * Menus
  */
@@ -217,23 +151,25 @@ IDR_TRAYMENU MENU DISCARDABLE
 BEGIN
     POPUP "Popup"
     BEGIN
-        MENUITEM "E&xit Privoxy",      ID_FILE_EXIT
+        MENUITEM "E&xit JunkBuster",   ID_FILE_EXIT
         MENUITEM                       SEPARATOR
         POPUP "&Options"
         BEGIN
-            MENUITEM "&Configuration...",           ID_TOOLS_EDITCONFIG
+            MENUITEM "&Configuration...",           ID_TOOLS_EDITJUNKBUSTER
             MENUITEM                                SEPARATOR
             MENUITEM "&Actions...",                 ID_TOOLS_EDITACTIONS
-            MENUITEM "&Filters...",                 ID_TOOLS_EDITFILTERS
-#ifdef FEATURE_TRUST
+#ifdef PCRS
+            MENUITEM "Perl &Regexps...",            ID_TOOLS_EDITPERLRE
+#endif /* def PCRS */
+#ifdef TRUST_FILES
             MENUITEM "&Trust...",                   ID_TOOLS_EDITTRUST
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
         END
         MENUITEM                              SEPARATOR
-#ifdef FEATURE_TOGGLE
-        MENUITEM "&Enable",                   ID_TOGGLE_ENABLED, CHECKED
-#endif /* def FEATURE_TOGGLE */
-        MENUITEM "Show Privoxy &Window",      ID_SHOWWINDOW
+#ifdef TOGGLE
+        MENUITEM "&Enable",                   ID_TOGGLE_IJB, CHECKED
+#endif
+        MENUITEM "Show &JunkBuster Window",   ID_SHOWWINDOW
     END
 END
 
@@ -258,27 +194,29 @@ BEGIN
     END
     POPUP "&Options"
     BEGIN
-#ifdef FEATURE_TOGGLE
-        MENUITEM "&Enable",                     ID_TOGGLE_ENABLED, CHECKED
+#ifdef TOGGLE
+        MENUITEM "&Enable",                     ID_TOGGLE_IJB, CHECKED
         MENUITEM                                SEPARATOR
-#endif /* def FEATURE_TOGGLE */
-        MENUITEM "&Configuration...",           ID_TOOLS_EDITCONFIG
+#endif
+        MENUITEM "&Configuration...",           ID_TOOLS_EDITJUNKBUSTER
         MENUITEM                                SEPARATOR
         MENUITEM "&Actions...",                 ID_TOOLS_EDITACTIONS
-            MENUITEM "&Filters...",             ID_TOOLS_EDITFILTERS
-#ifdef FEATURE_TRUST
+#ifdef PCRS
+            MENUITEM "Perl &Regexps...",        ID_TOOLS_EDITPERLRE
+#endif /* def PCRS */
+#ifdef TRUST_FILES
             MENUITEM "&Trust...",               ID_TOOLS_EDITTRUST
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
     END
     POPUP "&Help"
     BEGIN
-        MENUITEM "Privoxy &FAQ",                ID_HELP_FAQ
-        MENUITEM "Privoxy &Manual",             ID_HELP_MANUAL
+        MENUITEM "Junkbuster &FAQ",             ID_HELP_FAQ
+        MENUITEM "Junkbuster &Manual",          ID_HELP_MANUAL
         MENUITEM "GNU &General Public Licence", ID_HELP_GPL
         MENUITEM                                SEPARATOR
-        MENUITEM "Privoxy Status...",           ID_HELP_STATUS
+        MENUITEM "Junkbuster Status...",        ID_HELP_STATUS
         MENUITEM                                SEPARATOR
-        MENUITEM "About Privoxy...",            ID_HELP_ABOUT
+        MENUITEM "About Junkbuster...",         ID_HELP_ABOUTJUNKBUSTER
     END
 END
 
@@ -300,4 +238,70 @@ BEGIN
     "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL, NOINVERT
 END
 
+#ifdef WIN_GUI_EDIT
+
+/*
+ * Icons
+ *
+ * Icon with lowest ID value placed first to ensure application icon
+ * remains consistent on all systems.
+ */
+IDI_DENYRULE            ICON    DISCARDABLE     "icons/denyrule.ico"
+IDI_ALLOWRULE           ICON    DISCARDABLE     "icons/icon1.ico"
+
+/*
+ * Dialog
+ */
+
+IDD_RULES DIALOG DISCARDABLE  0, 0, 239, 225
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Blockers"
+FONT 8, "MS Sans Serif"
+BEGIN
+    GROUPBOX        "New Rule",IDC_STATIC,5,5,230,55
+    LTEXT           "For:",IDC_STATIC,10,15,13,8
+    EDITTEXT        IDC_NEW,10,25,220,12,ES_AUTOHSCROLL
+    COMBOBOX        IDC_ACTION,10,40,75,37,CBS_DROPDOWNLIST | CBS_SORT |
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "C&reate!",IDC_CREATE,90,40,50,14
+    GROUPBOX        "Rules",IDC_STATIC,5,65,230,135
+    CONTROL         "List1",IDC_RULES,"SysListView32",LVS_REPORT |
+                    LVS_SHOWSELALWAYS | LVS_EDITLABELS | WS_BORDER |
+                    WS_TABSTOP,10,75,220,100
+    PUSHBUTTON      "Move &Up",IDC_MOVEUP,10,180,50,14,WS_DISABLED
+    PUSHBUTTON      "Move &Down",IDC_MOVEDOWN,65,180,50,14,WS_DISABLED
+    PUSHBUTTON      "&Delete",IDC_DELETE,120,180,50,14,WS_DISABLED
+    PUSHBUTTON      "&Save",IDC_SAVE,130,205,50,14
+    PUSHBUTTON      "&Cancel",IDCANCEL,185,205,50,14
+END
+
+
+/*
+ * DESIGNINFO
+ */
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+    IDD_RULES, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 232
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 218
+    END
+END
+#endif /* def APSTUDIO_INVOKED */
+
+
+/*
+ * String Table
+ */
+
+STRINGTABLE DISCARDABLE
+BEGIN
+    IDS_NEW_BLOCKER         "Create rule for ""%s""..."
+END
+#endif /* def WIN_GUI_EDIT */
+
 #endif /* English (U.S.) resources */
index 0948e4b..97e0bf1 100644 (file)
--- a/w32log.c
+++ b/w32log.c
@@ -1,4 +1,4 @@
-const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster Exp $";
+const char w32log_rcs[] = "$Id: w32log.c,v 1.10 2001/05/31 21:37:11 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32log.c,v $
@@ -6,8 +6,8 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
  * Purpose     :  Functions for creating and destroying the log window,
  *                ouputting strings, processing messages and so on.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -32,48 +32,6 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
  *
  * Revisions   :
  *    $Log: w32log.c,v $
- *    Revision 1.22  2002/03/24 12:48:23  jongfoster
- *    Fixing doc links
- *
- *    Revision 1.21  2002/03/24 12:07:35  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.20  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.19  2002/01/17 21:04:17  jongfoster
- *    Replacing hard references to the URL of the config interface
- *    with #defines from project.h
- *
- *    Revision 1.18  2001/11/30 23:37:24  jongfoster
- *    Renaming the Win32 config file to config.txt - this is almost the
- *    same as the corresponding UNIX name "config"
- *
- *    Revision 1.17  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.16  2001/08/01 19:58:12  jongfoster
- *    Fixing documentation filenames in help menu, and making status
- *    option work without needing the "Junkbuster Status.URL" file.
- *
- *    Revision 1.15  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.14  2001/07/29 18:47:05  jongfoster
- *    Adding missing #include "loadcfg.h"
- *
- *    Revision 1.13  2001/07/19 19:15:14  haroon
- *    - Added a FIXME for EditFile but didn't fix :-)
- *
- *    Revision 1.12  2001/07/13 14:04:59  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.11  2001/06/07 23:08:12  jongfoster
- *    Forward and ACL edit options removed.
- *
  *    Revision 1.10  2001/05/31 21:37:11  jongfoster
  *    GUI changes to rename "permissions file" to "actions file".
  *
@@ -156,12 +114,12 @@ const char w32log_rcs[] = "$Id: w32log.c,v 1.22 2002/03/24 12:48:23 jongfoster E
 #include "project.h"
 #include "w32log.h"
 #include "w32taskbar.h"
+#include "w32rulesdlg.h"
 #include "win32.h"
 #include "w32res.h"
 #include "jcc.h"
 #include "miscutil.h"
 #include "errlog.h"
-#include "loadcfg.h"
 
 const char w32res_h_rcs[] = W32RES_H_VERSION;
 
@@ -240,10 +198,12 @@ int g_nFontSize = DEFAULT_LOG_FONT_SIZE;
 /* FIXME: this is a kludge */
 
 const char * g_actions_file = NULL;
+#ifdef PCRS
 const char * g_re_filterfile = NULL;
-#ifdef FEATURE_TRUST
+#endif
+#ifdef TRUST_FILES
 const char * g_trustfile = NULL;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /* FIXME: end kludge */
 
@@ -350,14 +310,14 @@ BOOL InitLogWindow(void)
    g_hiconIdle = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IDLE));
    for (i = 0; i < ANIM_FRAMES; i++)
    {
-      g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ANIMATED1 + i));
+      g_hiconAnim[i] = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER1 + i));
    }
-   g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAINICON));
+   g_hiconApp = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_JUNKBUSTER));
 
    /* Create the user interface */
    g_hwndLogFrame = CreateLogWindow(g_hInstance, g_nCmdShow);
    g_hwndTray = CreateTrayWindow(g_hInstance);
-   TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Privoxy");
+   TrayAddIcon(g_hwndTray, 1, g_hiconApp, "Junkbuster");
 
    /* Create pattern matching buffers (for highlighting */
    LogCreatePatternMatchingBuffers();
@@ -778,7 +738,7 @@ void LogClipBuffer(void)
  *********************************************************************/
 HWND CreateHiddenLogOwnerWindow(HINSTANCE hInstance)
 {
-   static const char *szWndName = "PrivoxyLogOwner";
+   static const char *szWndName = "JunkbusterLogLogOwner";
    WNDCLASS wc;
    HWND hwnd;
 
@@ -841,11 +801,12 @@ LRESULT CALLBACK LogOwnerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
  *********************************************************************/
 HWND CreateLogWindow(HINSTANCE hInstance, int nCmdShow)
 {
-   static const char *szWndName = "PrivoxyLogWindow";
-   static const char *szWndTitle = "Privoxy";
+   static const char *szWndName = "JunkbusterLogWindow";
+   static const char *szWndTitle = "Junkbuster";
 
    HWND hwnd = NULL;
    HWND hwndOwner = (g_bShowOnTaskBar) ? NULL : CreateHiddenLogOwnerWindow(hInstance);
+   HWND hwndChild = NULL;
    RECT rcClient;
    WNDCLASSEX wc;
 
@@ -978,11 +939,9 @@ void ShowLogWindow(BOOL bShow)
  * Function    :  EditFile
  *
  * Description :  Opens the specified setting file for editing.
- * FIXME: What if the file has no associated application. Check for return values
-*        from ShellExecute??
  *
  * Parameters  :
- *          1  :  filename = filename from the config (aka config.txt) file.
+ *          1  :  filename = filename from the config (aka junkbstr.txt) file.
  *
  * Returns     :  N/A
  *
@@ -1022,6 +981,9 @@ void OnLogRButtonUp(int nModifier, int x, int y)
    if (hMenu != NULL)
    {
       HMENU hMenuPopup = GetSubMenu(hMenu, 0);
+#ifdef WIN_GUI_EDIT
+      char *szURL;
+#endif /* def WIN_GUI_EDIT */
 
       /* Check if there is a selection */
       CHARRANGE range;
@@ -1035,6 +997,40 @@ void OnLogRButtonUp(int nModifier, int x, int y)
          EnableMenuItem(hMenuPopup, ID_EDIT_COPY, MF_BYCOMMAND | MF_ENABLED);
       }
 
+#ifdef WIN_GUI_EDIT
+      /* Check if cursor is over a link */
+      szURL = LogGetURLUnderCursor();
+      if (szURL)
+      {
+         MENUITEMINFO item;
+         TCHAR szMenuItemTemplate[1000];
+         char *szMenuItem;
+
+         memset(&item, 0, sizeof(item));
+         item.cbSize = sizeof(item);
+         item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
+         item.fType = MFT_STRING;
+         item.fState = MFS_ENABLED;
+         item.wID = ID_NEW_BLOCKER;
+
+         /* Put the item into the menu */
+         memset(szMenuItemTemplate, 0, sizeof(szMenuItemTemplate));
+         LoadString(g_hInstance, IDS_NEW_BLOCKER, szMenuItemTemplate, sizeof(szMenuItemTemplate) / sizeof(szMenuItemTemplate[0]));
+
+         szMenuItem = (char *)malloc(strlen(szMenuItemTemplate) + strlen(szURL) + 1);
+         sprintf(szMenuItem, szMenuItemTemplate, szURL);
+
+         item.dwTypeData = szMenuItem;
+         item.cch = strlen(szMenuItem);
+
+         InsertMenuItem(hMenuPopup, 1, TRUE, &item);
+
+         SetDefaultRule(szURL);
+
+         free(szURL);
+      }
+#endif /* def WIN_GUI_EDIT */
+
       /* Display the popup */
       TrackPopupMenu(hMenuPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, x, y, 0, g_hwndLogFrame, NULL);
       DestroyMenu(hMenu);
@@ -1095,9 +1091,9 @@ void OnLogCommand(int nCommand)
          /* SaveLogSettings(); */
          break;
 
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
       /* by haroon - change toggle to its opposite value */
-      case ID_TOGGLE_ENABLED:
+      case ID_TOGGLE_IJB:
          g_bToggleIJB = !g_bToggleIJB;
          if (g_bToggleIJB)
          {
@@ -1108,9 +1104,9 @@ void OnLogCommand(int nCommand)
             log_error(LOG_LEVEL_INFO, "Now toggled OFF.");
          }
          break;
-#endif /* def FEATURE_TOGGLE */
+#endif
 
-      case ID_TOOLS_EDITCONFIG:
+      case ID_TOOLS_EDITJUNKBUSTER:
          EditFile(configfile);
          break;
 
@@ -1118,34 +1114,42 @@ void OnLogCommand(int nCommand)
          EditFile(g_actions_file);
          break;
 
-      case ID_TOOLS_EDITFILTERS:
+#ifdef PCRS
+      case ID_TOOLS_EDITPERLRE:
          EditFile(g_re_filterfile);
          break;
+#endif
 
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
       case ID_TOOLS_EDITTRUST:
          EditFile(g_trustfile);
          break;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
+
+#ifdef WIN_GUI_EDIT
+      case ID_NEW_BLOCKER:
+         ShowRulesDialog(g_hwndLogFrame);
+         break;
+#endif /* def WIN_GUI_EDIT */
 
       case ID_HELP_GPL:
-         ShellExecute(g_hwndLogFrame, "open", "LICENSE.txt", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "gpl.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_FAQ:
-         ShellExecute(g_hwndLogFrame, "open", "doc\\faq\\index.html", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "ijbfaq.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_MANUAL:
-         ShellExecute(g_hwndLogFrame, "open", "doc\\user-manual\\index.html", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "ijbman.html", NULL, NULL, SW_SHOWNORMAL);
          break;
 
       case ID_HELP_STATUS:
-         ShellExecute(g_hwndLogFrame, "open", CGI_PREFIX "show-status", NULL, NULL, SW_SHOWNORMAL);
+         ShellExecute(g_hwndLogFrame, "open", "Junkbuster Status.URL", NULL, NULL, SW_SHOWNORMAL);
          break;
 
-      case ID_HELP_ABOUT:
-         MessageBox(g_hwndLogFrame, win32_blurb, "About Privoxy", MB_OK);
+      case ID_HELP_ABOUTJUNKBUSTER:
+         MessageBox(g_hwndLogFrame, win32_blurb, "Junkbuster Information", MB_OK);
          break;
 
       default:
@@ -1173,20 +1177,22 @@ void OnLogInitMenu(HMENU hmenu)
 {
    /* Only enable editors if there is a file to edit */
    EnableMenuItem(hmenu, ID_TOOLS_EDITACTIONS, MF_BYCOMMAND | (g_actions_file ? MF_ENABLED : MF_GRAYED));
-   EnableMenuItem(hmenu, ID_TOOLS_EDITFILTERS, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
-#ifdef FEATURE_TRUST
+#ifdef PCRS
+   EnableMenuItem(hmenu, ID_TOOLS_EDITPERLRE, MF_BYCOMMAND | (g_re_filterfile ? MF_ENABLED : MF_GRAYED));
+#endif
+#ifdef TRUST_FILES
    EnableMenuItem(hmenu, ID_TOOLS_EDITTRUST, MF_BYCOMMAND | (g_trustfile ? MF_ENABLED : MF_GRAYED));
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
    /* Check/uncheck options */
    CheckMenuItem(hmenu, ID_VIEW_LOGMESSAGES, MF_BYCOMMAND | (g_bLogMessages ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_MESSAGEHIGHLIGHTING, MF_BYCOMMAND | (g_bHighlightMessages ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_LIMITBUFFERSIZE, MF_BYCOMMAND | (g_bLimitBufferSize ? MF_CHECKED : MF_UNCHECKED));
    CheckMenuItem(hmenu, ID_VIEW_ACTIVITYANIMATION, MF_BYCOMMAND | (g_bShowActivityAnimation ? MF_CHECKED : MF_UNCHECKED));
-#ifdef FEATURE_TOGGLE
+#ifdef TOGGLE
    /* by haroon - menu item for Enable toggle on/off */
-   CheckMenuItem(hmenu, ID_TOGGLE_ENABLED, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED));
-#endif /* def FEATURE_TOGGLE */
+   CheckMenuItem(hmenu, ID_TOGGLE_IJB, MF_BYCOMMAND | (g_bToggleIJB ? MF_CHECKED : MF_UNCHECKED));
+#endif
 
 }
 
index 2634a95..f907274 100644 (file)
--- a/w32log.h
+++ b/w32log.h
@@ -1,6 +1,6 @@
-#ifndef W32LOG_H_INCLUDED
-#define W32LOG_H_INCLUDED
-#define W32LOG_H_VERSION "$Id: w32log.h,v 1.9 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _W32LOG_H
+#define _W32LOG_H
+#define W32LOG_H_VERSION "$Id: w32log.h,v 1.4 2001/05/31 21:37:11 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32log.h,v $
@@ -8,8 +8,8 @@
  * Purpose     :  Functions for creating and destroying the log window,
  *                ouputting strings, processing messages and so on.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: w32log.h,v $
- *    Revision 1.9  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.8  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.7  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.6  2001/07/13 14:04:59  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.5  2001/06/07 23:08:12  jongfoster
- *    Forward and ACL edit options removed.
- *
  *    Revision 1.4  2001/05/31 21:37:11  jongfoster
  *    GUI changes to rename "permissions file" to "actions file".
  *
@@ -130,13 +111,16 @@ extern int g_nFontSize;
 /* FIXME: this is a kludge */
 
 extern const char * g_actions_file;
+#ifdef PCRS
 extern const char * g_re_filterfile;
-#ifdef FEATURE_TRUST
+#endif
+#ifdef TRUST_FILES
 extern const char * g_trustfile;
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /* FIXME: end kludge */
 
+
 extern int LogPutString(const char *pszText);
 extern BOOL InitLogWindow(void);
 extern void TermLogWindow(void);
@@ -151,7 +135,7 @@ extern const char w32log_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef W32LOG_H_INCLUDED */
+#endif /* ndef _W32LOG_H */
 
 
 /*
index 62308cf..1a31321 100644 (file)
--- a/w32res.h
+++ b/w32res.h
@@ -1,14 +1,14 @@
-#ifndef W32RES_H_INCLUDED
-#define W32RES_H_INCLUDED
-#define W32RES_H_VERSION "$Id: w32res.h,v 1.12 2002/03/24 12:07:36 jongfoster Exp $"
+#ifndef _W32RES_H
+#define _W32RES_H
+#define W32RES_H_VERSION "$Id: w32res.h,v 1.6 2001/05/31 21:37:11 jongfoster Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32res.h,v $
  *
  * Purpose     :  Identifiers for Windows GUI resources.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Based on the Internet Junkbuster originally written
  *                by and Copyright (C) 1997 Anonymous Coders and 
  *
  * Revisions   :
  *    $Log: w32res.h,v $
- *    Revision 1.12  2002/03/24 12:07:36  jongfoster
- *    Consistern name for filters file
- *
- *    Revision 1.11  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.10  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.9  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.8  2001/07/13 14:04:59  oes
- *    Removed all #ifdef PCRS
- *
- *    Revision 1.7  2001/06/07 23:08:12  jongfoster
- *    Forward and ACL edit options removed.
- *
  *    Revision 1.6  2001/05/31 21:37:11  jongfoster
  *    GUI changes to rename "permissions file" to "actions file".
  *
  *
  *********************************************************************/
 
+#ifdef WIN_GUI_EDIT
+#define IDS_NEW_BLOCKER                   1
+
+#define ID_NEW_BLOCKER                    100
+#endif /* def WIN_GUI_EDIT */
+
 #define IDR_TRAYMENU                      101
 #define IDI_IDLE                          102
 #define IDR_LOGVIEW                       103
 #define IDR_ACCELERATOR                   104
 #define IDR_POPUP_SELECTION               105
 
+#ifdef WIN_GUI_EDIT
+#define IDD_RULES                         106
+#endif /* def WIN_GUI_EDIT */
+
 
-#define IDI_MAINICON                      200
-#define IDI_ANIMATED1                     201
-#define IDI_ANIMATED2                     202
-#define IDI_ANIMATED3                     203
-#define IDI_ANIMATED4                     204
-#define IDI_ANIMATED5                     205
-#define IDI_ANIMATED6                     206
-#define IDI_ANIMATED7                     207
-#define IDI_ANIMATED8                     208
+#define IDI_JUNKBUSTER                    200
+#define IDI_JUNKBUSTER1                   201
+#define IDI_JUNKBUSTER2                   202
+#define IDI_JUNKBUSTER3                   203
+#define IDI_JUNKBUSTER4                   204
+#define IDI_JUNKBUSTER5                   205
+#define IDI_JUNKBUSTER6                   206
+#define IDI_JUNKBUSTER7                   207
+#define IDI_JUNKBUSTER8                   208
+
+#ifdef WIN_GUI_EDIT
+#define IDI_DENYRULE                      209
+#define IDI_ALLOWRULE                     210
+
+#define IDC_NEW                           300
+#define IDC_ACTION                        301
+#define IDC_RULES                         302
+#define IDC_CREATE                        303
+#define IDC_MOVEUP                        304
+#define IDC_MOVEDOWN                      305
+#define IDC_DELETE                        306
+#define IDC_SAVE                          307
+#endif /* def WIN_GUI_EDIT */
 
 #define ID_SHOWWINDOW                     4000
-#define ID_HELP_ABOUT                     4001
+#define ID_HELP_ABOUTJUNKBUSTER           4001
 #define ID_FILE_EXIT                      4002
 #define ID_VIEW_CLEARLOG                  4003
 #define ID_VIEW_LOGMESSAGES               4004
 #define ID_HELP_MANUAL                    4009
 #define ID_HELP_GPL                       4010
 #define ID_HELP_STATUS                    4011
-#ifdef FEATURE_TOGGLE
-#define ID_TOGGLE_ENABLED                 4012
-#endif /* def FEATURE_TOGGLE */
+#ifdef TOGGLE
+#define ID_TOGGLE_IJB                     4012
+#endif
 
 /* Break these out so they are easier to extend, but keep consecutive */
-#define ID_TOOLS_EDITCONFIG               5000
+#define ID_TOOLS_EDITJUNKBUSTER           5000
 #define ID_TOOLS_EDITACTIONS              5001
-#define ID_TOOLS_EDITFILTERS              5002
 
-#ifdef FEATURE_TRUST
+#ifdef PCRS
+#define ID_TOOLS_EDITPERLRE               5002
+#endif /* def PCRS */
+
+#ifdef TRUST_FILES
 #define ID_TOOLS_EDITTRUST                5003
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
 
 /*
  * The following symbols are declared in <afxres.h> in VC++.
 #define ID_EDIT_COPY  30000
 
 
-#endif /* ndef W32RES_H_INCLUDED */
+#endif /* ndef _W32RES_H */
 
 /*
   Local Variables:
diff --git a/w32rulesdlg.c b/w32rulesdlg.c
new file mode 100644 (file)
index 0000000..7516862
--- /dev/null
@@ -0,0 +1,548 @@
+const char w32rulesdlg_rcs[] = "$Id: w32rulesdlg.c,v 1.3 2001/05/22 18:56:28 oes Exp $";
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/w32rulesdlg.c,v $
+ *
+ * Purpose     :  A dialog to allow GUI editing of the rules.
+ *                Unfinished.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Written by and Copyright (C) 1999 Adam Lock
+ *                <locka@iol.ie>
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: w32rulesdlg.c,v $
+ *    Revision 1.3  2001/05/22 18:56:28  oes
+ *    CRLF -> LF
+ *
+ *    Revision 1.2  2001/05/20 15:07:54  jongfoster
+ *    File is now ignored if _WIN_CONSOLE is defined.
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+#include "config.h"
+
+#include <stdio.h>
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "w32res.h"
+#include "w32rulesdlg.h"
+#include "win32.h"
+
+#ifdef __MINGW32__
+#include "cygwin.h"
+#endif
+
+const char w32rulesdlg_h_rcs[] = W32RULESDLG_H_VERSION;
+
+
+#ifndef _WIN_CONSOLE /* entire file */
+#ifdef WIN_GUI_EDIT /* entire file */
+
+
+const int nSmallIconWidth = 16;
+const int nSmallIconHeight = 16;
+
+static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+static HIMAGELIST g_hImageList = NULL;
+static char *g_pszDefaultRule;
+static BOOL g_bDirty = FALSE;
+
+
+
+/*********************************************************************
+ *
+ * Function    :  ShowRulesDialog
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndParent = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+int ShowRulesDialog(HWND hwndParent)
+{
+   DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_RULES), hwndParent, DialogProc);
+   return TRUE;
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  SetDefaultRule
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  pszRule = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+void SetDefaultRule(const char *pszRule)
+{
+   if (pszRule == NULL)
+   {
+      if (g_pszDefaultRule)
+      {
+         free(g_pszDefaultRule);
+         g_pszDefaultRule = NULL;
+      }
+   }
+   else
+   {
+      g_pszDefaultRule = strdup(pszRule);
+   }
+
+}
+
+
+#define IMAGE_ALLOW 0
+#define IMAGE_DENY  1
+
+/*********************************************************************
+ *
+ * Function    :  InsertRule
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndListView = (what?)
+ *          2  :  pszRule = (what?)
+ *          3  :  bAllow = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void InsertRule(HWND hwndListView, const char *pszRule, BOOL bAllow)
+{
+   LVITEM item;
+   item.mask = LVIF_TEXT | LVIF_IMAGE;
+   item.pszText = (char *)pszRule;
+   item.iItem = ListView_GetItemCount(hwndListView) + 1;
+   item.iSubItem = 0;
+   item.iImage = bAllow ? IMAGE_ALLOW : IMAGE_DENY;
+   ListView_InsertItem(hwndListView, &item);
+   /* TODO add subitem for whether the rule is always or never */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  SetDirty
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  bDirty = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void SetDirty(BOOL bDirty)
+{
+   g_bDirty = bDirty;
+   /* TODO Change some values */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnInitDialog
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnInitDialog(HWND hwndDlg)
+{
+   LVCOLUMN aCols[2];
+   HWND hwndListView;
+   RECT rcListView;
+   int cx;
+
+   if (g_hImageList == NULL)
+   {
+      /* Create image list and add icons */
+      HICON hIconDeny = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_DENYRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0);
+      HICON hIconAllow = LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ALLOWRULE), IMAGE_ICON, nSmallIconWidth, nSmallIconHeight, 0);
+      g_hImageList = ImageList_Create(nSmallIconWidth, nSmallIconHeight, ILC_COLOR | ILC_MASK, 0, 10);
+      ImageList_AddIcon(g_hImageList, hIconAllow);
+      ImageList_AddIcon(g_hImageList, hIconDeny);
+   }
+
+   /* Set the default rule value if there is one */
+   if (g_pszDefaultRule)
+   {
+      SetDlgItemText(hwndDlg, IDC_NEW, g_pszDefaultRule);
+      SetDefaultRule(NULL);
+   }
+
+   /* Initialise the list view */
+   hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   ListView_SetImageList(hwndListView, g_hImageList, LVSIL_SMALL);
+   GetClientRect(hwndListView, &rcListView);
+   cx = rcListView.right - rcListView.left;
+   aCols[0].mask = LVCF_TEXT | LVCF_WIDTH;
+   aCols[0].pszText = "Rule";
+   aCols[0].cx = (70 * cx) / 100;
+   aCols[1].mask = LVCF_TEXT | LVCF_WIDTH;
+   aCols[1].pszText = "Applies when";
+   aCols[1].cx = cx - aCols[0].cx;
+   ListView_InsertColumn(hwndListView, 0, &aCols[0]);
+   ListView_InsertColumn(hwndListView, 1, &aCols[1]);
+
+   /* Read and add rules to the list */
+   /* TODO */
+   InsertRule(hwndListView, "Test rule 1", TRUE);
+   InsertRule(hwndListView, "Test rule 2", TRUE);
+   InsertRule(hwndListView, "Test rule 3", FALSE);
+   InsertRule(hwndListView, "Test rule 4", FALSE);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  GetFirstSelectedItem
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+static int GetFirstSelectedItem(HWND hwndDlg)
+{
+   /* Check for selected items */
+   HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   int nItem = -1;
+   do
+   {
+      nItem = ListView_GetNextItem(hwndListView, nItem, LVNI_SELECTED);
+      if (nItem >= 0)
+      {
+         return nItem;
+      }
+   } while (nItem >= 0);
+   return -1;
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnRulesItemChanged
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnRulesItemChanged(HWND hwndDlg)
+{
+   int nItem = GetFirstSelectedItem(hwndDlg);
+   HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+   int nItems = ListView_GetItemCount(hwndListView);
+   BOOL bHaveSelection = (nItem >= 0) ? TRUE : FALSE;
+   BOOL bMoveUp = (bHaveSelection && nItem > 0) ? TRUE : FALSE;
+   BOOL bMoveDown = (bHaveSelection && nItem < nItems - 1) ? TRUE : FALSE;
+
+   /* Enable/disable buttons */
+   EnableWindow(GetDlgItem(hwndDlg, IDC_DELETE), bHaveSelection);
+   EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEUP), bMoveUp);
+   EnableWindow(GetDlgItem(hwndDlg, IDC_MOVEDOWN), bMoveDown);
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  MoveRules
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  bMoveUp = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void MoveRules(HWND hwndDlg, BOOL bMoveUp)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnMoveRuleUpClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnMoveRuleUpClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnMoveRuleDownClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnMoveRuleDownClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnCreateRuleClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnCreateRuleClick(HWND hwndDlg)
+{
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnDeleteRuleClick
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnDeleteRuleClick(HWND hwndDlg)
+{
+   /* Get selection and remove it */
+   int nItem = GetFirstSelectedItem(hwndDlg);
+   if (nItem >= 0)
+   {
+      LVITEM item;
+      HWND hwndListView = GetDlgItem(hwndDlg, IDC_RULES);
+      item.mask = LVIF_PARAM;
+      item.iItem = nItem;
+      item.iSubItem = 0;
+      ListView_GetItem(hwndListView, &item);
+      /* TODO erase data stored with item */
+      ListView_DeleteItem(hwndListView, nItem);
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnCommand
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  nCommand = (what?)
+ *          3  :  nNotifyCode = (what?)
+ *          4  :  hwndItem = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnCommand(HWND hwndDlg, int nCommand, int nNotifyCode, HWND hwndItem)
+{
+   switch (nCommand)
+   {
+      case IDCANCEL:
+      case IDC_SAVE:
+         EndDialog(hwndDlg, IDOK);
+         break;
+      case IDC_CREATE:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnCreateRuleClick(hwndDlg);
+         }
+         break;
+      case IDC_DELETE:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnDeleteRuleClick(hwndDlg);
+         }
+         break;
+      case IDC_MOVEUP:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnMoveRuleUpClick(hwndDlg);
+         }
+         break;
+      case IDC_MOVEDOWN:
+         if (nNotifyCode == BN_CLICKED)
+         {
+            OnMoveRuleDownClick(hwndDlg);
+         }
+         break;
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnNotify
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  nIdCtrl = (what?)
+ *          3  :  pnmh = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnNotify(HWND hwndDlg, int nIdCtrl, LPNMHDR pnmh)
+{
+   switch (nIdCtrl)
+   {
+      case IDC_RULES:
+         switch (pnmh->code)
+         {
+            case LVN_ITEMCHANGED:
+               OnRulesItemChanged(hwndDlg);
+               break;
+         }
+         break;
+   }
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  OnDestroy
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *
+ * Returns     :  N/A
+ *
+ *********************************************************************/
+static void OnDestroy(HWND hwndDlg)
+{
+   /* TODO any destruction cleanup */
+
+}
+
+
+/*********************************************************************
+ *
+ * Function    :  DialogProc
+ *
+ * Description :  (Please fill me in!)
+ *
+ * Parameters  :
+ *          1  :  hwndDlg = (what?)
+ *          2  :  uMsg = (what?)
+ *          3  :  wParam = (what?)
+ *          4  :  lParam = (what?)
+ *
+ * Returns     :  (Please fill me in!)
+ *
+ *********************************************************************/
+static BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+   switch (uMsg)
+   {
+      case WM_INITDIALOG:
+         OnInitDialog(hwndDlg);
+         return TRUE;
+
+      case WM_DESTROY:
+         OnDestroy(hwndDlg);
+         return TRUE;
+
+      case WM_COMMAND:
+         OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), (HWND) lParam);
+         break;
+
+      case WM_NOTIFY:
+         OnNotify(hwndDlg, (int) wParam, (LPNMHDR) lParam);
+         break;
+   }
+   return FALSE;
+
+}
+
+#endif /* def WIN_GUI_EDIT - entire file */
+#endif /* ndef _WIN_CONSOLE - entire file */
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
diff --git a/w32rulesdlg.h b/w32rulesdlg.h
new file mode 100644 (file)
index 0000000..9fe945d
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef _W32RULESDLG_H
+#define _W32RULESDLG_H
+#define W32RULESDLG_H_VERSION "$Id: w32rulesdlg.h,v 1.1.1.1 2001/05/15 13:59:08 oes Exp $"
+/*********************************************************************
+ *
+ * File        :  $Source: /cvsroot/ijbswa/current/w32rulesdlg.h,v $
+ *
+ * Purpose     :  A dialog to allow GUI editing of the rules.
+ *                Unfinished.
+ *
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
+ *
+ *                Written by and Copyright (C) 1999 Adam Lock
+ *                <locka@iol.ie>
+ *
+ *                This program is free software; you can redistribute it 
+ *                and/or modify it under the terms of the GNU General
+ *                Public License as published by the Free Software
+ *                Foundation; either version 2 of the License, or (at
+ *                your option) any later version.
+ *
+ *                This program is distributed in the hope that it will
+ *                be useful, but WITHOUT ANY WARRANTY; without even the
+ *                implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *                PARTICULAR PURPOSE.  See the GNU General Public
+ *                License for more details.
+ *
+ *                The GNU General Public License should be included with
+ *                this file.  If not, you can view it at
+ *                http://www.gnu.org/copyleft/gpl.html
+ *                or write to the Free Software Foundation, Inc., 59
+ *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * Revisions   :
+ *    $Log: w32rulesdlg.h,v $
+ *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
+ *    Initial import of version 2.9.3 source tree
+ *
+ *
+ *********************************************************************/
+\f
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _WIN_CONSOLE /* entire file */
+#ifdef WIN_GUI_EDIT /* entire file */
+
+extern int ShowRulesDialog(HWND hwndParent);
+extern void SetDefaultRule(const char *pszRule);
+
+#endif /* def WIN_GUI_EDIT - entire file */
+#endif /* ndef _WIN_CONSOLE - entire file */
+
+/* Revision control strings from this header and associated .c file */
+extern const char w32rulesdlg_rcs[];
+extern const char w32rulesdlg_h_rcs[];
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ndef _W32RULESDLG_H */
+
+
+/*
+  Local Variables:
+  tab-width: 3
+  end:
+*/
index b4ff924..63ac0d3 100644 (file)
@@ -1,4 +1,4 @@
-const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongfoster Exp $";
+const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.2 2001/05/20 15:07:54 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/w32taskbar.c,v $
@@ -6,8 +6,8 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf
  * Purpose     :  Functions for creating, setting and destroying the
  *                workspace tray icon
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -32,15 +32,6 @@ const char w32taskbar_rcs[] = "$Id: w32taskbar.c,v 1.5 2002/03/24 12:03:47 jongf
  *
  * Revisions   :
  *    $Log: w32taskbar.c,v $
- *    Revision 1.5  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.4  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.3  2001/05/22 18:56:28  oes
- *    CRLF -> LF
- *
  *    Revision 1.2  2001/05/20 15:07:54  jongfoster
  *    File is now ignored if _WIN_CONSOLE is defined.
  *
@@ -77,8 +68,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
  *
  * Function    :  CreateTrayWindow
  *
- * Description :  Creates and returns the invisible window responsible
- *                for processing tray messages.
+ * Description :  Creates and returns the invisible window responsible for processing tray messages.
  *
  * Parameters  :
  *          1  :  hInstance = instance handle of this application
@@ -89,7 +79,7 @@ static LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
 HWND CreateTrayWindow(HINSTANCE hInstance)
 {
    WNDCLASS wc;
-   static const char *szWndName = "PrivoxyTrayWindow";
+   static const char *szWndName = "JunkbusterTrayWindow";
 
    wc.style          = 0;
    wc.lpfnWndProc    = TrayProc;
@@ -244,7 +234,7 @@ LRESULT CALLBACK TrayProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
       case WM_TRAYMSG:
       {
-         /* UINT uID = (UINT) wParam; */
+         UINT uID = (UINT) wParam;
          UINT uMouseMsg = (UINT) lParam;
 
          if (uMouseMsg == WM_RBUTTONDOWN)
index 1945061..9ba21fb 100644 (file)
@@ -1,15 +1,15 @@
-#ifndef W32TASKBAR_H_INCLUDED
-#define W32TASKBAR_H_INCLUDED
-#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.3 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _W32TASKBAR_H
+#define _W32TASKBAR_H
+#define W32TASKBAR_H_VERSION "$Id: w32taskbar.h,v 1.1 2001/05/13 21:57:07 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/w32taskbar.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/w32taskbar.h,v $
  *
  * Purpose     :  Functions for creating, setting and destroying the
  *                workspace tray icon
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: w32taskbar.h,v $
- *    Revision 1.3  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -65,7 +55,7 @@ extern const char w32taskbar_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef W32TASKBAR_H_INCLUDED */
+#endif /* ndef _W32TASKBAR_H */
 
 
 /*
diff --git a/win32.c b/win32.c
index d9fcec3..2252dc1 100644 (file)
--- a/win32.c
+++ b/win32.c
@@ -1,12 +1,12 @@
-const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp $";
+const char win32_rcs[] = "$Id: win32.c,v 1.1 2001/05/13 21:57:07 administrator Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/win32.c,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/win32.c,v $
  *
  * Purpose     :  Win32 User Interface initialization and message loop
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
@@ -31,28 +31,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
  *
  * Revisions   :
  *    $Log: win32.c,v $
- *    Revision 1.7  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.6  2002/03/16 21:53:28  jongfoster
- *    VC++ Heap debug option
- *
- *    Revision 1.5  2002/03/04 23:47:30  jongfoster
- *    - Rewritten, simpler command-line pre-parser
- *    - not using raise(SIGINT) any more
- *
- *    Revision 1.4  2001/11/30 21:29:33  jongfoster
- *    Fixing a warning
- *
- *    Revision 1.3  2001/11/16 00:46:31  jongfoster
- *    Fixing compiler warnings
- *
- *    Revision 1.2  2001/07/29 19:32:00  jongfoster
- *    Renaming _main() [mingw32 only] to real_main(), for ANSI compliance.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -65,7 +43,6 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
 
 #include "project.h"
 #include "jcc.h"
-#include "miscutil.h"
 
 /* Uncomment this if you want to build Win32 as a console app */
 /* #define _WIN_CONSOLE */
@@ -75,26 +52,21 @@ const char win32_rcs[] = "$Id: win32.c,v 1.7 2002/03/24 12:03:47 jongfoster Exp
 #include <stdarg.h>
 #include <process.h>
 
-#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
-/* Visual C++ Heap debugging */
-#include <crtdbg.h>
-#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
-
 #include "win32.h"
 
 const char win32_h_rcs[] = WIN32_H_VERSION;
 
 const char win32_blurb[] =
-"Privoxy version " VERSION " for Windows\n"
-"Copyright (C) 2000-2002 by members of the Privoxy Team\n"
-"Copyright (C) 1997-8 by Junkbusters Corp.\n"
-"This is free software; it may be used and copied under the\n"
-"GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
+"Internet Junkbuster Proxy(TM) Version " VERSION " for Windows is Copyright (C) 1997-8\n"
+"by Junkbusters Corp.  This is free software; it may be used and copied under\n"
+"the GNU General Public License: http://www.gnu.org/copyleft/gpl.html .\n"
 "This program comes with ABSOLUTELY NO WARRANTY OF ANY KIND.\n"
 "\n"
 "For information about how to to configure the proxy and your browser, see\n"
-"        " HOME_PAGE_URL "\n"
-"\n";
+"        " REDIRECT_URL "win\n"
+"\n"
+"The Internet Junkbuster Proxy(TM) is running and ready to serve!\n"
+"";
 
 #ifdef _WIN_CONSOLE
 
@@ -117,12 +89,12 @@ static void  __cdecl UserInterfaceThread(void *);
  * Description :  M$ Windows "main" routine:
  *                parse the `lpCmdLine' param into main's argc and argv variables,
  *                start the user interface thread (for the systray window), and
- *                call main (i.e. patch execution into normal startup).
+ *                call main (i.e. patch execution into normal IJB startup).
  *
  * Parameters  :
- *          1  :  hInstance = instance handle of this execution
- *          2  :  hPrevInstance = instance handle of previous execution
- *          3  :  lpCmdLine = command line string which started us
+ *          1  :  hInstance = instance handle of this IJB execution
+ *          2  :  hPrevInstance = instance handle of previous IJB execution
+ *          3  :  lpCmdLine = command line string which started IJB
  *          4  :  nCmdShow = window show value (MIN, MAX, NORMAL, etc...)
  *
  * Returns     :  `main' never returns, so WinMain will also never return.
@@ -130,64 +102,56 @@ static void  __cdecl UserInterfaceThread(void *);
  *********************************************************************/
 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 {
+   int argc = 0;
    int i;
    int res;
-   int argc = 1;
-   const char *argv[3];
+   char **argv = NULL;
+   char *pszArgs = NULL;
+   char *pszLastTok;
    char szModule[MAX_PATH+1];
 #ifndef _WIN_CONSOLE
    HANDLE hInitCompleteEvent = NULL;
 #endif
 
+   /* Split command line into arguments */
+   pszArgs = (char *)malloc(strlen(lpCmdLine) + 1);
+   strcpy(pszArgs, lpCmdLine);
 
-#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
-#if 0
-   /* Visual C++ Heap debugging */
-
-   /* Get current flag*/
-   int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
-
-   /* Turn on leak-checking bit */
-   tmpFlag |= _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF;
-
-   /* Turn off CRT block checking bit */
-   tmpFlag &= ~(_CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF);
-
-   /* Set flag to the new value */
-   _CrtSetDbgFlag( tmpFlag );
-#endif
-#endif /* defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) */
-
-   /*
-    * Cheat in parsing the command line.  We only ever have at most one
-    * paramater, which may optionally be specified inside double quotes.
-    */
+   GetModuleFileName(hInstance, szModule, MAX_PATH);
 
-   if (lpCmdLine != NULL)
-   {
-      /* Make writable copy */
-      lpCmdLine = strdup(lpCmdLine);
-   }
-   if (lpCmdLine != NULL)
+   /* Count number of spaces */
+   argc = 1;
+   if (strlen(pszArgs) > 0)
    {
-      chomp(lpCmdLine);
-      i = strlen(lpCmdLine);
-      if ((i >= 2) && (lpCmdLine[0] == '\"') && (lpCmdLine[i - 1] == '\"'))
+      pszLastTok = pszArgs;
+      do
       {
-         lpCmdLine[i - 1] = '\0';
-         lpCmdLine++;
-      }
-      if (lpCmdLine[0] == '\0')
-      {
-         lpCmdLine = NULL;
-      }
+         argc++;
+         pszLastTok = strchr(pszLastTok+1, ' ');
+      } while (pszLastTok);
    }
 
-   GetModuleFileName(hInstance, szModule, MAX_PATH);
+   /* Allocate array of strings */
+   argv = (char **)malloc(sizeof(char *) * argc);
+
+   /* step through command line replacing spaces with zeros, initialise array */
    argv[0] = szModule;
-   argv[1] = lpCmdLine;
-   argv[2] = NULL;
-   argc = ((lpCmdLine != NULL) ? 2 : 1);
+   i = 1;
+   pszLastTok = pszArgs;
+   do
+   {
+      argv[i] = pszLastTok;
+      pszLastTok = strchr(pszLastTok+1, ' ');
+      if (pszLastTok)
+      {
+         while (*pszLastTok != '\0' && *pszLastTok == ' ')
+         {
+            *pszLastTok = '\0';
+            pszLastTok++;
+         }
+      }
+      i++;
+   } while (pszLastTok && *pszLastTok != '\0');
 
 #ifndef _WIN_CONSOLE
    /* Create a user-interface thread and wait for it to initialise */
@@ -200,11 +164,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
 #endif
 
 #ifdef __MINGW32__
-   res = real_main( argc, argv );
+   res = _main( argc, argv );
 #else
    res = main( argc, argv );
 #endif
 
+   /* Cleanup */
+   free(argv);
+   free(pszArgs);
+
    return res;
 
 }
@@ -238,7 +206,7 @@ void InitWin32(void)
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
    {
 #ifndef _WIN_CONSOLE
-      MessageBox(NULL, "Cannot initialize WinSock library", "Privoxy Error", 
+      MessageBox(NULL, "Cannot initialize WinSock library", "Internet JunkBuster Error", 
          MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST);  
 #endif
       exit(1);
@@ -262,7 +230,7 @@ void InitWin32(void)
  * Description :  User interface thread.  WinMain will wait for us to set
  *                the hInitCompleteEvent before patching over to `main'.
  *                This ensures the systray window is active before beginning
- *                operations.
+ *                IJB operations.
  *
  * Parameters  :
  *          1  :  pData = pointer to `hInitCompleteEvent'.
@@ -290,7 +258,7 @@ static void __cdecl UserInterfaceThread(void *pData)
    TermLogWindow();
 
    /* Time to die... */
-   exit(0);
+   raise(SIGINT);
 
 }
 
diff --git a/win32.h b/win32.h
index 7c699dc..3011f47 100644 (file)
--- a/win32.h
+++ b/win32.h
@@ -1,14 +1,14 @@
-#ifndef WIN32_H_INCLUDED
-#define WIN32_H_INCLUDED
-#define WIN32_H_VERSION "$Id: win32.h,v 1.4 2002/03/24 12:03:47 jongfoster Exp $"
+#ifndef _WIN32_H
+#define _WIN32_H
+#define WIN32_H_VERSION "$Id: win32.h,v 1.1 2001/05/13 21:57:07 administrator Exp $"
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/win32.h,v $
+ * File        :  $Source: /home/administrator/cvs/ijb/win32.h,v $
  *
  * Purpose     :  Win32 User Interface initialization and message loop
  *
- * Copyright   :  Written by and Copyright (C) 2001-2002 members of
- *                the Privoxy team.  http://www.privoxy.org/
+ * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
+ *                IJBSWA team.  http://ijbswa.sourceforge.net
  *
  *                Written by and Copyright (C) 1999 Adam Lock
  *                <locka@iol.ie>
  *
  * Revisions   :
  *    $Log: win32.h,v $
- *    Revision 1.4  2002/03/24 12:03:47  jongfoster
- *    Name change
- *
- *    Revision 1.3  2001/07/30 22:08:36  jongfoster
- *    Tidying up #defines:
- *    - All feature #defines are now of the form FEATURE_xxx
- *    - Permanently turned off WIN_GUI_EDIT
- *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
- *
- *    Revision 1.2  2001/07/29 18:43:08  jongfoster
- *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
- *    ANSI C rules.
- *
- *    Revision 1.1.1.1  2001/05/15 13:59:08  oes
- *    Initial import of version 2.9.3 source tree
- *
  *
  *********************************************************************/
 \f
@@ -78,8 +62,8 @@ extern const char win32_h_rcs[];
 } /* extern "C" */
 #endif
 
-#endif /* ndef WIN32_H_INCLUDED */
-  
+#endif /* ndef _WIN32_H */
+
 /*
   Local Variables:
   tab-width: 3