diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index 49e58eb..2c7318c 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -13,65 +13,73 @@
 import string
 import sys
 
-prefix = os.path.normpath (sys.prefix)
-exec_prefix = os.path.normpath (sys.exec_prefix)
+from errors import DistutilsPlatformError
 
 
-def get_python_inc (plat_specific=0):
+prefix = os.path.normpath(sys.prefix)
+exec_prefix = os.path.normpath(sys.exec_prefix)
+
+
+def get_python_inc(plat_specific=0):
     """Return the directory containing installed Python header files.
-       If 'plat_specific' is false (the default), this is the path to the
-       non-platform-specific header files, i.e. Python.h and so on;
-       otherwise, this is the path to platform-specific header files
-       (namely config.h)."""
-    
+
+    If 'plat_specific' is false (the default), this is the path to the
+    non-platform-specific header files, i.e. Python.h and so on;
+    otherwise, this is the path to platform-specific header files
+    (namely config.h).
+
+    """    
     the_prefix = (plat_specific and exec_prefix or prefix)
     if os.name == "posix":
-        return os.path.join (the_prefix, "include", "python" + sys.version[:3])
+        return os.path.join(the_prefix, "include", "python" + sys.version[:3])
     elif os.name == "nt":
-        return os.path.join (the_prefix, "Include") # include or Include?
+        return os.path.join(the_prefix, "Include") # include or Include?
     elif os.name == "mac":
-        return os.path.join (the_prefix, "Include")
+        return os.path.join(the_prefix, "Include")
     else:
         raise DistutilsPlatformError, \
               ("I don't know where Python installs its C header files " +
                "on platform '%s'") % os.name
 
 
-def get_python_lib (plat_specific=0, standard_lib=0):
+def get_python_lib(plat_specific=0, standard_lib=0):
     """Return the directory containing the Python library (standard or
-       site additions).  If 'plat_specific' is true, return the directory
-       containing platform-specific modules, i.e. any module from a
-       non-pure-Python module distribution; otherwise, return the
-       platform-shared library directory.  If 'standard_lib' is true,
-       return the directory containing standard Python library modules;
-       otherwise, return the directory for site-specific modules."""
+    site additions).
 
+    If 'plat_specific' is true, return the directory containing
+    platform-specific modules, i.e. any module from a non-pure-Python
+    module distribution; otherwise, return the platform-shared library
+    directory.  If 'standard_lib' is true, return the directory
+    containing standard Python library modules; otherwise, return the
+    directory for site-specific modules.
+
+    """
     the_prefix = (plat_specific and exec_prefix or prefix)
        
     if os.name == "posix":
-        libpython = os.path.join (the_prefix,
-                                  "lib", "python" + sys.version[:3])
+        libpython = os.path.join(the_prefix,
+                                 "lib", "python" + sys.version[:3])
         if standard_lib:
             return libpython
         else:
-            return os.path.join (libpython, "site-packages")
+            return os.path.join(libpython, "site-packages")
 
     elif os.name == "nt":
         if standard_lib:
-            return os.path.join (the_prefix, "Lib")
+            return os.path.join(the_prefix, "Lib")
         else:
             return the_prefix
 
     elif os.name == "mac":
         if platform_specific:
             if standard_lib:
-                return os.path.join (exec_prefix, "Mac", "Plugins")
+                return os.path.join(exec_prefix, "Mac", "Plugins")
             else:
                 raise DistutilsPlatformError, \
                       "OK, where DO site-specific extensions go on the Mac?"
         else:
             if standard_lib:
-                return os.path.join (prefix, "Lib")
+                return os.path.join(prefix, "Lib")
             else:
                 raise DistutilsPlatformError, \
                       "OK, where DO site-specific modules go on the Mac?"
@@ -80,25 +88,27 @@
               ("I don't know where Python installs its library " +
                "on platform '%s'") % os.name
 
-# get_python_lib ()
+# get_python_lib()
         
 
 def get_config_h_filename():
     """Return full pathname of installed config.h file."""
-    inc_dir = get_python_inc (plat_specific=1)
-    return os.path.join (inc_dir, "config.h")
+    inc_dir = get_python_inc(plat_specific=1)
+    return os.path.join(inc_dir, "config.h")
 
 
 def get_makefile_filename():
     """Return full pathname of installed Makefile from the Python build."""
-    lib_dir = get_python_lib (plat_specific=1, standard_lib=1)
-    return os.path.join (lib_dir, "config", "Makefile")
+    lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
+    return os.path.join(lib_dir, "config", "Makefile")
 
 
 def parse_config_h(fp, g=None):
-    """Parse a config.h-style file.  A dictionary containing name/value
-    pairs is returned.  If an optional dictionary is passed in as the second
-    argument, it is used instead of a new dictionary.
+    """Parse a config.h-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
     """
     if g is None:
         g = {}
@@ -122,9 +132,12 @@
     return g
 
 def parse_makefile(fp, g=None):
-    """Parse a Makefile-style file.  A dictionary containing name/value
-    pairs is returned.  If an optional dictionary is passed in as the second
-    argument, it is used instead of a new dictionary.
+    """Parse a Makefile-style file.
+
+    A dictionary containing name/value pairs is returned.  If an
+    optional dictionary is passed in as the second argument, it is
+    used instead of a new dictionary.
+
     """
     if g is None:
         g = {}
@@ -206,11 +219,11 @@
     # load config.h, though I don't know how useful this is
     parse_config_h(open(get_config_h_filename()), g)
     # set basic install directories
-    g['LIBDEST'] = get_python_lib (plat_specific=0, standard_lib=1)
-    g['BINLIBDEST'] = get_python_lib (plat_specific=1, standard_lib=1)
+    g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
+    g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
 
     # XXX hmmm.. a normal install puts include files here
-    g['INCLUDEPY'] = get_python_inc (plat_specific=0)
+    g['INCLUDEPY'] = get_python_inc(plat_specific=0)
 
     g['SO'] = '.pyd'
     g['exec_prefix'] = exec_prefix
@@ -224,11 +237,11 @@
     parse_config_h(open(
             os.path.join(sys.exec_prefix, "Mac", "Include", "config.h")), g)
     # set basic install directories
-    g['LIBDEST'] = get_python_lib (plat_specific=0, standard_lib=1)
-    g['BINLIBDEST'] = get_python_lib (plat_specific=1, standard_lib=1)
+    g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
+    g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
 
     # XXX hmmm.. a normal install puts include files here
-    g['INCLUDEPY'] = get_python_inc (plat_specific=0)
+    g['INCLUDEPY'] = get_python_inc(plat_specific=0)
 
     g['SO'] = '.ppc.slb'
     g['exec_prefix'] = sys.exec_prefix
