Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
number of tests, all because of the codecs/_multibytecodecs issue described
here (it's not a Py3K issue, just something Py3K discovers):
http://mail.python.org/pipermail/python-dev/2006-April/064051.html

Hye-Shik Chang promised to look for a fix, so no need to fix it here. The
tests that are expected to break are:

test_codecencodings_cn
test_codecencodings_hk
test_codecencodings_jp
test_codecencodings_kr
test_codecencodings_tw
test_codecs
test_multibytecodec

This merge fixes an actual test failure (test_weakref) in this branch,
though, so I believe merging is the right thing to do anyway.
diff --git a/Tools/scripts/byext.py b/Tools/scripts/byext.py
index 93759bc..09610b0 100644
--- a/Tools/scripts/byext.py
+++ b/Tools/scripts/byext.py
@@ -17,7 +17,7 @@
             elif os.path.isfile(arg):
                 self.statfile(arg)
             else:
-                sys.stderr.write("Can't find %s\n" % file)
+                sys.stderr.write("Can't find %s\n" % arg)
                 self.addstats("<???>", "unknown", 1)
 
     def statdir(self, dir):
@@ -25,8 +25,8 @@
         try:
             names = os.listdir(dir)
         except os.error, err:
-            sys.stderr.write("Can't list %s: %s\n" % (file, err))
-            self.addstats(ext, "unlistable", 1)
+            sys.stderr.write("Can't list %s: %s\n" % (dir, err))
+            self.addstats("<dir>", "unlistable", 1)
             return
         names.sort()
         for name in names:
@@ -42,9 +42,9 @@
             else:
                 self.statfile(full)
 
-    def statfile(self, file):
-        head, ext = os.path.splitext(file)
-        head, base = os.path.split(file)
+    def statfile(self, filename):
+        head, ext = os.path.splitext(filename)
+        head, base = os.path.split(filename)
         if ext == base:
             ext = "" # E.g. .cvsignore is deemed not to have an extension
         ext = os.path.normcase(ext)
@@ -52,9 +52,9 @@
             ext = "<none>"
         self.addstats(ext, "files", 1)
         try:
-            f = open(file, "rb")
+            f = open(filename, "rb")
         except IOError, err:
-            sys.stderr.write("Can't open %s: %s\n" % (file, err))
+            sys.stderr.write("Can't open %s: %s\n" % (filename, err))
             self.addstats(ext, "unopenable", 1)
             return
         data = f.read()
diff --git a/Tools/scripts/classfix.py b/Tools/scripts/classfix.py
index cdf006a..d30700f 100755
--- a/Tools/scripts/classfix.py
+++ b/Tools/scripts/classfix.py
@@ -30,7 +30,7 @@
 # into a program for a different change to Python programs...
 
 import sys
-import regex
+import re
 import os
 from stat import *
 
@@ -53,7 +53,7 @@
             if fix(arg): bad = 1
     sys.exit(bad)
 
-ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
+ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$')
 def ispython(name):
     return ispythonprog.match(name) >= 0
 
@@ -148,12 +148,12 @@
 
 # This expression doesn't catch *all* class definition headers,
 # but it's pretty darn close.
-classexpr = '^\([ \t]*class +[a-zA-Z0-9_]+\) *( *) *\(\(=.*\)?\):'
-classprog = regex.compile(classexpr)
+classexpr = '^([ \t]*class +[a-zA-Z0-9_]+) *( *) *((=.*)?):'
+classprog = re.compile(classexpr)
 
 # Expressions for finding base class expressions.
-baseexpr = '^ *\(.*\) *( *) *$'
-baseprog = regex.compile(baseexpr)
+baseexpr = '^ *(.*) *( *) *$'
+baseprog = re.compile(baseexpr)
 
 def fixline(line):
     if classprog.match(line) < 0: # No 'class' keyword -- no change
diff --git a/Tools/scripts/fixcid.py b/Tools/scripts/fixcid.py
index 42aa835..433a425 100755
--- a/Tools/scripts/fixcid.py
+++ b/Tools/scripts/fixcid.py
@@ -35,7 +35,7 @@
 # files.
 
 import sys
-import regex
+import re
 import os
 from stat import *
 import getopt
@@ -90,7 +90,7 @@
 # Change this regular expression to select a different set of files
 Wanted = '^[a-zA-Z0-9_]+\.[ch]$'
 def wanted(name):
-    return regex.match(Wanted, name) >= 0
+    return re.match(Wanted, name) >= 0
 
 def recursedown(dirname):
     dbg('recursedown(%r)\n' % (dirname,))
@@ -212,12 +212,12 @@
 # Anything else is an operator -- don't list this explicitly because of '/*'
 
 OutsideComment = (Identifier, Number, String, Char, CommentStart)
-OutsideCommentPattern = '\(' + '\|'.join(OutsideComment) + '\)'
-OutsideCommentProgram = regex.compile(OutsideCommentPattern)
+OutsideCommentPattern = '(' + '|'.join(OutsideComment) + ')'
+OutsideCommentProgram = re.compile(OutsideCommentPattern)
 
 InsideComment = (Identifier, Number, CommentEnd)
-InsideCommentPattern = '\(' + '\|'.join(InsideComment) + '\)'
-InsideCommentProgram = regex.compile(InsideCommentPattern)
+InsideCommentPattern = '(' + '|'.join(InsideComment) + ')'
+InsideCommentProgram = re.compile(InsideCommentPattern)
 
 def initfixline():
     global Program
diff --git a/Tools/scripts/ifdef.py b/Tools/scripts/ifdef.py
index 7e7b5cc..2ed7a66 100755
--- a/Tools/scripts/ifdef.py
+++ b/Tools/scripts/ifdef.py
@@ -27,7 +27,6 @@
 # preprocessor commands.
 
 import sys
-import regex
 import getopt
 
 defs = []
diff --git a/Tools/scripts/methfix.py b/Tools/scripts/methfix.py
index a872ab7..b81871f 100755
--- a/Tools/scripts/methfix.py
+++ b/Tools/scripts/methfix.py
@@ -27,7 +27,7 @@
 # into a program for a different change to Python programs...
 
 import sys
-import regex
+import re
 import os
 from stat import *
 
@@ -50,7 +50,7 @@
             if fix(arg): bad = 1
     sys.exit(bad)
 
-ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
+ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$')
 def ispython(name):
     return ispythonprog.match(name) >= 0
 
@@ -101,7 +101,7 @@
         if lineno == 1 and g is None and line[:2] == '#!':
             # Check for non-Python scripts
             words = line[2:].split()
-            if words and regex.search('[pP]ython', words[0]) < 0:
+            if words and re.search('[pP]ython', words[0]) < 0:
                 msg = filename + ': ' + words[0]
                 msg = msg + ' script; not fixed\n'
                 err(msg)
@@ -158,8 +158,8 @@
     return 0
 
 
-fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *\(( *\(.*\) *)\) *) *:'
-fixprog = regex.compile(fixpat)
+fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *(( *(.*) *)) *) *:'
+fixprog = re.compile(fixpat)
 
 def fixline(line):
     if fixprog.match(line) >= 0:
diff --git a/Tools/scripts/objgraph.py b/Tools/scripts/objgraph.py
index 01060f9..f74c2b6 100755
--- a/Tools/scripts/objgraph.py
+++ b/Tools/scripts/objgraph.py
@@ -22,7 +22,7 @@
 import sys
 import os
 import getopt
-import regex
+import re
 
 # Types of symbols.
 #
@@ -32,7 +32,7 @@
 
 # Regular expression to parse "nm -o" output.
 #
-matcher = regex.compile('\(.*\):\t?........ \(.\) \(.*\)$')
+matcher = re.compile('(.*):\t?........ (.) (.*)$')
 
 # Store "item" in "dict" under "key".
 # The dictionary maps keys to lists of items.
diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py
index 5cb5add..7f6f191 100755
--- a/Tools/scripts/pathfix.py
+++ b/Tools/scripts/pathfix.py
@@ -20,7 +20,7 @@
 # into a program for a different change to Python programs...
 
 import sys
-import regex
+import re
 import os
 from stat import *
 import getopt
@@ -59,7 +59,7 @@
             if fix(arg): bad = 1
     sys.exit(bad)
 
-ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
+ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$')
 def ispython(name):
     return ispythonprog.match(name) >= 0
 
diff --git a/Tools/scripts/pdeps.py b/Tools/scripts/pdeps.py
index e835f84..da63e35 100755
--- a/Tools/scripts/pdeps.py
+++ b/Tools/scripts/pdeps.py
@@ -21,7 +21,7 @@
 
 
 import sys
-import regex
+import re
 import os
 
 
@@ -57,8 +57,8 @@
 
 # Compiled regular expressions to search for import statements
 #
-m_import = regex.compile('^[ \t]*from[ \t]+\([^ \t]+\)[ \t]+')
-m_from = regex.compile('^[ \t]*import[ \t]+\([^#]+\)')
+m_import = re.compile('^[ \t]*from[ \t]+([^ \t]+)[ \t]+')
+m_from = re.compile('^[ \t]*import[ \t]+([^#]+)')
 
 
 # Collect data from one file