diff --git a/Misc/HISTORY b/Misc/HISTORY
index 82c4b31..e06974e 100644
--- a/Misc/HISTORY
+++ b/Misc/HISTORY
@@ -5,6 +5,663 @@
 (slightly edited to adapt them to the format of this file).  As you
 read on you go back to the dark ages of Python's history.
 
+
+====================================
+==> Release 1.0.3 (14 July 1994) <==
+====================================
+
+This release consists entirely of bug fixes to the C sources; see the
+head of ../ChangeLog for a complete list.  Most important bugs fixed:
+
+- Sometimes the format operator (string%expr) would drop the last
+character of the format string
+
+- Tokenizer looped when last line did not end in \n
+
+- Bug when triple-quoted string ended in quote plus newline
+
+- Typo in socketmodule (listen) (== instead of =)
+
+- typing vars() at the >>> prompt would cause recursive output
+
+
+==================================
+==> Release 1.0.2 (4 May 1994) <==
+==================================
+
+Overview of the most visible changes.  Bug fixes are not listed.  See
+also ChangeLog.
+
+Tokens
+------
+
+* String literals follow Standard C rules: they may be continued on
+the next line using a backslash; adjacent literals are concatenated
+at compile time.
+
+* A new kind of string literals, surrounded by triple quotes (""" or
+'''), can be continued on the next line without a backslash.
+
+Syntax
+------
+
+* Function arguments may have a default value, e.g. def f(a, b=1);
+defaults are evaluated at function definition time.  This also applies
+to lambda.
+
+* The try-except statement has an optional else clause, which is
+executed when no exception occurs in the try clause.
+
+Interpreter
+-----------
+
+* The result of a statement-level expression is no longer printed,
+except_ for expressions entered interactively.  Consequently, the -k
+command line option is gone.
+
+* The result of the last printed interactive expression is assigned to
+the variable '_'.
+
+* Access to implicit global variables has been speeded up by removing
+an always-failing dictionary lookup in the dictionary of local
+variables (mod suggested by Steve Makewski and Tim Peters).
+
+* There is a new command line option, -u, to force stdout and stderr
+to be unbuffered.
+
+* Incorporated Steve Majewski's mods to import.c for dynamic loading
+under AIX.
+
+* Fewer chances of dumping core when trying to reload or re-import
+static built-in, dynamically loaded built-in, or frozen modules.
+
+* Loops over sequences now don't ask for the sequence's length when
+they start, but try to access items 0, 1, 2, and so on until they hit
+an IndexError.  This makes it possible to create classes that generate
+infinite or indefinite sequences a la Steve Majewski.  This affects
+for loops, the (not) in operator, and the built-in functions filter(),
+map(), max(), min(), reduce().
+
+Changed Built-in operations
+---------------------------
+
+* The '%' operator on strings (printf-style formatting) supports a new
+feature (adapted from a patch by Donald Beaudry) to allow
+'%(<key>)<format>' % {...} to take values from a dictionary by name
+instead of from a tuple by position (see also the new function
+vars()).
+
+* The '%s' formatting operator is changed to accept any type and
+convert it to a string using str().
+
+* Dictionaries with more than 20,000 entries can now be created
+(thanks to Steve Kirsch).
+
+New Built-in Functions
+----------------------
+
+* vars() returns a dictionary containing the local variables; vars(m)
+returns a dictionary containing the variables of module m.  Note:
+dir(x) is now equivalent to vars(x).keys().
+
+Changed Built-in Functions
+--------------------------
+
+* open() has an optional third argument to specify the buffer size: 0
+for unbuffered, 1 for line buffered, >1 for explicit buffer size, <0
+for default.
+
+* open()'s second argument is now optional; it defaults to "r".
+
+* apply() now checks that its second argument is indeed a tuple.
+
+New Built-in Modules
+--------------------
+
+Changed Built-in Modules
+------------------------
+
+The thread module no longer supports exit_prog().
+
+New Python Modules
+------------------
+
+* Module addpack contains a standard interface to modify sys.path to
+find optional packages (groups of related modules).
+
+* Module urllib contains a number of functions to access
+World-Wide-Web files specified by their URL.
+
+* Module httplib implements the client side of the HTTP protocol used
+by World-Wide-Web servers.
+
+* Module gopherlib implements the client side of the Gopher protocol.
+
+* Module mailbox (by Jack Jansen) contains a parser for UNIX and MMDF
+style mailbox files.
+
+* Module random contains various random distributions, e.g. gauss().
+
+* Module lockfile locks and unlocks open files using fcntl (inspired
+by a similar module by Andy Bensky).
+
+* Module ntpath (by Jaap Vermeulen) implements path operations for
+Windows/NT.
+
+* Module test_thread (in Lib/test) contains a small test set for the
+thread module.
+
+Changed Python Modules
+----------------------
+
+* The string module's expandvars() function is now documented and is
+implemented in Python (using regular expressions) instead of forking
+off a shell process.
+
+* Module rfc822 now supports accessing the header fields using the
+mapping/dictionary interface, e.g. h['subject'].
+
+* Module pdb now makes it possible to set a break on a function
+(syntax: break <expression>, where <expression> yields a function
+object).
+
+Changed Demos
+-------------
+
+* The Demo/scripts/freeze.py script is working again (thanks to Jaap
+Vermeulen).
+
+New Demos
+---------
+
+* Demo/threads/Generator.py is a proposed interface for restartable
+functions a la Tim Peters.
+
+* Demo/scripts/newslist.py, by Quentin Stafford-Fraser, generates a
+directory full of HTML pages which between them contain links to all
+the newsgroups available on your server.
+
+* Demo/dns contains a DNS (Domain Name Server) client.
+
+* Demo/lutz contains miscellaneous demos by Mark Lutz (e.g. psh.py, a
+nice enhanced Python shell!!!).
+
+* Demo/turing contains a Turing machine by Amrit Prem.
+
+Documentation
+-------------
+
+* Documented new language features mentioned above (but not all new
+modules).
+
+* Added a chapter to the Tutorial describing recent additions to
+Python.
+
+* Clarified some sentences in the reference manual,
+e.g. break/continue, local/global scope, slice assignment.
+
+Source Structure
+----------------
+
+* Moved Include/tokenizer.h to Parser/tokenizer.h.
+
+* Added Python/getopt.c for systems that don't have it.
+
+Emacs mode
+----------
+
+* Indentation of continuated lines is done more intelligently;
+consequently the variable py-continuation-offset is gone.
+
+========================================
+==> Release 1.0.1 (15 February 1994) <==
+========================================
+
+* Many portability fixes should make it painless to build Python on
+several new platforms, e.g. NeXT, SEQUENT, WATCOM, DOS, and Windows.
+
+* Fixed test for <stdarg.h> -- this broke on some platforms.
+
+* Fixed test for shared library dynalic loading -- this broke on SunOS
+4.x using the GNU loader.
+
+* Changed order and number of SVR4 networking libraries (it is now
+-lsocket -linet -lnsl, if these libraries exist).
+
+* Installing the build intermediate stages with "make libainstall" now
+also installs config.c.in, Setup and makesetup, which are used by the
+new Extensions mechanism.
+
+* Improved README file contains more hints and new troubleshooting
+section.
+
+* The built-in module strop now defines fast versions of three more
+functions of the standard string module: atoi(), atol() and atof().
+The strop versions of atoi() and atol() support an optional second
+argument to specify the base (default 10).  NOTE: you don't have to
+explicitly import strop to use the faster versions -- the string
+module contains code to let versions from stop override the default
+versions.
+
+* There is now a working Lib/dospath.py for those who use Python under
+DOS (or Windows).  Thanks, Jaap!
+
+* There is now a working Modules/dosmodule.c for DOS (or Windows)
+system calls.
+
+* Lib.os.py has been reorganized (making it ready for more operating
+systems).
+
+* Lib/ospath.py is now obsolete (use os.path instead).
+
+* Many fixes to the tutorial to make it match Python 1.0.  Thanks,
+Tim!
+
+* Fixed Doc/Makefile, Doc/README and various scripts there.
+
+* Added missing description of fdopen to Doc/libposix.tex.
+
+* Made cleanup() global, for the benefit of embedded applications.
+
+* Added parsing of addresses and dates to Lib/rfc822.py.
+
+* Small fixes to Lib/aifc.py, Lib/sunau.py, Lib/tzparse.py to make
+them usable at all.
+
+* New module Lib/wave.py reads RIFF (*.wav) audio files.
+
+* Module Lib/filewin.py moved to Lib/stdwin/filewin.py where it
+belongs.
+
+* New options and comments for Modules/makesetup (used by new
+Extension mechanism).
+
+* Misc/HYPE contains text of announcement of 1.0.0 in comp.lang.misc
+and elsewhere.
+
+* Fixed coredump in filter(None, 'abcdefg').
+
+
+=======================================
+==> Release 1.0.0 (26 January 1994) <==
+=======================================
+
+As is traditional, so many things have changed that I can't pretend to
+be complete in these release notes, but I'll try anyway :-)
+
+Note that the very last section is labeled "remaining bugs".
+
+
+Source organization and build process
+-------------------------------------
+
+* The sources have finally been split: instead of a single src
+subdirectory there are now separate directories Include, Parser,
+Grammar, Objects, Python and Modules.  Other directories also start
+with a capital letter: Misc, Doc, Lib, Demo.
+
+* A few extensions (notably Amoeba and X support) have been moved to a
+separate subtree Extensions, which is no longer in the core
+distribution, but separately ftp'able as extensions.tar.Z.  (The
+distribution contains a placeholder Ext-dummy with a description of
+the Extensions subtree as well as the most recent versions of the
+scripts used there.)
+
+* A few large specialized demos (SGI video and www) have been
+moved to a separate subdirectory Demo2, which is no longer in the core
+distribution, but separately ftp'able as demo2.tar.Z.
+
+* Parts of the standard library have been moved to subdirectories:
+there are now standard subdirectories stdwin, test, sgi and sun4.
+
+* The configuration process has radically changed: I now use GNU
+autoconf.  This makes it much easier to build on new Unix flavors, as
+well as fully supporting VPATH (if your Make has it).  The scripts
+Configure.py and Addmodule.sh are no longer needed.  Many source files
+have been adapted in order to work with the symbols that the configure
+script generated by autoconf defines (or not); the resulting source is
+much more portable to different C compilers and operating systems,
+even non Unix systems (a Mac port was done in an afternoon).  See the
+toplevel README file for a description of the new build process.
+
+* GNU readline (a slightly newer version) is now a subdirectory of the
+Python toplevel.  It is still not automatically configured (being
+totally autoconf-unaware :-).  One problem has been solved: typing
+Control-C to a readline prompt will now work.  The distribution no
+longer contains a "super-level" directory (above the python toplevel
+directory), and dl, dl-dld and GNU dld are no longer part of the
+Python distribution (you can still ftp them from
+ftp.cwi.nl:/pub/dynload).
+
+* The DOS functions have been taken out of posixmodule.c and moved
+into a separate file dosmodule.c.
+
+* There's now a separate file version.c which contains nothing but
+the version number.
+
+* The actual main program is now contained in config.c (unless NO_MAIN
+is defined); pythonmain.c now contains a function realmain() which is
+called from config.c's main().
+
+* All files needed to use the built-in module md5 are now contained in
+the distribution.  The module has been cleaned up considerably.
+
+
+Documentation
+-------------
+
+* The library manual has been split into many more small latex files,
+so it is easier to edit Doc/lib.tex file to create a custom library
+manual, describing only those modules supported on your system.  (This
+is not automated though.)
+
+* A fourth manual has been added, titled "Extending and Embedding the
+Python Interpreter" (Doc/ext.tex), which collects information about
+the interpreter which was previously spread over several files in the
+misc subdirectory.
+
+* The entire documentation is now also available on-line for those who
+have a WWW browser (e.g. NCSA Mosaic).  Point your browser to the URL
+"http://www.cwi.nl/~guido/Python.html".
+
+
+Syntax
+------
+
+* Strings may now be enclosed in double quotes as well as in single
+quotes.  There is no difference in interpretation.  The repr() of
+string objects will use double quotes if the string contains a single
+quote and no double quotes.  Thanks to Amrit Prem for these changes!
+
+* There is a new keyword 'exec'.  This replaces the exec() built-in
+function.  If a function contains an exec statement, local variable
+optimization is not performed for that particular function, thus
+making assignment to local variables in exec statements less
+confusing.  (As a consequence, os.exec and python.exec have been
+renamed to execv.)
+
+* There is a new keyword 'lambda'.  An expression of the form
+
+	lambda <parameters> : <expression>
+
+yields an anonymous function.  This is really only syntactic sugar;
+you can just as well define a local function using
+
+	def some_temporary_name(<parameters>): return <expression>
+
+Lambda expressions are particularly useful in combination with map(),
+filter() and reduce(), described below.  Thanks to Amrit Prem for
+submitting this code (as well as map(), filter(), reduce() and
+xrange())!
+
+
+Built-in functions
+------------------
+
+* The built-in module containing the built-in functions is called
+__builtin__ instead of builtin.
+
+* New built-in functions map(), filter() and reduce() perform standard
+functional programming operations (though not lazily):
+
+- map(f, seq) returns a new sequence whose items are the items from
+seq with f() applied to them.
+
+- filter(f, seq) returns a subsequence of seq consisting of those
+items for which f() is true.
+
+- reduce(f, seq, initial) returns a value computed as follows:
+	acc = initial
+	for item in seq: acc = f(acc, item)
+	return acc
+
+* New function xrange() creates a "range object".  Its arguments are
+the same as those of range(), and when used in a for loop a range
+objects also behaves identical.  The advantage of xrange() over
+range() is that its representation (if the range contains many
+elements) is much more compact than that of range().  The disadvantage
+is that the result cannot be used to initialize a list object or for
+the "Python idiom" [RED, GREEN, BLUE] = range(3).  On some modern
+architectures, benchmarks have shown that "for i in range(...): ..."
+actually executes *faster* than "for i in xrange(...): ...", but on
+memory starved machines like PCs running DOS range(100000) may be just
+too big to be represented at all...
+
+* Built-in function exec() has been replaced by the exec statement --
+see above.
+
+
+The interpreter
+---------------
+
+* Syntax errors are now not printed to stderr by the parser, but
+rather the offending line and other relevant information are packed up
+in the SyntaxError exception argument.  When the main loop catches a
+SyntaxError exception it will print the error in the same format as
+previously, but at the proper position in the stack traceback.
+
+* You can now set a maximum to the number of traceback entries
+printed by assigning to sys.tracebacklimit.  The default is 1000.
+
+* The version number in .pyc files has changed yet again.
+
+* It is now possible to have a .pyc file without a corresponding .py
+file.  (Warning: this may break existing installations if you have an
+old .pyc file lingering around somewhere on your module search path
+without a corresponding .py file, when there is a .py file for a
+module of the same name further down the path -- the new interpreter
+will find the first .pyc file and complain about it, while the old
+interpreter would ignore it and use the .py file further down.)
+
+* The list sys.builtin_module_names is now sorted and also contains
+the names of a few hardwired built-in modules (sys, __main__ and
+__builtin__).
+
+* A module can now find its own name by accessing the global variable
+__name__.  Assigning to this variable essentially renames the module
+(it should also be stored under a different key in sys.modules).
+A neat hack follows from this: a module that wants to execute a main
+program when called as a script no longer needs to compare
+sys.argv[0]; it can simply do "if __name__ == '__main__': main()".
+
+* When an object is printed by the print statement, its implementation
+of str() is used.  This means that classes can define __str__(self) to
+direct how their instances are printed.  This is different from
+__repr__(self), which should define an unambigous string
+representation of the instance.  (If __str__() is not defined, it
+defaults to __repr__().)
+
+* Functions and code objects can now be compared meaningfully.
+
+* On systems supporting SunOS or SVR4 style shared libraries, dynamic
+loading of modules using shared libraries is automatically configured.
+Thanks to Bill Jansen and Denis Severson for contributing this change!
+
+
+Built-in objects
+----------------
+
+* File objects have acquired a new method writelines() which is the
+reverse of readlines().  (It does not actually write lines, just a
+list of strings, but the symmetry makes the choice of name OK.)
+
+
+Built-in modules
+----------------
+
+* Socket objects no longer support the avail() method.  Use the select
+module instead, or use this function to replace it:
+
+	def avail(f):
+		import select
+		return f in select.select([f], [], [], 0)[0]
+
+* Initialization of stdwin is done differently.  It actually modifies
+sys.argv (taking out the options the X version of stdwin recognizes)
+the first time it is imported.
+
+* A new built-in module parser provides a rudimentary interface to the
+python parser.  Corresponding standard library modules token and symbol
+defines the numeric values of tokens and non-terminal symbols.
+
+* The posix module has aquired new functions setuid(), setgid(),
+execve(), and exec() has been renamed to execv().
+
+* The array module is extended with 8-byte object swaps, the 'i'
+format character, and a reverse() method.  The read() and write()
+methods are renamed to fromfile() and tofile().
+
+* The rotor module has freed of portability bugs.  This introduces a
+backward compatibility problem: strings encoded with the old rotor
+module can't be decoded by the new version.
+
+* For select.select(), a timeout (4th) argument of None means the same
+as leaving the timeout argument out.
+
+* Module strop (and hence standard library module string) has aquired
+a new function: rindex().  Thanks to Amrit Prem!
+
+* Module regex defines a new function symcomp() which uses an extended
+regular expression syntax: parenthesized subexpressions may be labeled
+using the form "\(<labelname>...\)", and the group() method can return
+sub-expressions by name.  Thanks to Tracy Tims for these changes!
+
+* Multiple threads are now supported on Solaris 2.  Thanks to Sjoerd
+Mullender!
+
+
+Standard library modules
+------------------------
+
+* The library is now split in several subdirectories: all stuff using
+stdwin is in Lib/stdwin, all SGI specific (or SGI Indigo or GL) stuff
+is in Lib/sgi, all Sun Sparc specific stuff is in Lib/sun4, and all
+test modules are in Lib/test.  The default module search path will
+include all relevant subdirectories by default.
+
+* Module os now knows about trying to import dos.  It defines
+functions execl(), execle(), execlp() and execvp().
+
+* New module dospath (should be attacked by a DOS hacker though).
+
+* All modules defining classes now define __init__() constructors
+instead of init() methods.  THIS IS AN INCOMPATIBLE CHANGE!
+
+* Some minor changes and bugfixes module ftplib (mostly Steve
+Majewski's suggestions); the debug() method is renamed to
+set_debuglevel().
+
+* Some new test modules (not run automatically by testall though):
+test_audioop, test_md5, test_rgbimg, test_select.
+
+* Module string now defines rindex() and rfind() in analogy of index()
+and find().  It also defines atof() and atol() (and corresponding
+exceptions) in analogy to atoi().
+
+* Added help() functions to modules profile and pdb.
+
+* The wdb debugger (now in Lib/stdwin) now shows class or instance
+variables on a double click.  Thanks to Sjoerd Mullender!
+
+* The (undocumented) module lambda has gone -- you couldn't import it
+any more, and it was basically more a demo than a library module...
+
+
+Multimedia extensions
+---------------------
+
+* The optional built-in modules audioop and imageop are now standard
+parts of the interpreter.  Thanks to Sjoerd Mullender and Jack Jansen
+for contributing this code!
+
+* There's a new operation in audioop: minmax().
+
+* There's a new built-in module called rgbimg which supports portable
+efficient reading of SGI RCG image files.  Thanks also to Paul
+Haeberli for the original code!  (Who will contribute a GIF reader?)
+
+* The module aifc is gone -- you should now always use aifc, which has
+received a facelift.
+
+* There's a new module sunau., for reading Sun (and NeXT) audio files.
+
+* There's a new module audiodev which provides a uniform interface to
+(SGI Indigo and Sun Sparc) audio hardware.
+
+* There's a new module sndhdr which recognizes various sound files by
+looking in their header and checking for various magic words.
+
+
+Optimizations
+-------------
+
+* Most optimizations below can be configured by compile-time flags.
+Thanks to Sjoerd Mullender for submitting these optimizations!
+
+* Small integers (default -1..99) are shared -- i.e. if two different
+functions compute the same value it is possible (but not
+guaranteed!!!) that they return the same *object*.  Python programs
+can detect this but should *never* rely on it.
+
+* Empty tuples (which all compare equal) are shared in the same
+manner.
+
+* Tuples of size up to 20 (default) are put in separate free lists
+when deallocated.
+
+* There is a compile-time option to cache a string's hash function,
+but this appeared to have a negligeable effect, and as it costs 4
+bytes per string it is disabled by default.
+
+
+Embedding Python
+----------------
+
+* The initialization interface has been simplified somewhat.  You now
+only call "initall()" to initialize the interpreter.
+
+* The previously announced renaming of externally visible identifiers
+has not been carried out.  It will happen in a later release.  Sorry.
+
+
+Miscellaneous bugs that have been fixed
+---------------------------------------
+
+* All known portability bugs.
+
+* Version 0.9.9 dumped core in <listobject>.sort() which has been
+fixed.  Thanks to Jaap Vermeulen for fixing this and posting the fix
+on the mailing list while I was away!
+
+* Core dump on a format string ending in '%', e.g. in the expression
+'%' % None.
+
+* The array module yielded a bogus result for concatenation (a+b would
+yield a+a).
+
+* Some serious memory leaks in strop.split() and strop.splitfields().
+
+* Several problems with the nis module.
+
+* Subtle problem when copying a class method from another class
+through assignment (the method could not be called).
+
+
+Remaining bugs
+--------------
+
+* One problem with 64-bit machines remains -- since .pyc files are
+portable and use only 4 bytes to represent an integer object, 64-bit
+integer literals are silently truncated when written into a .pyc file.
+Work-around: use eval('123456789101112').
+
+* The freeze script doesn't work any more.  A new and more portable
+one can probably be cooked up using tricks from Extensions/mkext.py.
+
+* The dos support hasn't been tested yet.  (Really Soon Now we should
+have a PC with a working C compiler!)
+
+
 ===================================
 ==> Release 0.9.9 (29 Jul 1993) <==
 ===================================
@@ -369,6 +1026,7 @@
 
 * Read src/ChangeLog for full details.
 
+
 ==================================
 ==> Release 0.9.8 (9 Jan 1993) <==
 ==================================
@@ -955,6 +1613,7 @@
 
 New file xxmodule.c is a template for new extension modules.
 
+
 ==================================
 ==> RELEASE 0.9.6 (6 Apr 1992) <==
 ==================================
diff --git a/Misc/NEWS b/Misc/NEWS
index eeacdbb..a8e2e20 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -130,660 +130,5 @@
     sigcheck() also sets an exception when it returns nonzero
 
 
-====================================
-==> Release 1.0.3 (14 July 1994) <==
-====================================
-
-This release consists entirely of bug fixes to the C sources; see the
-head of ../ChangeLog for a complete list.  Most important bugs fixed:
-
-- Sometimes the format operator (string%expr) would drop the last
-character of the format string
-
-- Tokenizer looped when last line did not end in \n
-
-- Bug when triple-quoted string ended in quote plus newline
-
-- Typo in socketmodule (listen) (== instead of =)
-
-- typing vars() at the >>> prompt would cause recursive output
-
-==================================
-==> Release 1.0.2 (4 May 1994) <==
-==================================
-
-Overview of the most visible changes.  Bug fixes are not listed.  See
-also ChangeLog.
-
-Tokens
-------
-
-* String literals follow Standard C rules: they may be continued on
-the next line using a backslash; adjacent literals are concatenated
-at compile time.
-
-* A new kind of string literals, surrounded by triple quotes (""" or
-'''), can be continued on the next line without a backslash.
-
-Syntax
-------
-
-* Function arguments may have a default value, e.g. def f(a, b=1);
-defaults are evaluated at function definition time.  This also applies
-to lambda.
-
-* The try-except statement has an optional else clause, which is
-executed when no exception occurs in the try clause.
-
-Interpreter
------------
-
-* The result of a statement-level expression is no longer printed,
-except_ for expressions entered interactively.  Consequently, the -k
-command line option is gone.
-
-* The result of the last printed interactive expression is assigned to
-the variable '_'.
-
-* Access to implicit global variables has been speeded up by removing
-an always-failing dictionary lookup in the dictionary of local
-variables (mod suggested by Steve Makewski and Tim Peters).
-
-* There is a new command line option, -u, to force stdout and stderr
-to be unbuffered.
-
-* Incorporated Steve Majewski's mods to import.c for dynamic loading
-under AIX.
-
-* Fewer chances of dumping core when trying to reload or re-import
-static built-in, dynamically loaded built-in, or frozen modules.
-
-* Loops over sequences now don't ask for the sequence's length when
-they start, but try to access items 0, 1, 2, and so on until they hit
-an IndexError.  This makes it possible to create classes that generate
-infinite or indefinite sequences a la Steve Majewski.  This affects
-for loops, the (not) in operator, and the built-in functions filter(),
-map(), max(), min(), reduce().
-
-Changed Built-in operations
----------------------------
-
-* The '%' operator on strings (printf-style formatting) supports a new
-feature (adapted from a patch by Donald Beaudry) to allow
-'%(<key>)<format>' % {...} to take values from a dictionary by name
-instead of from a tuple by position (see also the new function
-vars()).
-
-* The '%s' formatting operator is changed to accept any type and
-convert it to a string using str().
-
-* Dictionaries with more than 20,000 entries can now be created
-(thanks to Steve Kirsch).
-
-New Built-in Functions
-----------------------
-
-* vars() returns a dictionary containing the local variables; vars(m)
-returns a dictionary containing the variables of module m.  Note:
-dir(x) is now equivalent to vars(x).keys().
-
-Changed Built-in Functions
---------------------------
-
-* open() has an optional third argument to specify the buffer size: 0
-for unbuffered, 1 for line buffered, >1 for explicit buffer size, <0
-for default.
-
-* open()'s second argument is now optional; it defaults to "r".
-
-* apply() now checks that its second argument is indeed a tuple.
-
-New Built-in Modules
---------------------
-
-Changed Built-in Modules
-------------------------
-
-The thread module no longer supports exit_prog().
-
-New Python Modules
-------------------
-
-* Module addpack contains a standard interface to modify sys.path to
-find optional packages (groups of related modules).
-
-* Module urllib contains a number of functions to access
-World-Wide-Web files specified by their URL.
-
-* Module httplib implements the client side of the HTTP protocol used
-by World-Wide-Web servers.
-
-* Module gopherlib implements the client side of the Gopher protocol.
-
-* Module mailbox (by Jack Jansen) contains a parser for UNIX and MMDF
-style mailbox files.
-
-* Module random contains various random distributions, e.g. gauss().
-
-* Module lockfile locks and unlocks open files using fcntl (inspired
-by a similar module by Andy Bensky).
-
-* Module ntpath (by Jaap Vermeulen) implements path operations for
-Windows/NT.
-
-* Module test_thread (in Lib/test) contains a small test set for the
-thread module.
-
-Changed Python Modules
-----------------------
-
-* The string module's expandvars() function is now documented and is
-implemented in Python (using regular expressions) instead of forking
-off a shell process.
-
-* Module rfc822 now supports accessing the header fields using the
-mapping/dictionary interface, e.g. h['subject'].
-
-* Module pdb now makes it possible to set a break on a function
-(syntax: break <expression>, where <expression> yields a function
-object).
-
-Changed Demos
--------------
-
-* The Demo/scripts/freeze.py script is working again (thanks to Jaap
-Vermeulen).
-
-New Demos
----------
-
-* Demo/threads/Generator.py is a proposed interface for restartable
-functions a la Tim Peters.
-
-* Demo/scripts/newslist.py, by Quentin Stafford-Fraser, generates a
-directory full of HTML pages which between them contain links to all
-the newsgroups available on your server.
-
-* Demo/dns contains a DNS (Domain Name Server) client.
-
-* Demo/lutz contains miscellaneous demos by Mark Lutz (e.g. psh.py, a
-nice enhanced Python shell!!!).
-
-* Demo/turing contains a Turing machine by Amrit Prem.
-
-Documentation
--------------
-
-* Documented new language features mentioned above (but not all new
-modules).
-
-* Added a chapter to the Tutorial describing recent additions to
-Python.
-
-* Clarified some sentences in the reference manual,
-e.g. break/continue, local/global scope, slice assignment.
-
-Source Structure
-----------------
-
-* Moved Include/tokenizer.h to Parser/tokenizer.h.
-
-* Added Python/getopt.c for systems that don't have it.
-
-Emacs mode
-----------
-
-* Indentation of continuated lines is done more intelligently;
-consequently the variable py-continuation-offset is gone.
-
-========================================
-==> Release 1.0.1 (15 February 1994) <==
-========================================
-
-* Many portability fixes should make it painless to build Python on
-several new platforms, e.g. NeXT, SEQUENT, WATCOM, DOS, and Windows.
-
-* Fixed test for <stdarg.h> -- this broke on some platforms.
-
-* Fixed test for shared library dynalic loading -- this broke on SunOS
-4.x using the GNU loader.
-
-* Changed order and number of SVR4 networking libraries (it is now
--lsocket -linet -lnsl, if these libraries exist).
-
-* Installing the build intermediate stages with "make libainstall" now
-also installs config.c.in, Setup and makesetup, which are used by the
-new Extensions mechanism.
-
-* Improved README file contains more hints and new troubleshooting
-section.
-
-* The built-in module strop now defines fast versions of three more
-functions of the standard string module: atoi(), atol() and atof().
-The strop versions of atoi() and atol() support an optional second
-argument to specify the base (default 10).  NOTE: you don't have to
-explicitly import strop to use the faster versions -- the string
-module contains code to let versions from stop override the default
-versions.
-
-* There is now a working Lib/dospath.py for those who use Python under
-DOS (or Windows).  Thanks, Jaap!
-
-* There is now a working Modules/dosmodule.c for DOS (or Windows)
-system calls.
-
-* Lib.os.py has been reorganized (making it ready for more operating
-systems).
-
-* Lib/ospath.py is now obsolete (use os.path instead).
-
-* Many fixes to the tutorial to make it match Python 1.0.  Thanks,
-Tim!
-
-* Fixed Doc/Makefile, Doc/README and various scripts there.
-
-* Added missing description of fdopen to Doc/libposix.tex.
-
-* Made cleanup() global, for the benefit of embedded applications.
-
-* Added parsing of addresses and dates to Lib/rfc822.py.
-
-* Small fixes to Lib/aifc.py, Lib/sunau.py, Lib/tzparse.py to make
-them usable at all.
-
-* New module Lib/wave.py reads RIFF (*.wav) audio files.
-
-* Module Lib/filewin.py moved to Lib/stdwin/filewin.py where it
-belongs.
-
-* New options and comments for Modules/makesetup (used by new
-Extension mechanism).
-
-* Misc/HYPE contains text of announcement of 1.0.0 in comp.lang.misc
-and elsewhere.
-
-* Fixed coredump in filter(None, 'abcdefg').
-
-
-=======================================
-==> Release 1.0.0 (26 January 1994) <==
-=======================================
-
-As is traditional, so many things have changed that I can't pretend to
-be complete in these release notes, but I'll try anyway :-)
-
-Note that the very last section is labeled "remaining bugs".
-
-
-Source organization and build process
--------------------------------------
-
-* The sources have finally been split: instead of a single src
-subdirectory there are now separate directories Include, Parser,
-Grammar, Objects, Python and Modules.  Other directories also start
-with a capital letter: Misc, Doc, Lib, Demo.
-
-* A few extensions (notably Amoeba and X support) have been moved to a
-separate subtree Extensions, which is no longer in the core
-distribution, but separately ftp'able as extensions.tar.Z.  (The
-distribution contains a placeholder Ext-dummy with a description of
-the Extensions subtree as well as the most recent versions of the
-scripts used there.)
-
-* A few large specialized demos (SGI video and www) have been
-moved to a separate subdirectory Demo2, which is no longer in the core
-distribution, but separately ftp'able as demo2.tar.Z.
-
-* Parts of the standard library have been moved to subdirectories:
-there are now standard subdirectories stdwin, test, sgi and sun4.
-
-* The configuration process has radically changed: I now use GNU
-autoconf.  This makes it much easier to build on new Unix flavors, as
-well as fully supporting VPATH (if your Make has it).  The scripts
-Configure.py and Addmodule.sh are no longer needed.  Many source files
-have been adapted in order to work with the symbols that the configure
-script generated by autoconf defines (or not); the resulting source is
-much more portable to different C compilers and operating systems,
-even non Unix systems (a Mac port was done in an afternoon).  See the
-toplevel README file for a description of the new build process.
-
-* GNU readline (a slightly newer version) is now a subdirectory of the
-Python toplevel.  It is still not automatically configured (being
-totally autoconf-unaware :-).  One problem has been solved: typing
-Control-C to a readline prompt will now work.  The distribution no
-longer contains a "super-level" directory (above the python toplevel
-directory), and dl, dl-dld and GNU dld are no longer part of the
-Python distribution (you can still ftp them from
-ftp.cwi.nl:/pub/dynload).
-
-* The DOS functions have been taken out of posixmodule.c and moved
-into a separate file dosmodule.c.
-
-* There's now a separate file version.c which contains nothing but
-the version number.
-
-* The actual main program is now contained in config.c (unless NO_MAIN
-is defined); pythonmain.c now contains a function realmain() which is
-called from config.c's main().
-
-* All files needed to use the built-in module md5 are now contained in
-the distribution.  The module has been cleaned up considerably.
-
-
-Documentation
--------------
-
-* The library manual has been split into many more small latex files,
-so it is easier to edit Doc/lib.tex file to create a custom library
-manual, describing only those modules supported on your system.  (This
-is not automated though.)
-
-* A fourth manual has been added, titled "Extending and Embedding the
-Python Interpreter" (Doc/ext.tex), which collects information about
-the interpreter which was previously spread over several files in the
-misc subdirectory.
-
-* The entire documentation is now also available on-line for those who
-have a WWW browser (e.g. NCSA Mosaic).  Point your browser to the URL
-"http://www.cwi.nl/~guido/Python.html".
-
-
-Syntax
-------
-
-* Strings may now be enclosed in double quotes as well as in single
-quotes.  There is no difference in interpretation.  The repr() of
-string objects will use double quotes if the string contains a single
-quote and no double quotes.  Thanks to Amrit Prem for these changes!
-
-* There is a new keyword 'exec'.  This replaces the exec() built-in
-function.  If a function contains an exec statement, local variable
-optimization is not performed for that particular function, thus
-making assignment to local variables in exec statements less
-confusing.  (As a consequence, os.exec and python.exec have been
-renamed to execv.)
-
-* There is a new keyword 'lambda'.  An expression of the form
-
-	lambda <parameters> : <expression>
-
-yields an anonymous function.  This is really only syntactic sugar;
-you can just as well define a local function using
-
-	def some_temporary_name(<parameters>): return <expression>
-
-Lambda expressions are particularly useful in combination with map(),
-filter() and reduce(), described below.  Thanks to Amrit Prem for
-submitting this code (as well as map(), filter(), reduce() and
-xrange())!
-
-
-Built-in functions
-------------------
-
-* The built-in module containing the built-in functions is called
-__builtin__ instead of builtin.
-
-* New built-in functions map(), filter() and reduce() perform standard
-functional programming operations (though not lazily):
-
-- map(f, seq) returns a new sequence whose items are the items from
-seq with f() applied to them.
-
-- filter(f, seq) returns a subsequence of seq consisting of those
-items for which f() is true.
-
-- reduce(f, seq, initial) returns a value computed as follows:
-	acc = initial
-	for item in seq: acc = f(acc, item)
-	return acc
-
-* New function xrange() creates a "range object".  Its arguments are
-the same as those of range(), and when used in a for loop a range
-objects also behaves identical.  The advantage of xrange() over
-range() is that its representation (if the range contains many
-elements) is much more compact than that of range().  The disadvantage
-is that the result cannot be used to initialize a list object or for
-the "Python idiom" [RED, GREEN, BLUE] = range(3).  On some modern
-architectures, benchmarks have shown that "for i in range(...): ..."
-actually executes *faster* than "for i in xrange(...): ...", but on
-memory starved machines like PCs running DOS range(100000) may be just
-too big to be represented at all...
-
-* Built-in function exec() has been replaced by the exec statement --
-see above.
-
-
-The interpreter
----------------
-
-* Syntax errors are now not printed to stderr by the parser, but
-rather the offending line and other relevant information are packed up
-in the SyntaxError exception argument.  When the main loop catches a
-SyntaxError exception it will print the error in the same format as
-previously, but at the proper position in the stack traceback.
-
-* You can now set a maximum to the number of traceback entries
-printed by assigning to sys.tracebacklimit.  The default is 1000.
-
-* The version number in .pyc files has changed yet again.
-
-* It is now possible to have a .pyc file without a corresponding .py
-file.  (Warning: this may break existing installations if you have an
-old .pyc file lingering around somewhere on your module search path
-without a corresponding .py file, when there is a .py file for a
-module of the same name further down the path -- the new interpreter
-will find the first .pyc file and complain about it, while the old
-interpreter would ignore it and use the .py file further down.)
-
-* The list sys.builtin_module_names is now sorted and also contains
-the names of a few hardwired built-in modules (sys, __main__ and
-__builtin__).
-
-* A module can now find its own name by accessing the global variable
-__name__.  Assigning to this variable essentially renames the module
-(it should also be stored under a different key in sys.modules).
-A neat hack follows from this: a module that wants to execute a main
-program when called as a script no longer needs to compare
-sys.argv[0]; it can simply do "if __name__ == '__main__': main()".
-
-* When an object is printed by the print statement, its implementation
-of str() is used.  This means that classes can define __str__(self) to
-direct how their instances are printed.  This is different from
-__repr__(self), which should define an unambigous string
-representation of the instance.  (If __str__() is not defined, it
-defaults to __repr__().)
-
-* Functions and code objects can now be compared meaningfully.
-
-* On systems supporting SunOS or SVR4 style shared libraries, dynamic
-loading of modules using shared libraries is automatically configured.
-Thanks to Bill Jansen and Denis Severson for contributing this change!
-
-
-Built-in objects
-----------------
-
-* File objects have acquired a new method writelines() which is the
-reverse of readlines().  (It does not actually write lines, just a
-list of strings, but the symmetry makes the choice of name OK.)
-
-
-Built-in modules
-----------------
-
-* Socket objects no longer support the avail() method.  Use the select
-module instead, or use this function to replace it:
-
-	def avail(f):
-		import select
-		return f in select.select([f], [], [], 0)[0]
-
-* Initialization of stdwin is done differently.  It actually modifies
-sys.argv (taking out the options the X version of stdwin recognizes)
-the first time it is imported.
-
-* A new built-in module parser provides a rudimentary interface to the
-python parser.  Corresponding standard library modules token and symbol
-defines the numeric values of tokens and non-terminal symbols.
-
-* The posix module has aquired new functions setuid(), setgid(),
-execve(), and exec() has been renamed to execv().
-
-* The array module is extended with 8-byte object swaps, the 'i'
-format character, and a reverse() method.  The read() and write()
-methods are renamed to fromfile() and tofile().
-
-* The rotor module has freed of portability bugs.  This introduces a
-backward compatibility problem: strings encoded with the old rotor
-module can't be decoded by the new version.
-
-* For select.select(), a timeout (4th) argument of None means the same
-as leaving the timeout argument out.
-
-* Module strop (and hence standard library module string) has aquired
-a new function: rindex().  Thanks to Amrit Prem!
-
-* Module regex defines a new function symcomp() which uses an extended
-regular expression syntax: parenthesized subexpressions may be labeled
-using the form "\(<labelname>...\)", and the group() method can return
-sub-expressions by name.  Thanks to Tracy Tims for these changes!
-
-* Multiple threads are now supported on Solaris 2.  Thanks to Sjoerd
-Mullender!
-
-
-Standard library modules
-------------------------
-
-* The library is now split in several subdirectories: all stuff using
-stdwin is in Lib/stdwin, all SGI specific (or SGI Indigo or GL) stuff
-is in Lib/sgi, all Sun Sparc specific stuff is in Lib/sun4, and all
-test modules are in Lib/test.  The default module search path will
-include all relevant subdirectories by default.
-
-* Module os now knows about trying to import dos.  It defines
-functions execl(), execle(), execlp() and execvp().
-
-* New module dospath (should be attacked by a DOS hacker though).
-
-* All modules defining classes now define __init__() constructors
-instead of init() methods.  THIS IS AN INCOMPATIBLE CHANGE!
-
-* Some minor changes and bugfixes module ftplib (mostly Steve
-Majewski's suggestions); the debug() method is renamed to
-set_debuglevel().
-
-* Some new test modules (not run automatically by testall though):
-test_audioop, test_md5, test_rgbimg, test_select.
-
-* Module string now defines rindex() and rfind() in analogy of index()
-and find().  It also defines atof() and atol() (and corresponding
-exceptions) in analogy to atoi().
-
-* Added help() functions to modules profile and pdb.
-
-* The wdb debugger (now in Lib/stdwin) now shows class or instance
-variables on a double click.  Thanks to Sjoerd Mullender!
-
-* The (undocumented) module lambda has gone -- you couldn't import it
-any more, and it was basically more a demo than a library module...
-
-
-Multimedia extensions
----------------------
-
-* The optional built-in modules audioop and imageop are now standard
-parts of the interpreter.  Thanks to Sjoerd Mullender and Jack Jansen
-for contributing this code!
-
-* There's a new operation in audioop: minmax().
-
-* There's a new built-in module called rgbimg which supports portable
-efficient reading of SGI RCG image files.  Thanks also to Paul
-Haeberli for the original code!  (Who will contribute a GIF reader?)
-
-* The module aifc is gone -- you should now always use aifc, which has
-received a facelift.
-
-* There's a new module sunau., for reading Sun (and NeXT) audio files.
-
-* There's a new module audiodev which provides a uniform interface to
-(SGI Indigo and Sun Sparc) audio hardware.
-
-* There's a new module sndhdr which recognizes various sound files by
-looking in their header and checking for various magic words.
-
-
-Optimizations
--------------
-
-* Most optimizations below can be configured by compile-time flags.
-Thanks to Sjoerd Mullender for submitting these optimizations!
-
-* Small integers (default -1..99) are shared -- i.e. if two different
-functions compute the same value it is possible (but not
-guaranteed!!!) that they return the same *object*.  Python programs
-can detect this but should *never* rely on it.
-
-* Empty tuples (which all compare equal) are shared in the same
-manner.
-
-* Tuples of size up to 20 (default) are put in separate free lists
-when deallocated.
-
-* There is a compile-time option to cache a string's hash function,
-but this appeared to have a negligeable effect, and as it costs 4
-bytes per string it is disabled by default.
-
-
-Embedding Python
-----------------
-
-* The initialization interface has been simplified somewhat.  You now
-only call "initall()" to initialize the interpreter.
-
-* The previously announced renaming of externally visible identifiers
-has not been carried out.  It will happen in a later release.  Sorry.
-
-
-Miscellaneous bugs that have been fixed
----------------------------------------
-
-* All known portability bugs.
-
-* Version 0.9.9 dumped core in <listobject>.sort() which has been
-fixed.  Thanks to Jaap Vermeulen for fixing this and posting the fix
-on the mailing list while I was away!
-
-* Core dump on a format string ending in '%', e.g. in the expression
-'%' % None.
-
-* The array module yielded a bogus result for concatenation (a+b would
-yield a+a).
-
-* Some serious memory leaks in strop.split() and strop.splitfields().
-
-* Several problems with the nis module.
-
-* Subtle problem when copying a class method from another class
-through assignment (the method could not be called).
-
-
-Remaining bugs
---------------
-
-* One problem with 64-bit machines remains -- since .pyc files are
-portable and use only 4 bytes to represent an integer object, 64-bit
-integer literals are silently truncated when written into a .pyc file.
-Work-around: use eval('123456789101112').
-
-* The freeze script doesn't work any more.  A new and more portable
-one can probably be cooked up using tricks from Extensions/mkext.py.
-
-* The dos support hasn't been tested yet.  (Really Soon Now we should
-have a PC with a working C compiler!)
-
-
 --Guido van Rossum, CWI, Amsterdam <Guido.van.Rossum@cwi.nl>
 URL:  <http://www.cwi.nl/cwi/people/Guido.van.Rossum.html>
