What's new in this release?
===========================

Below is a list of all relevant changes since release 1.5.1.  Older
changes are in the file HISTORY.  The most recent changes are listed
first.

A note on attributions: while I have sprinkled some names throughout
here, I'm grateful to many more people who remain unnamed.  You may
find your name in the ACKS file.  If you believe you deserve more
credit, let me know and I'll add you to the list!

(In the sake of steramlining the release process, I'm now using output
from rcs2log.  This gives complete disclosure but is more verbose and
requires more effort to read.  Let me know if this is acceptable.
--Guido.)


======================================================================


From 1.5.2c1 to 1.5.2 (final)
=============================

Tue Apr 13 15:44:49 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse: Bump version to 1.5.2 (final)

	* PCbuild/python15.dsp: Added shamodule.c

	* PC/config.c: Added sha module!

	* README, Include/patchlevel.h: Prepare for final release.

	* Misc/ACKS:
	More (Cameron Laird is honorary; the others are 1.5.2c1 testers).

	* Python/thread_solaris.h:
	While I can't really test this thoroughly, Pat Knight and the Solaris
	man pages suggest that the proper thing to do is to add THR_NEW_LWP to
	the flags on thr_create(), and that there really isn't a downside, so
	I'll do that.

	* Misc/ACKS:
	Bunch of new names who helped iron out the last wrinkles of 1.5.2.

	* PC/python_nt.rc:
	Bump the myusterious M$ version number from 1,5,2,1 to 1,5,2,3.
	(I can't even display this on NT, maybe Win/98 can?)

	* Lib/pstats.py:
	Fix mysterious references to jprofile that were in the source since
	its creation.  I'm assuming these were once valid references to "Jim
	Roskind's profile"...

	* Lib/Attic/threading_api.py:
	Removed; since long subsumed in Doc/lib/libthreading.tex

	* Modules/socketmodule.c:
	Put back __osf__ support for gethostbyname_r(); the real bug was that
	it was being used even without threads.  This of course might be an
	all-platform problem so now we only use the _r variant when we are
	using threads.

Mon Apr 12 22:51:20 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/cPickle.c:
	Fix accidentally reversed NULL test in load_mark().  Suggested by
	Tamito Kajiyama.  (This caused a bug only on platforms where malloc(0)
	returns NULL.)

	* README:
	Add note about popen2 problem on Linux noticed by Pablo Bleyer.

	* README: Add note about -D_REENTRANT for HP-UX 10.20.

	* Modules/Makefile.pre.in: 'clean' target should remove hassignal.

	* PC/Attic/vc40.mak, PC/readme.txt:
	Remove all VC++ info (except VC 1.5) from readme.txt;
	remove the VC++ 4.0 project file; remove the unused _tkinter extern defs.

	* README: Clarify PC build instructions (point to PCbuild).

	* Modules/zlibmodule.c: Cast added by Jack Jansen (for Mac port).

	* Lib/plat-sunos5/CDIO.py, Lib/plat-linux2/CDROM.py:
	Forgot to add this file.  CDROM device parameters.

	* Lib/gzip.py: Two different changes.

	1. Jack Jansen reports that on the Mac, the time may be negative, and
	solves this by adding a write32u() function that writes an unsigned
	long.

	2. On 64-bit platforms the CRC comparison fails; I've fixed this by
	casting both values to be compared to "unsigned long" i.e. modulo
	0x100000000L.

Sat Apr 10 18:42:02 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PC/Attic/_tkinter.def: No longer needed.

	* Misc/ACKS: Correct missed character in Andrew Dalke's name.

	* README: Add DEC Ultrix notes (from Donn Cave's email).

	* configure: The usual

	* configure.in:
	Quote a bunch of shell variables used in test, related to long-long.

	* Objects/fileobject.c, Modules/shamodule.c, Modules/regexpr.c:
	casts for picky compilers.

	* Modules/socketmodule.c:
	3-arg gethostbyname_r doesn't really work on OSF/1.

	* PC/vc15_w31/_.c, PC/vc15_lib/_.c, Tools/pynche/__init__.py:
	Avoid totally empty files.

Fri Apr  9 14:56:35 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/fixps.py: Use re instead of regex.
	Don't rewrite the file in place.
	(Reported by Andy Dustman.)

	* Lib/netrc.py, Lib/shlex.py: Get rid of #! line

Thu Apr  8 23:13:37 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse: Use the Tcl 8.0.5 installer.
	Add a variable %_TCL_% that makes it easier to switch to a different version.


======================================================================


From 1.5.2b2 to 1.5.2c1
=======================

Thu Apr  8 23:13:37 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* PCbuild/python15.wse:
	Release 1.5.2c1.  Add IDLE and Uninstall to program group.
	Don't distribute zlib.dll.  Tweak some comments.

	* PCbuild/zlib.dsp: Now using static zlib 1.1.3

	* Lib/dos-8x3/userdict.py, Lib/dos-8x3/userlist.py, Lib/dos-8x3/test_zli.py, Lib/dos-8x3/test_use.py, Lib/dos-8x3/test_pop.py, Lib/dos-8x3/test_pic.py, Lib/dos-8x3/test_ntp.py, Lib/dos-8x3/test_gzi.py, Lib/dos-8x3/test_fcn.py, Lib/dos-8x3/test_cpi.py, Lib/dos-8x3/test_bsd.py, Lib/dos-8x3/posixfil.py, Lib/dos-8x3/mimetype.py, Lib/dos-8x3/nturl2pa.py, Lib/dos-8x3/compilea.py, Lib/dos-8x3/exceptio.py, Lib/dos-8x3/basehttp.py:
	The usual

	* Include/patchlevel.h: Release 1.5.2c1

	* README: Release 1.5.2c1.

	* Misc/NEWS: News for the 1.5.2c1 release.

	* Lib/test/test_strftime.py:
	On Windows, we suddenly find, strftime() may return "" for an
	unsupported format string.  (I guess this is because the logic for
	deciding whether to reallocate the buffer or not has been improved.)
	This caused the test code to crash on result[0].  Fix this by assuming
	an empty result also means the format is not supported.

	* Demo/tkinter/matt/window-creation-w-location.py:
	This demo imported some private code from Matt.  Make it cripple along.

	* Lib/lib-tk/Tkinter.py:
	Delete an accidentally checked-in feature that actually broke more
	than was worth it: when deleting a canvas item, it would try to
	automatically delete the bindings for that item.  Since there's
	nothing that says you can't reuse the tag and still have the bindings,
	this is not correct.  Also, it broke at least one demo
	(Demo/tkinter/matt/rubber-band-box-demo-1.py).

	* Python/thread_wince.h: Win/CE thread support by Mark Hammond.

Wed Apr  7 20:23:17 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Patch by Andrew Kuchling to unflush() (flush() for deflating).
	Without this, if inflate() returned Z_BUF_ERROR asking for more output
	space, we would report the error; now, we increase the buffer size and
	try again, just as for Z_OK.

	* Lib/test/test_gzip.py: Use binary mode for all gzip files we open.

	* Tools/idle/ChangeLog: New change log.

	* Tools/idle/README.txt, Tools/idle/NEWS.txt: New version.

	* Python/pythonrun.c:
	Alas, get rid of the Win specific hack to ask the user to press Return
	before exiting when an error happened.  This didn't work right when
	Python is invoked from a daemon.

	* Tools/idle/idlever.py: Version bump awaiting impending new release.
	(Not much has changed :-( )

	* Lib/lib-tk/Tkinter.py:
	lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
	so the preferred name for them is tag_lower, tag_raise
	(similar to tag_bind, and similar to the Text widget);
	unfortunately can't delete the old ones yet (maybe in 1.6)

	* Python/thread.c, Python/strtod.c, Python/mystrtoul.c, Python/import.c, Python/ceval.c:
	Changes by Mark Hammond for Windows CE.  Mostly of the form
	  #ifdef DONT_HAVE_header_H ... #endif around #include <header.h>.

	* Python/bltinmodule.c:
	Remove unused variable from complex_from_string() code.

	* Include/patchlevel.h:
	Add the possibility of a gamma release (release candidate).
	Add '+' to string version number to indicate we're beyond b2 now.

	* Modules/posixmodule.c: Add extern decl for fsync() for SunOS 4.x.

	* Lib/smtplib.py: Changes by Per Cederquist and The Dragon.

	Per writes:

	"""
	The application where Signum Support uses smtplib needs to be able to
	report good error messages to the user when sending email fails.  To
	help in diagnosing problems it is useful to be able to report the
	entire message sent by the server, not only the SMTP error code of the
	offending command.

	A lot of the functions in sendmail.py unfortunately discards the
	message, leaving only the code.  The enclosed patch fixes that
	problem.

	The enclosed patch also introduces a base class for exceptions that
	include an SMTP error code and error message, and make the code and
	message available on separate attributes, so that surrounding code can
	deal with them in whatever way it sees fit.  I've also added some
	documentation to the exception classes.

	The constructor will now raise an exception if it cannot connect to
	the SMTP server.

	The data() method will raise an SMTPDataError if it doesn't receive
	the expected 354 code in the middle of the exchange.

	According to section 5.2.10 of RFC 1123 a smtp client must accept "any
	text, including no text at all" after the error code.  If the response
	of a HELO command contains no text self.helo_resp will be set to the
	empty string ("").  The patch fixes the test in the sendmail() method
	so that helo_resp is tested against None; if it has the empty string
	as value the sendmail() method would invoke the helo() method again.

	The code no longer accepts a -1 reply from the ehlo() method in
	sendmail().

	[Text about removing SMTPRecipientsRefused deleted --GvR]
	"""

	and also:

	"""
	smtplib.py appends an extra blank line to the outgoing mail if the
	`msg' argument to the sendmail method already contains a trailing
	newline.  This patch should fix the problem.
	"""

	The Dragon writes:

	"""
		Mostly I just re-added the SMTPRecipientsRefused exception
	(the exeption object now has the appropriate info in it ) [Per had
	removed this in his patch --GvR] and tweaked the behavior of the
	sendmail method whence it throws the newly added SMTPHeloException (it
	was closing the connection, which it shouldn't.  whatever catches the
	exception should do that. )

		I pondered the change of the return values to tuples all around,
	and after some thinking I decided that regularizing the return values was
	too much of the Right Thing (tm) to not do.

		My one concern is that code expecting an integer & getting a tuple
	may fail silently.

	(i.e. if it's doing :

	      x.somemethod() >= 400:
	expecting an integer, the expression will always be true if it gets a
	tuple instead. )

		However, most smtplib code I've seen only really uses the
	sendmail() method, so this wouldn't bother it.  Usually code I've seen
	that calls the other methods usually only calls helo() and ehlo() for
	doing ESMTP, a feature which was not in the smtplib included with 1.5.1,
	and thus I would think not much code uses it yet.
	"""

Tue Apr  6 19:38:18 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_ntpath.py:
	Fix the tests now that splitdrive() no longer treats UNC paths special.
	(Some tests converted to splitunc() tests.)

	* Lib/ntpath.py:
	Withdraw the UNC support from splitdrive().  Instead, a new function
	splitunc() parses UNC paths.  The contributor of the UNC parsing in
	splitdrive() doesn't like it, but I haven't heard a good reason to
	keep it, and it causes some problems.  (I think there's a
	philosophical problem -- to me, the split*() functions are purely
	syntactical, and the fact that \\foo is not a valid path doesn't mean
	that it shouldn't be considered an absolute path.)

	Also (quite separately, but strangely related to the philosophical
	issue above) fix abspath() so that if win32api exists, it doesn't fail
	when the path doesn't actually exist -- if GetFullPathName() fails,
	fall back on the old strategy (join with getcwd() if neccessary, and
	then use normpath()).

	* configure.in, configure, config.h.in, acconfig.h:
	For BeOS PowerPC.  Chris Herborth.

Mon Apr  5 21:54:14 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/timemodule.c:
	Jonathan Giddy notes, and Chris Lawrence agrees, that some comments on
	#else/#endif are wrong, and that #if HAVE_TM_ZONE should be #ifdef.

	* Misc/ACKS:
	Bunch of new contributors, including 9 who contributed to the Docs,
	reported by Fred.

Mon Apr  5 18:37:59 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/gzip.py:
	Oops, missed mode parameter to open().

	* Lib/gzip.py:
	Made the default mode 'rb' instead of 'r', for better cross-platform
	support.  (Based on comment on the documentation by Bernhard Reiter
	<bernhard@csd.uwm.edu>).

Fri Apr  2 22:18:25 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/dutree.py:
	For reasons I dare not explain, this script should always execute
	main() when imported (in other words, it is not usable as a module).

Thu Apr  1 15:32:30 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_cpickle.py: Jonathan Giddy write:

	In test_cpickle.py, the module os got imported, but the line to remove
	the temp file has gone missing.

Tue Mar 30 20:17:31 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/BaseHTTPServer.py: Per Cederqvist writes:

	If you send something like "PUT / HTTP/1.0" to something derived from
	BaseHTTPServer that doesn't define do_PUT, you will get a response
	that begins like this:

		HTTP/1.0 501 Unsupported method ('do_PUT')
		Server: SimpleHTTP/0.3 Python/1.5
		Date: Tue, 30 Mar 1999 18:53:53 GMT

	The server should complain about 'PUT' instead of 'do_PUT'.  This
	patch should fix the problem.

Mon Mar 29 20:33:21 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/smtplib.py: Patch by Per Cederqvist, who writes:

	"""
	 - It needlessly used the makefile() method for each response that is
	   read from the SMTP server.

	 - If the remote SMTP server closes the connection unexpectedly the
	   code raised an IndexError.  It now raises an SMTPServerDisconnected
	   exception instead.

	 - The code now checks that all lines in a multiline response actually
	   contains an error code.
	"""

	The Dragon approves.

Mon Mar 29 20:25:40 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/compileall.py:
	When run as a script, report failures in the exit code as well.
	Patch largely based on changes by Andrew Dalke, as discussed in the
	distutils-sig.

Mon Mar 29 20:23:41 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	Hack so that if a 302 or 301 redirect contains a relative URL, the
	right thing "just happens" (basejoin() with old URL).

	* Modules/cPickle.c:
	Protection against picling to/from closed (real) file.
	The problem was reported by Moshe Zadka.

	* Lib/test/test_cpickle.py:
	Test protection against picling to/from closed (real) file.

	* Modules/timemodule.c: Chris Lawrence writes:

	"""
	The GNU folks, in their infinite wisdom, have decided not to implement
	altzone in libc6; this would not be horrible, except that timezone
	(which is implemented) includes the current DST setting (i.e. timezone
	for Central is 18000 in summer and 21600 in winter).  So Python's
	timezone and altzone variables aren't set correctly during DST.

	Here's a patch relative to 1.5.2b2 that (a) makes timezone and altzone
	show the "right" thing on Linux (by using the tm_gmtoff stuff
	available in BSD, which is how the GLIBC manual claims things should
	be done) and (b) should cope with the southern hemisphere.  In pursuit
	of (b), I also took the liberty of renaming the "summer" and "winter"
	variables to "july" and "jan".  This patch should also make certain
	time calculations on Linux actually work right (like the tz-aware
	functions in the rfc822 module).

	(It's hard to find DST that's currently being used in the southern
	hemisphere; I tested using Africa/Windhoek.)
	"""

	* Lib/test/output/test_gzip:
	Jonathan Giddy discovered this file was missing.

	* Modules/shamodule.c:
	Avoid warnings from AIX compiler.  Reported by Vladimir (AIX is my
	middlename) Marangozov, patch coded by Greg Stein.

	* Tools/idle/ScriptBinding.py, Tools/idle/PyShell.py:
	At Tim Peters' recommendation, add a dummy flush() method to PseudoFile.

Sun Mar 28 17:55:32 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/ndiff.py: Tim Peters writes:

	I should have waited overnight <wink/sigh>.  Nothing wrong with the one I
	sent, but I couldn't resist going on to add new -r1 / -r2 cmdline options
	for recreating the original files from ndiff's output.  That's attached, if
	you're game!  Us Windows guys don't usually have a sed sitting around
	<wink>.

Sat Mar 27 13:34:01 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/scripts/ndiff.py: Tim Peters writes:

	Attached is a cleaned-up version of ndiff (added useful module
	docstring, now echo'ed in case of cmd line mistake); added -q option
	to suppress initial file identification lines; + other minor cleanups,
	& a slightly faster match engine.

Fri Mar 26 22:36:00 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Tools/scripts/dutree.py:
	During display, if EPIPE is raised, it's probably because a pager was
	killed.  Discard the error in that case, but propogate it otherwise.

Fri Mar 26 16:20:45 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_userlist, Lib/test/test_userlist.py:
	Test suite for UserList.

	* Lib/UserList.py: Use isinstance() where appropriate.
	Reformatted with 4-space indent.

Fri Mar 26 16:11:40 1999  Barry Warsaw  <bwarsaw@eric.cnri.reston.va.us>

	* Tools/pynche/PyncheWidget.py:
	Helpwin.__init__(): The text widget should get focus.

	* Tools/pynche/pyColorChooser.py:
	Removed unnecessary import `from PyncheWidget import PyncheWidget'

Fri Mar 26 15:32:05 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_userdict, Lib/test/test_userdict.py:
	Test suite for UserDict

	* Lib/UserDict.py: Improved a bunch of things.
	The constructor now takes an optional dictionary.
	Use isinstance() where appropriate.

Thu Mar 25 22:38:49 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_pickle, Lib/test/output/test_cpickle, Lib/test/test_pickle.py, Lib/test/test_cpickle.py:
	Basic regr tests for pickle/cPickle

	* Lib/pickle.py:
	Don't use "exec" in find_class().  It's slow, unnecessary, and (as AMK
	points out) it doesn't work in JPython Applets.

Thu Mar 25 21:50:27 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Lib/test/test_gzip.py:
	Added a simple test suite for gzip.  It simply opens a temp file,
	writes a chunk of compressed data, closes it, writes another chunk, and
	reads the contents back to verify that they are the same.

	* Lib/gzip.py:
	Based on a suggestion from bruce@hams.com, make a trivial change to
	allow using the 'a' flag as a mode for opening a GzipFile.  gzip
	files, surprisingly enough, can be concatenated and then decompressed;
	the effect is to concatenate the two chunks of data.

	If we support it on writing, it should also be supported on reading.
	This *wasn't* trivial, and required rearranging the code in the
	reading path, particularly the _read() method.

	Raise IOError instead of RuntimeError in two cases, 'Not a gzipped file'
	and 'Unknown compression method'

Thu Mar 25 21:25:01 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/test_b1.py:
	Add tests for float() and complex() with string args (Nick/Stephanie
	Lockwood).

Thu Mar 25 21:21:08 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Add an .unused_data attribute to decompressor objects.  If .unused_data
	is not an empty string, this means that you have arrived at the
	end of the stream of compressed data, and the contents of .unused_data are
	whatever follows the compressed stream.

Thu Mar 25 21:16:07 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Python/bltinmodule.c:
	Patch by Nick and Stephanie Lockwood to implement complex() with a string
	argument.  This closes TODO item 2.19.

Wed Mar 24 19:09:00 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/webchecker/wcnew.py: Added Samuel Bayer's new webchecker.
	Unfortunately his code breaks wcgui.py in a way that's not easy
	to fix.  I expect that this is a temporary situation --
	eventually Sam's changes will be merged back in.
	(The changes add a -t option to specify exceptions to the -x
	option, and explicit checking for #foo style fragment ids.)

	* Objects/dictobject.c:
	Vladimir Marangozov contributed updated comments.

	* Objects/bufferobject.c: Folded long lines.

	* Lib/test/output/test_sha, Lib/test/test_sha.py:
	Added Jeremy's test code for the sha module.

	* Modules/shamodule.c, Modules/Setup.in:
	Added Greg Stein and Andrew Kuchling's sha module.
	Fix comments about zlib version and URL.

	* Lib/test/test_bsddb.py: Remove the temp file when we're done.

	* Include/pythread.h: Conform to standard boilerplate.

	* configure.in, configure, BeOS/linkmodule, BeOS/ar-fake:
	Chris Herborth: the new compiler in R4.1 needs some new options to work...

	* Modules/socketmodule.c:
	Implement two suggestions by Jonathan Giddy: (1) in AIX, clear the
	data struct before calling gethostby{name,addr}_r(); (2) ignore the
	3/5/6 args determinations made by the configure script and switch on
	platform identifiers instead:

	AIX, OSF have 3 args
	Sun, SGI have 5 args
	Linux has 6 args

	On all other platforms, undef HAVE_GETHOSTBYNAME_R altogether.

	* Modules/socketmodule.c:
	Vladimir Marangozov implements the AIX 3-arg gethostbyname_r code.

	* Lib/mailbox.py:
	Add readlines() to _Subfile class.  Not clear who would need it, but
	Chris Lawrence sent me a broken version; this one is a tad simpler and
	more conforming to the standard.

Tue Mar 23 23:05:34 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/gzip.py: use struct instead of bit-manipulate in Python

Tue Mar 23 19:00:55 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/Makefile.pre.in:
	Add $(EXE) to various occurrences of python so it will work on Cygwin
	with egcs (after setting EXE=.exe).  Patch by Norman Vine.

	* configure, configure.in:
	Ack!  It never defined HAVE_GETHOSTBYNAME_R so that code was never tested!

Mon Mar 22 22:25:39 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Include/thread.h:
	Adding thread.h -- unused but for b/w compatibility.
	As requested by Bill Janssen.

	* configure.in, configure:
	Add code to test for all sorts of gethostbyname_r variants,
	donated by David Arnold.

	* config.h.in, acconfig.h:
	Add symbols for gethostbyname_r variants (sigh).

	* Modules/socketmodule.c: Clean up pass for the previous patches.

	- Use HAVE_GETHOSTBYNAME_R_6_ARG instead of testing for Linux and
	glibc2.

	- If gethostbyname takes 3 args, undefine HAVE_GETHOSTBYNAME_R --
	don't know what code should be used.

	- New symbol USE_GETHOSTBYNAME_LOCK defined iff the lock should be used.

	- Modify the gethostbyaddr() code to also hold on to the lock until
	after it is safe to release, overlapping with the Python lock.

	(Note: I think that it could in theory be possible that Python code
	executed while gethostbyname_lock is held could attempt to reacquire
	the lock -- e.g. in a signal handler or destructor.  I will simply say
	"don't do that then.")

	* Modules/socketmodule.c: Jonathan Giddy writes:

	Here's a patch to fix the race condition, which wasn't fixed by Rob's
	patch.  It holds the gethostbyname lock until the results are copied out,
	which means that this lock and the Python global lock are held at the same
	time.  This shouldn't be a problem as long as the gethostbyname lock is
	always acquired when the global lock is not held.

Mon Mar 22 19:25:30 1999  Andrew Kuchling  <akuchlin@eric.cnri.reston.va.us>

	* Modules/zlibmodule.c:
	Fixed the flush() method of compression objects; the test for
	    the end of loop was incorrect, and failed when the flushmode != Z_FINISH.
	    Logic cleaned up and commented.

	* Lib/test/test_zlib.py:
	Added simple test for the flush() method of compression objects, trying the
	    different flush values Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH.

Mon Mar 22 15:28:08 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/shlex.py:
	Bug reported by Tobias Thelen: missing "self." in assignment target.

Fri Mar 19 21:50:11 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Modules/arraymodule.c:
	Use an unsigned cast to avoid a warning in VC++.

	* Lib/dospath.py, Lib/ntpath.py:
	New code for split() by Tim Peters, behaves more like posixpath.split().

	* Objects/floatobject.c:
	Fix a problem with Vladimir's PyFloat_Fini code: clear the free list; if
	a block cannot be freed, add its free items back to the free list.
	This is necessary to avoid leaking when Python is reinitialized later.

	* Objects/intobject.c:
	Fix a problem with Vladimir's PyInt_Fini code: clear the free list; if
	a block cannot be freed, add its free items back to the free list, and
	add its valid ints back to the small_ints array if they are in range.
	This is necessary to avoid leaking when Python is reinitialized later.

	* Lib/types.py:
	Added BufferType, the type returned by the new builtin buffer().  Greg Stein.

	* Python/bltinmodule.c:
	New builtin buffer() creates a derived read-only buffer from any
	object that supports the buffer interface (e.g. strings, arrays).

	* Objects/bufferobject.c:
	Added check for negative offset for PyBuffer_FromObject and check for
	negative size for PyBuffer_FromMemory.  Greg Stein.

Thu Mar 18 15:10:44 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py: Sjoerd Mullender writes:

	If a filename on Windows starts with \\, it is converted to a URL
	which starts with ////.  If this URL is passed to urlparse.urlparse
	you get a path that starts with // (and an empty netloc).  If you pass
	the result back to urlparse.urlunparse, you get a URL that starts with
	//, which is parsed differently by urlparse.urlparse.  The fix is to
	add the (empty) netloc with accompanying slashes if the path in
	urlunparse starts with //.  Do this for all schemes that use a netloc.

	* Lib/nturl2path.py: Sjoerd Mullender writes:

	Pathnames of files on other hosts in the same domain
	(\\host\path\to\file) are not translated correctly to URLs and back.
	The URL should be something like file:////host/path/to/file.
	Note that a combination of drive letter and remote host is not
	possible.

Wed Mar 17 22:30:10 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py:
	Delete non-standard-conforming code in urljoin() that would use the
	netloc from the base url as the default netloc for the resulting url
	even if the schemes differ.

	Once upon a time, when the web was wild, this was a valuable hack
	because some people had a URL referencing an ftp server colocated with
	an http server without having the host in the ftp URL (so they could
	replicate it or change the hostname easily).

	More recently, after the file: scheme got added back to the list of
	schemes that accept a netloc, it turns out that this caused weirdness
	when joining an http: URL with a file: URL -- the resulting file: URL
	would always inherit the host from the http: URL because the file:
	scheme supports a netloc but in practice never has one.

	There are two reasons to get rid of the old, once-valuable hack,
	instead of removing the file: scheme from the uses_netloc list.  One,
	the RFC says that file: uses the netloc syntax, and does not endorse
	the old hack.  Two, neither netscape 4.5 nor IE 4.0 support the old
	hack.

	* Include/ceval.h, Include/abstract.h:
	Add DLL level b/w compat for PySequence_In and PyEval_CallObject

Tue Mar 16 21:54:50 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/lib-tk/Tkinter.py: Bug reported by Jim Robinson:

	An attempt to execute grid_slaves with arguments (0,0) results in
	*all* of the slaves being returned, not just the slave associated with
	row 0, column 0.  This is because the test for arguments in the method
	does not test to see if row (and column) does not equal None, but
	rather just whether is evaluates to non-false.  A value of 0 fails
	this test.

Tue Mar 16 14:17:48 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Modules/cmathmodule.c:
	Docstring fix:  acosh() returns the hyperbolic arccosine, not the
	hyperbolic cosine.  Problem report via David Ascher by one of his
	students.

Mon Mar 15 21:40:59 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* configure.in:
	Should test for gethost*by*name_r, not for gethostname_r (which
	doesn't exist and doesn't make sense).

	* Modules/socketmodule.c:
	Patch by Rob Riggs for Linux -- glibc2 has a different argument
	converntion for gethostbyname_r() etc. than Solaris!

	* Python/thread_pthread.h: Rob Riggs wrote:

	"""
	Spec says that on success pthread_create returns 0. It does not say
	that an error code will be < 0. Linux glibc2 pthread_create() returns
	ENOMEM (12) when one exceed process limits. (It looks like it should
	return EAGAIN, but that's another story.)

	For reference, see:
	http://www.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html
	"""

	[I have a feeling that similar bugs were fixed before; perhaps someone
	could check that all error checks no check for != 0?]

	* Tools/bgen/bgen/bgenObjectDefinition.py:
	New mixin class that defines cmp and hash that use
	the ob_itself pointer.  This allows (when using the mixin)
	different Python objects pointing to the same C object and
	behaving well as dictionary keys.

	Or so sez Jack Jansen...

	* Lib/urllib.py: Yet another patch by Sjoerd Mullender:

	Don't convert URLs to URLs using pathname2url.

Fri Mar 12 22:15:43 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/cmd.py: Patch by Michael Scharf.  He writes:

	    The module cmd requires for each do_xxx command a help_xxx
	    function. I think this is a little old fashioned.

	    Here is a patch: use the docstring as help if no help_xxx
	    function can be found.

	[I'm tempted to rip out all the help_* functions from pdb, but I'll
	resist it.  Any takers?  --Guido]

	* Tools/freeze/freeze.py: Bug submitted by Wayne Knowles, who writes:

	   Under Windows, python freeze.py -o hello hello.py
	   creates all the correct files in the hello subdirectory, but the
	   Makefile has the directory prefix in it for frozen_extensions.c
	   nmake fails because it tries to locate hello/frozen_extensions.c

	(His fix adds a call to os.path.basename() in the appropriate place.)

	* Objects/floatobject.c, Objects/intobject.c:
	Vladimir has restructured his code somewhat so that the blocks are now
	represented by an explicit structure.  (There are still too many casts
	in the code, but that may be unavoidable.)

	Also added code so that with -vv it is very chatty about what it does.

	* Demo/zlib/zlibdemo.py, Demo/zlib/minigzip.py:
	Change #! line to modern usage; also chmod +x

	* Demo/pdist/rrcs, Demo/pdist/rcvs, Demo/pdist/rcsbump:
	Change #! line to modern usage

	* Lib/nturl2path.py, Lib/urllib.py: From: Sjoerd Mullender

	The filename to URL conversion didn't properly quote special
	characters.
	The URL to filename didn't properly unquote special chatacters.

	* Objects/floatobject.c:
	OK, try again.  Vladimir gave me a fix for the alignment bus error,
	so here's his patch again.  This time it works (at least on Solaris,
	Linux and Irix).

Thu Mar 11 23:21:23 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Tools/idle/PathBrowser.py:
	Don't crash when sys.path contains an empty string.

	* Tools/idle/PathBrowser.py:
	- Don't crash in the case where a superclass is a string instead of a
	pyclbr.Class object; this can happen when the superclass is
	unrecognizable (to pyclbr), e.g. when module renaming is used.

	- Show a watch cursor when calling pyclbr (since it may take a while
	recursively parsing imported modules!).

Thu Mar 11 16:04:04 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/mimetypes.py:
	Added .rdf and .xsl as application/xml types.  (.rdf is for the
	Resource Description Framework, a metadata encoding, and .xsl is for
	the Extensible Stylesheet Language.)

Thu Mar 11 13:26:23 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/test/output/test_popen2, Lib/test/test_popen2.py:
	Test for popen2 module, by Chris Tismer.

	* Objects/floatobject.c:
	Alas, Vladimir's patch caused a bus error (probably double
	alignment?), and I didn't test it.  Withdrawing it for now.

Wed Mar 10 22:55:47 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Objects/floatobject.c:
	Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
	floats on finalization.

	* Objects/intobject.c:
	Patch by Vladimir Marangoz to allow freeing of the allocated blocks of
	integers on finalization.

	* Tools/idle/EditorWindow.py, Tools/idle/Bindings.py:
	Add PathBrowser to File module

	* Tools/idle/PathBrowser.py:
	"Path browser" - 4 scrolled lists displaying:
	    directories on sys.path
	    modules in selected directory
	    classes in selected module
	    methods of selected class

	Sinlge clicking in a directory, module or class item updates the next
	column with info about the selected item.  Double clicking in a
	module, class or method item opens the file (and selects the clicked
	item if it is a class or method).

	I guess eventually I should be using a tree widget for this, but the
	ones I've seen don't work well enough, so for now I use the old
	Smalltalk or NeXT style multi-column hierarchical browser.

	* Tools/idle/MultiScrolledLists.py:
	New utility: multiple scrolled lists in parallel

	* Tools/idle/ScrolledList.py: - White background.
	- Display "(None)" (or text of your choosing) when empty.
	- Don't set the focus.

Tue Mar  9 19:31:21 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	open_http also had the 'data is None' test backwards.  don't call with the
	extra argument if data is None.

	* Demo/embed/demo.c:
	Call Py_SetProgramName() instead of redefining getprogramname(),
	reflecting changes in the runtime around 1.5 or earlier.

	* Python/ceval.c:
	Always test for an error return (usually NULL or -1) without setting
	an exception.

	* Modules/timemodule.c: Patch by Chris Herborth for BeOS code.
	He writes:

	I had an off-by-1000 error in floatsleep(),
	and the problem with time.clock() is that it's not implemented properly
	on QNX... ANSI says it's supposed to return _CPU_ time used by the
	process, but on QNX it returns the amount of real time used... so I was
	confused.

	* Tools/bgen/bgen/macsupport.py: Small change by Jack Jansen.
	Test for self.returntype behaving like OSErr rather than being it.

Thu Feb 25 16:14:58 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	http_error had the 'data is None' test backwards.  don't call with the
	extra argument if data is None.

	* Lib/urllib.py: change indentation from 8 spaces to 4 spaces

	* Lib/urllib.py: pleasing the tabnanny

Thu Feb 25 14:26:02 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/colorsys.py:
	Oops, one more "x, y, z" to convert...

	* Lib/colorsys.py:
	Adjusted comment at the top to be less confusing, following Fredrik
	Lundh's example.

	Converted comment to docstring.

Wed Feb 24 18:49:15 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/toaiff.py:
	Use sndhdr instead of the obsolete whatsound module.

Wed Feb 24 18:42:38 1999  Jeremy Hylton  <jhylton@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	When performing a POST request, i.e. when the second argument to
	urlopen is used to specify form data, make sure the second argument is
	threaded through all of the http_error_NNN calls.  This allows error
	handlers like the redirect and authorization handlers to properly
	re-start the connection.

Wed Feb 24 16:25:17 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/mhlib.py: Patch by Lars Wirzenius:

		o the initial comment is wrong: creating messages is already
		  implemented

		o Message.getbodytext: if the mail or it's part contains an
		  empty content-transfer-encoding header, the code used to
		  break; the change below treats an empty encoding value the same
		  as the other types that do not need decoding

		o SubMessage.getbodytext was missing the decode argument; the
		  change below adds it; I also made it unconditionally return
		  the raw text if decoding was not desired, because my own
		  routines needed that (and it was easier than rewriting my
		  own routines ;-)

Wed Feb 24 00:35:43 1999  Barry Warsaw  <bwarsaw@eric.cnri.reston.va.us>

	* Python/bltinmodule.c (initerrors):
	Make sure that the exception tuples ("base-classes" when
	string-based exceptions are used) reflect the real class hierarchy,
	i.e. that SystemExit derives from Exception not StandardError.

	* Lib/exceptions.py:
	Document the correct class hierarchy for SystemExit.  It is not an
	error and so it derives from Exception and not SystemError.  The
	docstring was incorrect but the implementation was fine.

Tue Feb 23 23:07:51 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/shutil.py:
	Add import sys, needed by reference to sys.exc_info() in rmtree().
	Discovered by Mitch Chapman.

	* config.h.in:
	Now that we don't have AC_CHECK_LIB(m, pow), the HAVE_LIBM symbol
	disappears.  It wasn't used anywhere anyway...

	* Modules/arraymodule.c:
	Carefully check for overflow when allocating the memory for fromfile
	-- someone tried to pass in sys.maxint and got bitten by the bogus
	calculations.

	* configure.in:
	Get rid of AC_CHECK_LIB(m, pow) since this is taken care of later with
	LIBM (from --with-libm=...); this actually broke the customizability
	offered by the latter option.  Thanks go to Clay Spence for reporting
	this.

	* Lib/test/test_dl.py:
	1. Print the error message (carefully) when a dl.open() fails in verbose mode.
	2. When no test case worked, raise ImportError instead of failing.

	* Python/bltinmodule.c:
	Patch by Tim Peters to improve the range checks for range() and
	xrange(), especially for platforms where int and long are different
	sizes (so sys.maxint isn't actually the theoretical limit for the
	length of a list, but the largest C int is -- sys.maxint is the
	largest Python int, which is actually a C long).

	* Makefile.in:
	1. Augment the DG/UX rule so it doesn't break the BeOS build.
	2. Add $(EXE) to various occurrences of python so it will work on
	   Cygwin with egcs (after setting EXE=.exe).  These patches by
	   Norman Vine.

	* Lib/posixfile.py:
	According to Jeffrey Honig, bsd/os 2.0 - 4.0 should be added to the
	list (of bsd variants that have a different lock structure).

	* Lib/test/test_fcntl.py:
	According to Jeffrey Honig, bsd/os 4.0 should be added to the list.

	* Modules/timemodule.c:
	Patch by Tadayoshi Funaba (with some changes) to be smarter about
	guessing what happened when strftime() returns 0.  Is it buffer
	overflow or was the result simply 0 bytes long?  (This happens for an
	empty format string, or when the format string is a single %Z and the
	timezone is unknown.)  if the buffer is at least 256 times as long as
	the format, assume the latter.

Mon Feb 22 19:01:42 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urllib.py:
	As Des Barry points out, we need to call pathname2url(file) in two
	calls to addinfourl() in open_file().

	* Modules/Setup.in: Document *static* -- in two places!

	* Modules/timemodule.c:
	We don't support leap seconds, so the seconds field of a time 9-tuple
	should be in the range [0-59].  Noted by Tadayoshi Funaba.

	* Modules/stropmodule.c:
	In atoi(), don't use isxdigit() to test whether the last character
	converted was a "digit" -- use isalnum().  This test is there only to
	guard against "+" or "-" being interpreted as a valid int literal.
	Reported by Takahiro Nakayama.

	* Lib/os.py:
	As Finn Bock points out, _P_WAIT etc. don't have a leading underscore
	so they don't need to be treated specially here.

Mon Feb 22 15:38:58 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Misc/NEWS:
	Typo:  "apparentlt" --> "apparently"

Mon Feb 22 15:38:46 1999  Guido van Rossum  <guido@eric.cnri.reston.va.us>

	* Lib/urlparse.py: Steve Clift pointed out that 'file' allows a netloc.

	* Modules/posixmodule.c:
	The docstring for ttyname(..) claims a second "mode" argument. The
	actual code does not allow such an argument.  (Finn Bock.)

	* Lib/lib-old/poly.py:
	Dang.  Even though this is obsolete code, somebody found a bug, and I
	fix it.  Oh well.

Thu Feb 18 20:51:50 1999  Fred Drake  <fdrake@eric.cnri.reston.va.us>

	* Lib/pyclbr.py:
	Bow to font-lock at the end of the docstring, since it throws stuff
	off.

	Make sure the path paramter to readmodule() is a list before adding it
	with sys.path, or the addition could fail.


======================================================================


From 1.5.2b1 to 1.5.2b2
=======================

General
-------

- Many memory leaks fixed.

- Many small bugs fixed.

- Command line option -OO (or -O -O) suppresses inclusion of doc
strings in resulting bytecode.

Windows-specific changes
------------------------

- New built-in module winsound provides an interface to the Win32
PlaySound() call.

- Re-enable the audioop module in the config.c file.

- On Windows, support spawnv() and associated P_* symbols.

- Fixed the conversion of times() return values on Windows.

- Removed freeze from the installer -- it doesn't work without the
source tree.  (See FAQ 8.11.)

- On Windows 95/98, the Tkinter module now is smart enough to find
Tcl/Tk even when the PATH environment variable hasn't been set -- when
the import of _tkinter fails, it searches in a standard locations,
patches os.environ["PATH"], and tries again.  When it still fails, a
clearer error message is produced.  This should avoid most
installation problems with Tkinter use (e.g. in IDLE).

- The -i option doesn't make any calls to set[v]buf() for stdin --
this apparently screwed up _kbhit() and the _tkinter main loop.

- The ntpath module (and hence, os.path on Windows) now parses out UNC
paths (e.g. \\host\mountpoint\dir\file) as "drive letters", so that
splitdrive() will \\host\mountpoint as the drive and \dir\file as the
path.  ** EXPERIMENTAL **

- Added a hack to the exit code so that if (1) the exit status is
nonzero and (2) we think we have our own DOS box (i.e. we're not
started from a command line shell), we print a message and wait for
the user to hit a key before the DOS box is closed.

- Updated the installer to WISE 5.0g.  Added a dialog warning about
the imminent Tcl installation.  Added a dialog to specify the program
group name in the start menu.  Upgraded the Tcl installer to Tcl
8.0.4.

Changes to intrinsics
---------------------

- The repr() or str() of a module object now shows the __file__
attribute (i.e., the file which it was loaded), or the string
"(built-in)" if there is no __file__ attribute.

- The range() function now avoids overflow during its calculations (if
at all possible).

- New info string sys.hexversion, which is an integer encoding the
version in hexadecimal.  In other words, hex(sys.hexversion) ==
0x010502b2 for Python 1.5.2b2.

New or improved ports
---------------------

- Support for Nextstep descendants (future Mac systems).

- Improved BeOS support.

- Support dynamic loading of shared libraries on NetBSD platforms that 
use ELF (i.e., MIPS and Alpha systems).

Configuration/build changes
---------------------------

- The Lib/test directory is no longer included in the default module
search path (sys.path) -- "test" has been a package ever since 1.5.

- Now using autoconf 2.13.

New library modules
-------------------

- New library modules asyncore and asynchat: these form Sam Rushing's
famous asynchronous socket library.  Sam has gracefully allowed me to
incorporate these in the standard Python library.

- New module statvfs contains indexing constants for [f]statvfs()
return tuple.

Changes to the library
----------------------

- The wave module (platform-independent support for Windows sound
files) has been fixed to actually make it work.

- The sunau module (platform-independent support for Sun/NeXT sound
files) has been fixed to work across platforms.  Also, a weird
encoding bug in the header of the audio test data file has been
corrected.

- Fix a bug in the urllib module that occasionally tripped up
webchecker and other ftp retrieves.

- ConfigParser's get() method now accepts an optional keyword argument
(vars) that is substituted on top of the defaults that were setup in
__init__.  You can now also have recusive references in your
configuration file.

- Some improvements to the Queue module, including a put_nowait()
module and an optional "block" second argument, to get() and put(),
defaulting to 1.

- The updated xmllib module is once again compatible with the version
present in Python 1.5.1 (this was accidentally broken in 1.5.2b1).

- The bdb module (base class for the debugger) now supports
canonicalizing pathnames used in breakpoints.  The derived class must
override the new canonical() method for this to work.  Also changed
clear_break() to the backwards compatible old signature, and added
clear_bpbynumber() for the new functionality.

- In sgmllib (and hence htmllib), recognize attributes even if they
don't have space in front of them.  I.e.  '<a
name="foo"href="bar.html">' will now have two attributes recognized.

- In the debugger (pdb), change clear syntax to support three
alternatives: clear; clear file:line; clear bpno bpno ...

- The os.path module now pretends to be a submodule within the os
"package", so you can do things like "from os.path import exists".

- The standard exceptions now have doc strings.

- In the smtplib module, exceptions are now classes.  Also avoid
inserting a non-standard space after "TO" in rcpt() command.

- The rfc822 module's getaddrlist() method now uses all occurrences of
the specified header instead of just the first.  Some other bugfixes
too (to handle more weird addresses found in a very large test set,
and to avoid crashes on certain invalid dates), and a small test
module has been added.

- Fixed bug in urlparse in the common-case code for HTTP URLs; it
would lose the query, fragment, and/or parameter information.

- The sndhdr module no longer supports whatraw() -- it depended on a
rare extenral program.

- The UserList module/class now supports the extend() method, like
real list objects.

- The uu module now deals better with trailing garbage generated by
some broke uuencoders.

- The telnet module now has an my_interact() method which uses threads
instead of select.  The interact() method uses this by default on
Windows (where the single-threaded version doesn't work).

- Add a class to mailbox.py for dealing with qmail directory
mailboxes.  The test code was extended to notice these being used as
well.

Changes to extension modules
----------------------------

- Support for the [f]statvfs() system call, where it exists.

- Fixed some bugs in cPickle where bad input could cause it to dump
core.

- Fixed cStringIO to make the writelines() function actually work.

- Added strop.expandtabs() so string.expandtabs() is now much faster.

- Added fsync() and fdatasync(), if they appear to exist.

- Support for "long files" (64-bit seek pointers).

- Fixed a bug in the zlib module's flush() function.

- Added access() system call.  It returns 1 if access granted, 0 if
not.

- The curses module implements an optional nlines argument to
w.scroll().  (It then calls wscrl(win, nlines) instead of scoll(win).)

Changes to tools
----------------

- Some changes to IDLE; see Tools/idle/NEWS.txt.

- Latest version of Misc/python-mode.el included.

Changes to Tkinter
------------------

- Avoid tracebacks when an image is deleted after its root has been
destroyed.

Changes to the Python/C API
---------------------------

- When parentheses are used in a PyArg_Parse[Tuple]() call, any
sequence is now accepted, instead of requiring a tuple.  This is in
line with the general trend towards accepting arbitrary sequences.

- Added PyModule_GetFilename().

- In PyNumber_Power(), remove unneeded and even harmful test for float
to the negative power (which is already and better done in
floatobject.c).

- New version identification symbols; read patchlevel.h for info.  The
version numbers are now exported by Python.h.

- Rolled back the API version change -- it's back to 1007!

- The frozenmain.c function calls PyInitFrozenExtensions().

- Added 'N' format character to Py_BuildValue -- like 'O' but doesn't
INCREF.


======================================================================


From 1.5.2a2 to 1.5.2b1
=======================

Changes to intrinsics
---------------------

- New extension NotImplementedError, derived from RuntimeError.  Not
used, but recommended use is for "abstract" methods to raise this.

- The parser will now spit out a warning or error when -t or -tt is
used for parser input coming from a string, too.

- The code generator now inserts extra SET_LINENO opcodes when
compiling multi-line argument lists.

- When comparing bound methods, use identity test on the objects, not
equality test.

New or improved ports
---------------------

- Chris Herborth has redone his BeOS port; it now works on PowerPC
(R3/R4) and x86 (R4 only).  Threads work too in this port.

Renaming
--------

- Thanks to Chris Herborth, the thread primitives now have proper Py*
names in the source code (they already had those for the linker,
through some smart macros; but the source still had the old, un-Py
names).

Configuration/build changes
---------------------------

- Improved support for FreeBSD/3.

- Check for pthread_detach instead of pthread_create in libc.

- The makesetup script now searches EXECINCLUDEPY before INCLUDEPY.

- Misc/Makefile.pre.in now also looks at Setup.thread and Setup.local.
Otherwise modules such as thread didn't get incorporated in extensions.

New library modules
-------------------

- shlex.py by Eric Raymond provides a lexical analyzer class for
simple shell-like syntaxes.

- netrc.py by Eric Raymond provides a parser for .netrc files.  (The
undocumented Netrc class in ftplib.py is now obsolete.)

- codeop.py is a new module that contains the compile_command()
function that was previously in code.py.  This is so that JPython can
provide its own version of this function, while still sharing the
higher-level classes in code.py.

- turtle.py is a new module for simple turtle graphics.  I'm still
working on it; let me know if you use this to teach Python to children 
or other novices without prior programming experience.

Obsoleted library modules
-------------------------

- poly.py and zmod.py have been moved to Lib/lib-old to emphasize
their status of obsoleteness.  They don't do a particularly good job
and don't seem particularly relevant to the Python core.

New tools
---------

- I've added IDLE: my Integrated DeveLopment Environment for Python.
Requires Tcl/Tk (and Tkinter).  Works on Windows and Unix (and should
work on Macintosh, but I haven't been able to test it there; it does
depend on new features in 1.5.2 and perhaps even new features in
1.5.2b1, especially the new code module).  This is very much a work in
progress.  I'd like to hear how people like it compared to PTUI (or
any other IDE they are familiar with).

- New tools by Barry Warsaw:

  = audiopy: controls the Solaris Audio device
  = pynche:  The PYthonically Natural Color and Hue Editor
  = world:   Print mappings between country names and DNS country codes

New demos
---------

- Demo/scripts/beer.py prints the lyrics to an arithmetic drinking
song.

- Demo/tkinter/guido/optionmenu.py shows how to do an option menu in
Tkinter.  (By Fredrik Lundh -- not by me!)

Changes to the library
----------------------

- compileall.py now avoids recompiling .py files that haven't changed;
it adds a -f option to force recompilation.

- New version of xmllib.py by Sjoerd Mullender (0.2 with latest
patches).

- nntplib.py: statparse() no longer lowercases the message-id.

- types.py: use type(__stdin__) for FileType.

- urllib.py: fix translations for filenames with "funny" characters.
Patch by Sjoerd Mullender.  Note that if you subclass one of the
URLopener classes, and you have copied code from the old urllib.py,
your subclass may stop working.  A long-term solution is to provide
more methods so that you don't have to copy code.

- cgi.py: In read_multi, allow a subclass to override the class we
instantiate when we create a recursive instance, by setting the class
variable 'FieldStorageClass' to the desired class.  By default, this
is set to None, in which case we use self.__class__ (as before).
Also, a patch by Jim Fulton to pass additional arguments to recursive
calls to the FieldStorage constructor from its read_multi method.

- UserList.py: In __getslice__, use self.__class__ instead of
UserList.

- In SimpleHTTPServer.py, the server specified in test() should be
BaseHTTPServer.HTTPServer, in case the request handler should want to
reference the two attributes added by BaseHTTPServer.server_bind.  (By
Jeff Rush, for Bobo).  Also open the file in binary mode, so serving
images from a Windows box might actually work.

- In CGIHTTPServer.py, the list of acceptable formats is -split-
on spaces but -joined- on commas, resulting in double commas
in the joined text.  (By Jeff Rush.)

- SocketServer.py, patch by Jeff Bauer: a minor change to declare two
new threaded versions of Unix Server classes, using the ThreadingMixIn
class: ThreadingUnixStreamServer, ThreadingUnixDatagramServer.

- bdb.py: fix bomb on deleting a temporary breakpoint: there's no
method do_delete(); do_clear() was meant.  By Greg Ward.

- getopt.py: accept a non-list sequence for the long options (request
by Jack Jansen).  Because it might be a common mistake to pass a
single string, this situation is treated separately.  Also added
docstrings (copied from the library manual) and removed the (now
redundant) module comments.

- tempfile.py: improvements to avoid security leaks.

- code.py: moved compile_command() to new module codeop.py.

- pickle.py: support pickle format 1.3 (binary float added).  By Jim
Fulton. Also get rid of the undocumented obsolete Pickler dump_special
method.

- uu.py: Move 'import sys' to top of module, as noted by Tim Peters.

- imaplib.py: fix problem with some versions of IMAP4 servers that
choose to mix the case in their CAPABILITIES response.

- cmp.py: use (f1, f2) as cache key instead of f1 + ' ' + f2.  Noted
by Fredrik Lundh.

Changes to extension modules
----------------------------

- More doc strings for several modules were contributed by Chris
Petrilli: math, cmath, fcntl.

- Fixed a bug in zlibmodule.c that could cause core dumps on
decompression of rarely occurring input.

- cPickle.c: new version from Jim Fulton, with Open Source copyright
notice.  Also, initialize self->safe_constructors early on to prevent
crash in early dealloc.

- cStringIO.c: new version from Jim Fulton, with Open Source copyright
notice.  Also fixed a core dump in cStringIO.c when doing seeks.

- mpzmodule.c: fix signed character usage in mpz.mpz(stringobjecty).

- readline.c: Bernard Herzog pointed out that rl_parse_and_bind
modifies its argument string (bad function!), so we make a temporary
copy.

- sunaudiodev.c: Barry Warsaw added more smarts to get the device and
control pseudo-device, per audio(7I).

Changes to tools
----------------

- New, improved version of Barry Warsaw's Misc/python-mode.el (editing 
support for Emacs).

- tabnanny.py: added a -q ('quiet') option to tabnanny, which causes
only the names of offending files to be printed.

- freeze: when printing missing modules, also print the module they
were imported from.

- untabify.py: patch by Detlef Lannert to implement -t option
(set tab size).

Changes to Tkinter
------------------

- grid_bbox(): support new Tk API: grid bbox ?column row? ?column2
row2?

- _tkinter.c: RajGopal Srinivasan noted that the latest code (1.5.2a2)
doesn't work when running in a non-threaded environment.  He added
some #ifdefs that fix this.

Changes to the Python/C API
---------------------------

- Bumped API version number to 1008 -- enough things have changed!

- There's a new macro, PyThreadState_GET(), which does the same work
as PyThreadState_Get() without the overhead of a function call (it
also avoids the error check).  The two top calling locations of
PyThreadState_Get() have been changed to use this macro.

- All symbols intended for export from a DLL or shared library are now
marked as such (with the DL_IMPORT() macro) in the header file that
declares them.  This was needed for the BeOS port, and should also
make some other ports easier.  The PC port no longer needs the file
with exported symbols (PC/python_nt.def).  There's also a DL_EXPORT
macro which is only used for init methods in extension modules, and
for Py_Main().

Invisible changes to internals
------------------------------

- Fixed a bug in new_buffersize() in fileobject.c which could
return a buffer size that was way too large.

- Use PySys_WriteStderr instead of fprintf in most places.

- dictobject.c: remove dead code discovered by Vladimir Marangozov.

- tupleobject.c: make tuples less hungry -- an extra item was
allocated but never used.  Tip by Vladimir Marangozov.

- mymath.h: Metrowerks PRO4 finally fixes the hypot snafu.  (Jack
Jansen)

- import.c: Jim Fulton fixes a reference count bug in
PyEval_GetGlobals.

- glmodule.c: check in the changed version after running the stubber
again -- this solves the conflict with curses over the 'clear' entry
point much nicer.  (Jack Jansen had checked in the changes to cstubs
eons ago, but I never regenrated glmodule.c :-( )

- frameobject.c: fix reference count bug in PyFrame_New.  Vladimir
Marangozov.

- stropmodule.c: add a missing DECREF in an error exit.  Submitted by
Jonathan Giddy.


======================================================================


From 1.5.2a1 to 1.5.2a2
=======================

General
-------

- It is now a syntax error to have a function argument without a
default following one with a default.

- __file__ is now set to the .py file if it was parsed (it used to
always be the .pyc/.pyo file).

- Don't exit with a fatal error during initialization when there's a
problem with the exceptions.py module.

- New environment variable PYTHONOPTIMIZE can be used to set -O.

- New version of python-mode.el for Emacs.

Miscellaneous fixed bugs
------------------------

- No longer print the (confusing) error message about stack underflow
while compiling.

- Some threading and locking bugs fixed.

- When errno is zero, report "Error", not "Success".

Documentation
-------------

- Documentation will be released separately.

- Doc strings added to array and md5 modules by Chris Petrilli.

Ports and build procedure
-------------------------

- Stop installing when a move or copy fails.

- New version of the OS/2 port code by Jeff Rush.

- The makesetup script handles absolute filenames better.

- The 'new' module is now enabled by default in the Setup file.

- I *think* I've solved the problem with the Linux build blowing up
sometimes due to a conflict between sigcheck/intrcheck and
signalmodule.

Built-in functions
------------------

- The second argument to apply() can now be any sequence, not just a
tuple.

Built-in types
--------------

- Lists have a new method: L1.extend(L2) is equivalent to the common
idiom L1[len(L1):] = L2.

- Better error messages when a sequence is indexed with a non-integer.

- Bettter error message when calling a non-callable object (include
the type in the message).

Python services
---------------

- New version of cPickle.c fixes some bugs.

- pickle.py: improved instantiation error handling.

- code.py: reworked quite a bit.  New base class
InteractiveInterpreter and derived class InteractiveConsole.  Fixed
several problems in compile_command().

- py_compile.py: print error message and continue on syntax errors.
Also fixed an old bug with the fstat code (it was never used).

- pyclbr.py: support submodules of packages.

String Services
---------------

- StringIO.py: raise the right exception (ValueError) for attempted
I/O on closed StringIO objects.

- re.py: fixed a bug in subn(), which caused .groups() to fail inside
the replacement function called by sub().

- The struct module has a new format 'P': void * in native mode.

Generic OS Services
-------------------

- Module time: Y2K robustness.  2-digit year acceptance depends on
value of time.accept2dyear, initialized from env var PYTHONY2K,
default 0.  Years 00-68 mean 2000-2068, while 69-99 mean 1969-1999
(POSIX or X/Open recommendation).

- os.path: normpath(".//x") should return "x", not "/x".

- getpass.py: fall back on default_getpass() when sys.stdin.fileno()
doesn't work.

- tempfile.py: regenerate the template after a fork() call.

Optional OS Services
--------------------

- In the signal module, disable restarting interrupted system calls
when we have siginterrupt().

Debugger
--------

- No longer set __args__; this feature is no longer supported and can
affect the debugged code.

- cmd.py, pdb.py and bdb.py have been overhauled by Richard Wolff, who
added aliases and some other useful new features, e.g. much better
breakpoint support: temporary breakpoint, disabled breakpoints,
breakpoints with ignore counts, and conditions; breakpoints can be set
on a file before it is loaded.

Profiler
--------

- Changes so that JPython can use it.  Also fix the calibration code
so it actually works again
.
Internet Protocols and Support
------------------------------

- imaplib.py: new version from Piers Lauder.

- smtplib.py: change sendmail() method to accept a single string or a
list or strings as the destination (commom newbie mistake).

- poplib.py: LIST with a msg argument fixed.

- urlparse.py: some optimizations for common case (http).

- urllib.py: support content-length in info() for ftp protocol;
support for a progress meter through a third argument to
urlretrieve(); commented out gopher test (the test site is dead).

Internet Data handling
----------------------

- sgmllib.py: support tags with - or . in their name.

- mimetypes.py: guess_type() understands 'data' URLs.

Restricted Execution
--------------------

- The classes rexec.RModuleLoader and rexec.RModuleImporter no
longer exist.

Tkinter
-------

- When reporting an exception, store its info in sys.last_*.  Also,
write all of it to stderr.

- Added NS, EW, and NSEW constants, for grid's sticky option.

- Fixed last-minute bug in 1.5.2a1 release: need to include "mytime.h".

- Make bind variants without a sequence return a tuple of sequences
(formerly it returned a string, which wasn't very convenient).

- Add image commands to the Text widget (these are new in Tk 8.0).

- Added new listbox and canvas methods: {xview,yview}_{scroll,moveto}.)

- Improved the thread code (but you still can't call update() from
another thread on Windows).

- Fixed unnecessary references to _default_root in the new dialog
modules.

- Miscellaneous problems fixed.


Windows General
---------------

- Call LoadLibraryEx(..., ..., LOAD_WITH_ALTERED_SEARCH_PATH) to
search for dependent dlls in the directory containing the .pyd.

- In debugging mode, call DebugBreak() in Py_FatalError().

Windows Installer
-----------------

- Install zlib.dll in the DLLs directory instead of in the win32
system directory, to avoid conflicts with other applications that have 
their own zlib.dll.

Test Suite
----------

- test_long.py: new test for long integers, by Tim Peters.

- regrtest.py: improved so it can be used for other test suites as
well.

- test_strftime.py: use re to compare test results, to support legal
variants (e.g. on Linux).

Tools and Demos
---------------

- Four new scripts in Tools/scripts: crlf.py and lfcr.py (to
remove/add Windows style '\r\n' line endings), untabify.py (to remove
tabs), and rgrep.yp (reverse grep).

- Improvements to Tools/freeze/.  Each Python module is now written to
its own C file.  This prevents some compilers or assemblers from
blowing up on large frozen programs, and saves recompilation time if
only a few modules are changed.  Other changes too, e.g. new command
line options -x and -i.

- Much improved (and smaller!) version of Tools/scripts/mailerdaemon.py.

Python/C API
------------

- New mechanism to support extensions of the type object while
remaining backward compatible with extensions compiled for previous
versions of Python 1.5.  A flags field indicates presence of certain
fields.

- Addition to the buffer API to differentiate access to bytes and
8-bit characters (in anticipation of Unicode characters).

- New argument parsing format t# ("text") to indicate 8-bit
characters; s# simply means 8-bit bytes, for backwards compatibility.

- New object type, bufferobject.c is an example and can be used to
create buffers from memory.

- Some support for 64-bit longs, including some MS platforms.

- Many calls to fprintf(stderr, ...) have been replaced with calls to
PySys_WriteStderr(...).

- The calling context for PyOS_Readline() has changed: it must now be
called with the interpreter lock held!  It releases the lock around
the call to the function pointed to by PyOS_ReadlineFunctionPointer
(default PyOS_StdioReadline()).

- New APIs PyLong_FromVoidPtr() and PyLong_AsVoidPtr().

- Renamed header file "thread.h" to "pythread.h".

- The code string of code objects may now be anything that supports the
buffer API.


======================================================================


From 1.5.1 to 1.5.2a1
=====================

General
-------

- When searching for the library, a landmark that is a compiled module
(string.pyc or string.pyo) is also accepted.

- When following symbolic links to the python executable, use a loop
so that a symlink to a symlink can work.

- Added a hack so that when you type 'quit' or 'exit' at the
interpreter, you get a friendly explanation of how to press Ctrl-D (or 
Ctrl-Z) to exit.

- New and improved Misc/python-mode.el (Python mode for Emacs).

- Revert a new feature in Unix dynamic loading: for one or two
revisions, modules were loaded using the RTLD_GLOBAL flag.  It turned
out to be a bad idea.

Miscellaneous fixed bugs
------------------------

- All patches on the patch page have been integrated.  (But much more
has been done!)

- Several memory leaks plugged (e.g. the one for classes with a
__getattr__ method).

- Removed the only use of calloc().  This triggered an obscure bug on
multiprocessor Sparc Solaris 2.6.

- Fix a peculiar bug that would allow "import sys.time" to succeed
(believing the built-in time module to be a part of the sys package).

- Fix a bug in the overflow checking when converting a Python long to
a C long (failed to convert -2147483648L, and some other cases).

Documentation
-------------

- Doc strings have been added to many extension modules: __builtin__,
errno, select, signal, socket, sys, thread, time.  Also to methods of
list objects (try [].append.__doc__).  A doc string on a type will now
automatically be propagated to an instance if the instance has methods
that are accessed in the usual way.

- The documentation has been expanded and the formatting improved.
(Remember that the documentation is now unbundled and has its own
release cycle though; see http://www.python.org/doc/.)

- Added Misc/Porting -- a mini-FAQ on porting to a new platform.

Ports and build procedure
-------------------------

- The BeOS port is now integrated.  Courtesy Chris Herborth.

- Symbol files for FreeBSD 2.x and 3.x have been contributed
(Lib/plat-freebsd[23]/*).

- Support HPUX 10.20 DCE threads.

- Finally fixed the configure script so that (on SGI) if -OPT:Olimit=0
works, it won't also use -Olimit 1500 (which gives a warning for every
file).  Also support the SGI_ABI environment variable better.

- The makesetup script now understands absolute pathnames ending in .o
in the module -- it assumes it's a file for which we have no source.

- Other miscellaneous improvements to the configure script and
Makefiles.

- The test suite now uses a different sound sample.

Built-in functions
------------------

- Better checks for invalid input to int(), long(), string.atoi(),
string.atol().  (Formerly, a sign without digits would be accepted as
a legal ways to spell zero.)

- Changes to map() and filter() to use the length of a sequence only
as a hint -- if an IndexError happens earlier, take that.  (Formerly,
this was considered an error.)

- Experimental feature in getattr(): a third argument can specify a
default (instead of raising AttributeError).

- Implement round() slightly different, so that for negative ndigits
no additional errors happen in the last step.

- The open() function now adds the filename to the exception when it
fails.

Built-in exceptions
-------------------

- New standard exceptions EnvironmentError and PosixError.
EnvironmentError is the base class for IOError and PosixError;
PosixError is the same as os.error.  All this so that either exception
class can be instantiated with a third argument indicating a filename.
The built-in function open() and most os/posix functions that take a
filename argument now use this.

Built-in types
--------------

- List objects now have an experimental pop() method; l.pop() returns
and removes the last item; l.pop(i) returns and removes the item at
i.  Also, the sort() method is faster again.  Sorting is now also
safer: it is impossible for the sorting function to modify the list
while the sort is going on (which could cause core dumps).

- Changes to comparisons: numbers are now smaller than any other type.
This is done to prevent the circularity where [] < 0L < 1 < [] is
true.  As a side effect, cmp(None, 0) is now positive instead of
negative.  This *shouldn't* affect any working code, but I've found
that the change caused several "sleeping" bugs to become active, so
beware!

- Instance methods may now have other callable objects than just
Python functions as their im_func.  Use new.instancemethod() or write
your own C code to create them; new.instancemethod() may be called
with None for the instance to create an unbound method.

- Assignment to __name__, __dict__ or __bases__ of a class object is
now allowed (with stringent type checks); also allow assignment to
__getattr__ etc.  The cached values for __getattr__ etc. are
recomputed after such assignments (but not for derived classes :-( ).

- Allow assignment to some attributes of function objects: func_code,
func_defaults and func_doc / __doc__.  (With type checks except for
__doc__ / func_doc .)

Python services
---------------

- New tests (in Lib/test): reperf.py (regular expression benchmark),
sortperf.py (list sorting benchmark), test_MimeWriter.py (test case
for the MimeWriter module).

- Generalized test/regrtest.py so that it is useful for testing other
packages.

- The ihooks.py module now understands package imports.

- In code.py, add a class that subsumes Fredrik Lundh's
PythonInterpreter class.  The interact() function now uses this.

- In rlcompleter.py, in completer(), return None instead of raising an
IndexError when there are no more completions left.

- Fixed the marshal module to test for certain common kinds of invalid
input.  (It's still not foolproof!)

- In the operator module, add an alias (now the preferred name)
"contains" for "sequenceincludes".

String Services
---------------

- In the string and strop modules, in the replace() function, treat an
empty pattern as an error (since it's not clear what was meant!).

- Some speedups to re.py, especially the string substitution and split
functions.  Also added new function/method findall(), to find all
occurrences of a given substring.

- In cStringIO, add better argument type checking and support the
readonly 'closed' attribute (like regular files).

- In the struct module, unsigned 1-2 byte sized formats no longer
result in long integer values.

Miscellaneous services
----------------------

- In whrandom.py, added new method and function randrange(), same as
choice(range(start, stop, step)) but faster.  This addresses the
problem that randint() was accidentally defined as taking an inclusive
range.  Also, randint(a, b) is now redefined as randrange(a, b+1),
adding extra range and type checking to its arguments!

- Add some semi-thread-safety to random.gauss() (it used to be able to 
crash when invoked from separate threads; now the worst it can do is
give a duplicate result occasionally).

- Some restructuring and generalization done to cmd.py.

- Major upgrade to ConfigParser.py; converted to using 're', added new 
exceptions, support underscore in section header and option name.  No
longer add 'name' option to every section; instead, add '__name__'.

- In getpass.py, don't use raw_input() to ask for the password -- we
don't want it to show up in the readline history!  Also don't catch
interrupts (the try-finally already does all necessary cleanup).

Generic OS Services
-------------------

- New functions in os.py: makedirs(), removedirs(), renames().  New
variable: linesep (the line separator as found in binary files,
i.e. '\n' on Unix, '\r\n' on DOS/Windows, '\r' on Mac.  Do *not* use
this with files opened in (default) text mode; the line separator used
will always be '\n'!

- Changes to the 'os.path' submodule of os.py: added getsize(),
getmtime(), getatime() -- these fetch the most popular items from the
stat return tuple.

- In the time module, add strptime(), if it exists.  (This parses a
time according to a format -- the inverse of strftime().)  Also,
remove the call to mktime() from strftime() -- it messed up the
formatting of some non-local times.

- In the socket module, added a new function gethostbyname_ex().
Also, don't use #ifdef to test for some symbols that are enums on some
platforms (and should exist everywhere).

Optional OS Services
--------------------

- Some fixes to gzip.py.  In particular, the readlines() method now
returns the lines *with* trailing newline characters, like readlines()
of regular file objects.  Also, it didn't work together with cPickle;
fixed that.

- In whichdb.py, support byte-swapped dbhash (bsddb) files.

- In anydbm.py, look at the type of an existing database to determine
which module to use to open it.  (The anydbm.error exception is now a
tuple.)

Unix Services
-------------

- In the termios module, in tcsetattr(), initialize the structure vy
calling tcgetattr().

- Added some of the "wait status inspection" macros as functions to
the posix module (and thus to the os module): WEXITSTATUS(),
WIFEXITED(), WIFSIGNALED(), WIFSTOPPED(), WSTOPSIG(), WTERMSIG().

- In the syslog module, make the default facility more intuitive
(matching the docs).

Debugger
--------

- In pdb.py, support for setting breaks on files/modules that haven't
been loaded yet.

Internet Protocols and Support
------------------------------

- Changes in urllib.py; sped up unquote() and quote().  Fixed an
obscure bug in quote_plus().  Added urlencode(dict) -- convenience
function for sending a POST request with urlopen().  Use the getpass
module to ask for a password.  Rewrote the (test) main program so that
when used as a script, it can retrieve one or more URLs to stdout.
Use -t to run the self-test.  Made the proxy code work again.

- In cgi.py, treat "HEAD" the same as "GET", so that CGI scripts don't
fail when someone asks for their HEAD.  Also, for POST, set the
default content-type to application/x-www-form-urlencoded.  Also, in
FieldStorage.__init__(), when method='GET', always get the query
string from environ['QUERY_STRING'] or sys.argv[1] -- ignore an
explicitly passed in fp.

- The smtplib.py module now supports ESMTP and has improved standard
compliance, for picky servers.

- Improved imaplib.py.

- Fixed UDP support in SocketServer.py (it never worked).

- Fixed a small bug in CGIHTTPServer.py.

Internet Data handling
----------------------

- In rfc822.py, add a new class AddressList.  Also support a new
overridable method, isheader().  Also add a get() method similar to
dictionaries (and make getheader() an alias for it).  Also, be smarter
about seekable (test whether fp.tell() works) and test for presence of
unread() method before trying seeks.

- In sgmllib.py, restore the call to report_unbalanced() that was lost
long ago.  Also some other improvements: handle <? processing
instructions >, allow . and - in entity names, and allow \r\n as line
separator.

- Some restructuring and generalization done to multifile.py; support
a 'seekable' flag.

Restricted Execution
--------------------

- Improvements to rexec.py: package support; support a (minimal)
sys.exc_info().  Also made the (test) main program a bit fancier (you
can now use it to run arbitrary Python scripts in restricted mode).

Tkinter
-------

- On Unix, Tkinter can now safely be used from a multi-threaded
application.  (Formerly, no threads would make progress while
Tkinter's mainloop() was active, because it didn't release the Python
interpreter lock.)  Unfortunately, on Windows, threads other than the
main thread should not call update() or update_idletasks() because
this will deadlock the application.

- An interactive interpreter that uses readline and Tkinter no longer
uses up all available CPU time.

- Even if readline is not used, Tk windows created in an interactive
interpreter now get continuously updated.  (This even works in Windows
as long as you don't hit a key.)

- New demos in Demo/tkinter/guido/: brownian.py, redemo.py, switch.py.

- No longer register Tcl_finalize() as a low-level exit handler.  It
may call back into Python, and that's a bad idea.

- Allow binding of Tcl commands (given as a string).

- Some minor speedups; replace explicitly coded getint() with int() in
most places.

- In FileDialog.py, remember the directory of the selected file, if
given.

- Change the names of all methods in the Wm class: they are now
wm_title(), etc.  The old names (title() etc.) are still defined as
aliases.

- Add a new method of interpreter objects, interpaddr().  This returns
the address of the Tcl interpreter object, as an integer.  Not very
useful for the Python programmer, but this can be called by another C
extension that needs to make calls into the Tcl/Tk C API and needs to
get the address of the Tcl interpreter object.  A simple cast of the
return value to (Tcl_Interp *) will do the trick.

Windows General
---------------

- Don't insist on proper case for module source files if the filename
is all uppercase (e.g. FOO.PY now matches foo; but FOO.py still
doesn't).  This should address problems with this feature on
oldfashioned filesystems (Novell servers?).

Windows Library
---------------

- os.environ is now all uppercase, but accesses are case insensitive,
and the putenv() calls made as a side effect of changing os.environ
are case preserving.

- Removed samefile(), sameopenfile(), samestat() from os.path (aka
ntpath.py) -- these cannot be made to work reliably (at least I
wouldn't know how).

- Fixed os.pipe() so that it returns file descriptors acceptable to
os.read() and os.write() (like it does on Unix), rather than Windows
file handles.

- Added a table of WSA error codes to socket.py.

- In the select module, put the (huge) file descriptor arrays on the
heap.

- The getpass module now raises KeyboardInterrupt when it sees ^C.

- In mailbox.py, fix tell/seek when using files opened in text mode.

- In rfc822.py, fix tell/seek when using files opened in text mode.

- In the msvcrt extension module, release the interpreter lock for
calls that may block: _locking(), _getch(), _getche().  Also fix a
bogus error return when open_osfhandle() doesn't have the right
argument list.

Windows Installer
-----------------

- The registry key used is now "1.5" instead of "1.5.x" -- so future
versions of 1.5 and Mark Hammond's win32all installer don't need to be 
resynchronized.

Windows Tools
-------------

- Several improvements to freeze specifically for Windows.

Windows Build Procedure
-----------------------

- The VC++ project files and the WISE installer have been moved to the
PCbuild subdirectory, so they are distributed in the same subdirectory
where they must be used.  This avoids confusion.

- New project files for Windows 3.1 port by Jim Ahlstrom.

- Got rid of the obsolete subdirectory PC/setup_nt/.

- The projects now use distinct filenames for the .exe, .dll, .lib and
.pyd files built in debug mode (by appending "_d" to the base name,
before the extension).  This makes it easier to switch between the two
and get the right versions.  There's a pragma in config.h that directs
the linker to include the appropriate .lib file (so python15.lib no
longer needs to be explicit in your project).

- The installer now installs more files (e.g. config.h).  The idea is
that you shouldn't need the source distribution if you want build your
own extensions in C or C++.

Tools and Demos
---------------

- New script nm2def.py by Marc-Andre Lemburg, to construct
PC/python_nt.def automatically (some hand editing still required).

- New tool ndiff.py: Tim Peters' text diffing tool.

- Various and sundry improvements to the freeze script.

- The script texi2html.py (which was part of the Doc tree but is no
longer used there) has been moved to the Tools/scripts subdirectory.

- Some generalizations in the webchecker code.  There's now a
primnitive gui for websucker.py: wsgui.py.  (In Tools/webchecker/.)

- The ftpmirror.py script now handles symbolic links properly, and
also files with multiple spaces in their names.

- The 1.5.1 tabnanny.py suffers an assert error if fed a script whose
last line is both indented and lacks a newline.  This is now fixed.

Python/C API
------------

- Added missing prototypes for PyEval_CallFunction() and
PyEval_CallMethod().

- New macro PyList_SET_ITEM().

- New macros to access object members for PyFunction, PyCFunction
objects.

- New APIs PyImport_AppendInittab() an PyImport_ExtendInittab() to
dynamically add one or many entries to the table of built-in modules.

- New macro Py_InitModule3(name, methods, doc) which calls
Py_InitModule4() with appropriate arguments.  (The -4 variant requires 
you to pass an obscure version number constant which is always the same.)

- New APIs PySys_WriteStdout() and PySys_WriteStderr() to write to
sys.stdout or sys.stderr using a printf-like interface.  (Used in
_tkinter.c, for example.)

- New APIs for conversion between Python longs and C 'long long' if
your compiler supports it.

- PySequence_In() is now called PySequence_Contains().
(PySequence_In() is still supported for b/w compatibility; it is
declared obsolete because its argument order is confusing.)

- PyDict_GetItem() and PyDict_GetItemString() are changed so that they
*never* raise an exception -- (even if the hash() fails, simply clear
the error).  This was necessary because there is lots of code out
there that already assumes this.

- Changes to PySequence_Tuple() and PySequence_List() to use the
length of a sequence only as a hint -- if an IndexError happens
earlier, take that.  (Formerly, this was considered an error.)

- Reformatted abstract.c to give it a more familiar "look" and fixed
many error checking bugs.

- Add NULL pointer checks to all calls of a C function through a type
object and extensions (e.g. nb_add).

- The code that initializes sys.path now calls Py_GetPythonHome()
instead of getenv("PYTHONHOME").  This, together with the new API
Py_SetPythonHome(), makes it easier for embedding applications to
change the notion of Python's "home" directory (where the libraries
etc. are sought).

- Fixed a very old bug in the parsing of "O?" format specifiers.


======================================================================
