THIS FILE WILL NO LONGER BE USED.  See `INSTALL' instead.

1.0
--------------------------------------------------------------------------------
1. supports Apache 2.0.40
2. first release of mod_tcl 1.0, I've been running this for months stable no errors in error_log.
   I don't think all of the functionality is complete but it's decently broad.  Some things are
   missing like the boundary in the request_rec, because it doesn't exist in Apache anymore...
3. I recommend using Tcl 8.4 since it supports WideInt (64-bit) integers.
4. Runs on Solaris 9 sparcv9 ABI which is the 64-bit ABI, I assume it will run on others as well.
   (used gcc 3.1.1 with -m64)
5. You can use --with-tcldir=path_to_tclConfig.sh in ./configure
6. ./configure also adds -R<tcl_library_path> to linker phase.  Just in case you don't have
   /usr/local/lib setup as default.


Changes in 1.0d8-2001112900
--------------------------------------------------------------------------------
- Some structures changed in Apache 2.0.28, noteably in the connection record,
some variables were axed.  (keptalive and keepalives).
- Some variables sizes changed in the request_rec structure, from 32 bits to 64
bits, which isn't supported by Tcl in 8.3.4.  (allowed and allowed_methods).
- <Tcl> raw args no longer work in 2.0.28.
- The use of the `Tcl' directory to enable mod_tcl in a directory is deprecated.
- No longer use `SetHandler tcl-handler', use `Addhandler tcl-handler tm' in a
directory statement, (tm is the extension to match [.tm]).  If you use
SetHandler it will interfere with mod_dir.c and other handlers, unless you don't
care about the other handlers.  I'm not sure if this is an Apache bug or what? 
For mod_dir.c it appears to be called and but tries to match against
tcl-handler?  See the INSTALL file for an example of a configuration in 2.0.28,
see the test_script.tm example for an example script.

Changes in 1.0d7
--------------------------------------------------------------------------------
- Migration to Apache 2.0.16
- I now know how to implement problem hooks

Changes in 1.0d7pre
--------------------------------------------------------------------------------
- Fixed <Tcl>...</Tcl>, these should be placed outside of <Directory>/<Location>
directives.  Everything in <Tcl>...</Tcl> is added to a global variable and then
made local to the namespace of the file, this is due to several problems with
handling configuration, mainly that exection would either result in a "this
directive doesn't belong here" or a problem with the configuration not being
built yet as in an EXEC_ON_READ.
- Fixed a bug in ap_create_environment.
- Fixed a bug with writing <Tcl>...</Tcl> logic to the local namespace
[2001032300]

Changes in 1.0d6
--------------------------------------------------------------------------------

- ap_send_http_header no longer does anything so the command just returns TCL_OK
which essentially makes it null, I'll probably get rid of it later.
- made changes in league with Apache 2.0.14.  Handlers were moved around etc.

Changes in 1.0d5
--------------------------------------------------------------------------------

- Configuration checks for mmap() and will use malloc(),read(),free() in that
order to replace mmap() procedures.
- Constants and commands are now placed in the ::apache namespace, so you must
import that namespace into your scripts.
- A test script is included with the distribution for testing and example
purposes.  test_script.tm

Map
--------------------------------------------------------------------------------

- 1.0d0 -| Inital port from mod_tcl* 0.26, single file split into 4
         | (Apache 2.0a9)
         |
- 1.0d1 -| removal of nasties, update of configuration
         |
- 1.0d2 -| addition of some API commands
         |
- 1.0d3 -| more of API exposed, new config option, inital checkin to CVS
         |
- 1.0d4 -| Documentation, 90% of API exposed
         |
- 1.0d5 -| constants commands in ::apache namespace, mmap checking, test
         | script
         |
- 1.0d6 -| ap_send_http_header deprecated, updated to be peachy with
         | Apache 2.0.14
         |
- 1.0d7 -| migration to Apache 2.0.16, fixed bugs
         |
% 1.0d8 %| remaining at 1.0d8 until Apache 2.0 is release quality.
         |
- 1.0d9 -| stabalization with Apache 2.0 release API and bug fixes.
         |
- 1.0.0 -| release.
