diff --git a/Lib/plat-riscos/riscosenviron.py b/Lib/plat-riscos/riscosenviron.py
index e011a9b..bfb8447 100644
--- a/Lib/plat-riscos/riscosenviron.py
+++ b/Lib/plat-riscos/riscosenviron.py
@@ -42,4 +42,3 @@
             return value
         else:
             return failobj
-
diff --git a/Lib/plat-riscos/riscospath.py b/Lib/plat-riscos/riscospath.py
index a38b22c..d55a8b8 100644
--- a/Lib/plat-riscos/riscospath.py
+++ b/Lib/plat-riscos/riscospath.py
@@ -19,13 +19,13 @@
 import os, stat, string
 
 try:
-  import swi
+    import swi
 except ImportError:
-  class _swi:
-    def swi(*a):
-      raise AttributeError, 'This function only available under RISC OS'
-    block= swi
-  swi= _swi()
+    class _swi:
+        def swi(*a):
+            raise AttributeError, 'This function only available under RISC OS'
+        block= swi
+    swi= _swi()
 
 [_false, _true]= range(2)
 
@@ -45,154 +45,154 @@
 ## Path manipulation, RISC OS stylee.
 
 def _split(p):
+    """
+  split filing system name (including special field) and drive specifier from rest
+  of path. This is needed by many riscospath functions.
   """
-split filing system name (including special field) and drive specifier from rest
-of path. This is needed by many riscospath functions.
-"""
-  dash= _allowMOSFSNames and p[:1]=='-'
-  if dash:
-    q= string.find(p, '-', 1)+1
-  else:
-    if p[:1]==':':
-      q= 0
+    dash= _allowMOSFSNames and p[:1]=='-'
+    if dash:
+        q= string.find(p, '-', 1)+1
     else:
-      q= string.find(p, ':')+1 # q= index of start of non-FS portion of path
-  s= string.find(p, '#')
-  if s==-1 or s>q:
-    s= q # find end of main FS name, not including special field
-  else:
-    for c in p[dash:s]:
-      if c not in string.letters:
-        q= 0
-        break # disallow invalid non-special-field characters in FS name
-  r= q
-  if p[q:q+1]==':':
-    r= string.find(p, '.', q+1)+1
-    if r==0:
-      r= len(p) # find end of drive name (if any) following FS name (if any)
-  return (p[:q], p[q:r], p[r:])
+        if p[:1]==':':
+            q= 0
+        else:
+            q= string.find(p, ':')+1 # q= index of start of non-FS portion of path
+    s= string.find(p, '#')
+    if s==-1 or s>q:
+        s= q # find end of main FS name, not including special field
+    else:
+        for c in p[dash:s]:
+            if c not in string.letters:
+                q= 0
+                break # disallow invalid non-special-field characters in FS name
+    r= q
+    if p[q:q+1]==':':
+        r= string.find(p, '.', q+1)+1
+        if r==0:
+            r= len(p) # find end of drive name (if any) following FS name (if any)
+    return (p[:q], p[q:r], p[r:])
 
 
 def normcase(p):
+    """
+  Normalize the case of a pathname. This converts to lowercase as the native RISC
+  OS filesystems are case-insensitive. However, not all filesystems have to be,
+  and there's no simple way to find out what type an FS is argh.
   """
-Normalize the case of a pathname. This converts to lowercase as the native RISC
-OS filesystems are case-insensitive. However, not all filesystems have to be,
-and there's no simple way to find out what type an FS is argh.
-"""
-  return string.lower(p)
+    return string.lower(p)
 
 
 def isabs(p):
+    """
+  Return whether a path is absolute. Under RISC OS, a file system specifier does
+  not make a path absolute, but a drive name or number does, and so does using the
+  symbol for root, URD, library, CSD or PSD. This means it is perfectly possible
+  to have an "absolute" URL dependent on the current working directory, and
+  equally you can have a "relative" URL that's on a completely different device to
+  the current one argh.
   """
-Return whether a path is absolute. Under RISC OS, a file system specifier does
-not make a path absolute, but a drive name or number does, and so does using the
-symbol for root, URD, library, CSD or PSD. This means it is perfectly possible
-to have an "absolute" URL dependent on the current working directory, and
-equally you can have a "relative" URL that's on a completely different device to
-the current one argh.
-"""
-  (fs, drive, path)= _split(p)
-  return drive!='' or path[:1] in _roots
+    (fs, drive, path)= _split(p)
+    return drive!='' or path[:1] in _roots
 
 
 def join(a, *p):
+    """
+  Join path elements with the directory separator, replacing the entire path when
+  an absolute or FS-changing path part is found.
   """
-Join path elements with the directory separator, replacing the entire path when
-an absolute or FS-changing path part is found.
-"""
-  j= a
-  for b in p:
-    (fs, drive, path)= _split(b)
-    if fs!='' or drive!='' or path[:1] in _roots:
-      j= b
-    else:
-      j= j+'.'+b
-  return j
+    j= a
+    for b in p:
+        (fs, drive, path)= _split(b)
+        if fs!='' or drive!='' or path[:1] in _roots:
+            j= b
+        else:
+            j= j+'.'+b
+    return j
 
 
 def split(p):
+    """
+  Split a path in head (everything up to the last '.') and tail (the rest). FS
+  name must still be dealt with separately since special field may contain '.'.
   """
-Split a path in head (everything up to the last '.') and tail (the rest). FS
-name must still be dealt with separately since special field may contain '.'.
-"""
-  (fs, drive, path)= _split(p)
-  q= string.rfind(path, '.')
-  if q!=-1:
-    return (fs+drive+path[:q], path[q+1:])
-  return ('', p)
+    (fs, drive, path)= _split(p)
+    q= string.rfind(path, '.')
+    if q!=-1:
+        return (fs+drive+path[:q], path[q+1:])
+    return ('', p)
 
 
 def splitext(p):
+    """
+  Split a path in root and extension. This assumes the 'using slash for dot and
+  dot for slash with foreign files' convention common in RISC OS is in force.
   """
-Split a path in root and extension. This assumes the 'using slash for dot and
-dot for slash with foreign files' convention common in RISC OS is in force.
-"""
-  (tail, head)= split(p)
-  if '/' in head:
-    q= len(head)-string.rfind(head, '/')
-    return (p[:-q], p[-q:])
-  return (p, '')
+    (tail, head)= split(p)
+    if '/' in head:
+        q= len(head)-string.rfind(head, '/')
+        return (p[:-q], p[-q:])
+    return (p, '')
 
 
 def splitdrive(p):
+    """
+  Split a pathname into a drive specification (including FS name) and the rest of
+  the path. The terminating dot of the drive name is included in the drive
+  specification.
   """
-Split a pathname into a drive specification (including FS name) and the rest of
-the path. The terminating dot of the drive name is included in the drive
-specification.
-"""
-  (fs, drive, path)= _split(p)
-  return (fs+drive, p)
+    (fs, drive, path)= _split(p)
+    return (fs+drive, p)
 
 
 def basename(p):
+    """
+  Return the tail (basename) part of a path.
   """
-Return the tail (basename) part of a path.
-"""
-  return split(p)[1]
+    return split(p)[1]
 
 
 def dirname(p):
+    """
+  Return the head (dirname) part of a path.
   """
-Return the head (dirname) part of a path.
-"""
-  return split(p)[0]
+    return split(p)[0]
 
 
 def commonprefix(ps):
+    """
+  Return the longest prefix of all list elements. Purely string-based; does not
+  separate any path parts. Why am I in os.path?
   """
-Return the longest prefix of all list elements. Purely string-based; does not
-separate any path parts. Why am I in os.path?
-"""
-  if len(ps)==0:
-    return ''
-  prefix= ps[0]
-  for p in ps[1:]:
-    prefix= prefix[:len(p)]
-    for i in range(len(prefix)):
-      if prefix[i] <> p[i]:
-        prefix= prefix[:i]
-        if i==0:
-          return ''
-        break
-  return prefix
+    if len(ps)==0:
+        return ''
+    prefix= ps[0]
+    for p in ps[1:]:
+        prefix= prefix[:len(p)]
+        for i in range(len(prefix)):
+            if prefix[i] <> p[i]:
+                prefix= prefix[:i]
+                if i==0:
+                    return ''
+                break
+    return prefix
 
 
 ## File access functions. Why are we in os.path?
 
 def getsize(p):
+    """
+  Return the size of a file, reported by os.stat().
   """
-Return the size of a file, reported by os.stat().
-"""
-  st= os.stat(p)
-  return st[stat.ST_SIZE]
+    st= os.stat(p)
+    return st[stat.ST_SIZE]
 
 
 def getmtime(p):
+    """
+  Return the last modification time of a file, reported by os.stat().
   """
-Return the last modification time of a file, reported by os.stat().
-"""
-  st = os.stat(p)
-  return st[stat.ST_MTIME]
+    st = os.stat(p)
+    return st[stat.ST_MTIME]
 
 getatime= getmtime
 
@@ -200,40 +200,40 @@
 # RISC OS-specific file access functions
 
 def exists(p):
+    """
+  Test whether a path exists.
   """
-Test whether a path exists.
-"""
-  try:
-    return swi.swi('OS_File', '5s;i', p)!=0
-  except swi.error:
-    return 0
+    try:
+        return swi.swi('OS_File', '5s;i', p)!=0
+    except swi.error:
+        return 0
 
 
 def isdir(p):
+    """
+  Is a path a directory? Includes image files.
   """
-Is a path a directory? Includes image files.
-"""
-  try:
-    return swi.swi('OS_File', '5s;i', p) in [2, 3]
-  except swi.error:
-    return 0
+    try:
+        return swi.swi('OS_File', '5s;i', p) in [2, 3]
+    except swi.error:
+        return 0
 
 
 def isfile(p):
+    """
+  Test whether a path is a file, including image files.
   """
-Test whether a path is a file, including image files.
-"""
-  try:
-    return swi.swi('OS_File', '5s;i', p) in [1, 3]
-  except swi.error:
-    return 0
+    try:
+        return swi.swi('OS_File', '5s;i', p) in [1, 3]
+    except swi.error:
+        return 0
 
 
 def islink(p):
+    """
+  RISC OS has no links or mounts.
   """
-RISC OS has no links or mounts.
-"""
-  return _false
+    return _false
 
 ismount= islink
 
@@ -246,23 +246,23 @@
 # assume it's running on RISC OS (unlike normpath).
 
 def samefile(fa, fb):
+    """
+  Test whether two pathnames reference the same actual file.
   """
-Test whether two pathnames reference the same actual file.
-"""
-  l= 512
-  b= swi.block(l)
-  swi.swi('OS_FSControl', 'isb..i', 37, fa, b, l)
-  fa= b.ctrlstring()
-  swi.swi('OS_FSControl', 'isb..i', 37, fb, b, l)
-  fb= b.ctrlstring()
-  return fa==fb
+    l= 512
+    b= swi.block(l)
+    swi.swi('OS_FSControl', 'isb..i', 37, fa, b, l)
+    fa= b.ctrlstring()
+    swi.swi('OS_FSControl', 'isb..i', 37, fb, b, l)
+    fb= b.ctrlstring()
+    return fa==fb
 
 
 def sameopenfile(a, b):
+    """
+  Test whether two open file objects reference the same file.
   """
-Test whether two open file objects reference the same file.
-"""
-  return os.fstat(a)[stat.ST_INO]==os.fstat(b)[stat.ST_INO]
+    return os.fstat(a)[stat.ST_INO]==os.fstat(b)[stat.ST_INO]
 
 
 ## Path canonicalisation
@@ -271,93 +271,92 @@
 # practice never used, for anything.
 
 def expanduser(p):
-  (fs, drive, path)= _split(p)
-  l= 512
-  b= swi.block(l)
+    (fs, drive, path)= _split(p)
+    l= 512
+    b= swi.block(l)
 
-  if path[:1]!='@':
-    return p
-  if fs=='':
-    fsno= swi.swi('OS_Args', '00;i')
-    swi.swi('OS_FSControl', 'iibi', 33, fsno, b, l)
-    fsname= b.ctrlstring()
-  else:
-    if fs[:1]=='-':
-      fsname= fs[1:-1]
+    if path[:1]!='@':
+        return p
+    if fs=='':
+        fsno= swi.swi('OS_Args', '00;i')
+        swi.swi('OS_FSControl', 'iibi', 33, fsno, b, l)
+        fsname= b.ctrlstring()
     else:
-      fsname= fs[:-1]
-    fsname= string.split(fsname, '#', 1)[0] # remove special field from fs
-  x= swi.swi('OS_FSControl', 'ib2s.i;.....i', 54, b, fsname, l)
-  if x<l:
-    urd= b.tostring(0, l-x-1)
-  else: # no URD! try CSD
-    x= swi.swi('OS_FSControl', 'ib0s.i;.....i', 54, b, fsname, l)
+        if fs[:1]=='-':
+            fsname= fs[1:-1]
+        else:
+            fsname= fs[:-1]
+        fsname= string.split(fsname, '#', 1)[0] # remove special field from fs
+    x= swi.swi('OS_FSControl', 'ib2s.i;.....i', 54, b, fsname, l)
     if x<l:
-      urd= b.tostring(0, l-x-1)
-    else: # no CSD! use root
-      urd= '$'
-  return fsname+':'+urd+path[1:]
+        urd= b.tostring(0, l-x-1)
+    else: # no URD! try CSD
+        x= swi.swi('OS_FSControl', 'ib0s.i;.....i', 54, b, fsname, l)
+        if x<l:
+            urd= b.tostring(0, l-x-1)
+        else: # no CSD! use root
+            urd= '$'
+    return fsname+':'+urd+path[1:]
 
 # Environment variables are in angle brackets.
 
 def expandvars(p):
+    """
+  Expand environment variables using OS_GSTrans.
   """
-Expand environment variables using OS_GSTrans.
-"""
-  l= 512
-  b= swi.block(l)
-  return b.tostring(0, swi.swi('OS_GSTrans', 'sbi;..i', p, b, l))
+    l= 512
+    b= swi.block(l)
+    return b.tostring(0, swi.swi('OS_GSTrans', 'sbi;..i', p, b, l))
 
 
 # Return an absolute path.
 
 def abspath(p):
-  return normpath(join(os.getcwd(), p))
+    return normpath(join(os.getcwd(), p))
 
 
 # Normalize a path. Only special path element under RISC OS is "^" for "..".
 
 def normpath(p):
+    """
+  Normalize path, eliminating up-directory ^s.
   """
-Normalize path, eliminating up-directory ^s.
-"""
-  (fs, drive, path)= _split(p)
-  rhs= ''
-  ups= 0
-  while path!='':
-    (path, el)= split(path)
-    if el=='^':
-      ups= ups+1
-    else:
-      if ups>0:
-        ups= ups-1
-      else:
-        if rhs=='':
-          rhs= el
+    (fs, drive, path)= _split(p)
+    rhs= ''
+    ups= 0
+    while path!='':
+        (path, el)= split(path)
+        if el=='^':
+            ups= ups+1
         else:
-          rhs= el+'.'+rhs
-  while ups>0:
-    ups= ups-1
-    rhs= '^.'+rhs
-  return fs+drive+rhs
+            if ups>0:
+                ups= ups-1
+            else:
+                if rhs=='':
+                    rhs= el
+                else:
+                    rhs= el+'.'+rhs
+    while ups>0:
+        ups= ups-1
+        rhs= '^.'+rhs
+    return fs+drive+rhs
 
 
 # Directory tree walk.
 # Independent of host system. Why am I in os.path?
 
 def walk(top, func, arg):
+    """
+  walk(top,func,args) calls func(arg, d, files) for each directory "d" in the tree
+  rooted at "top" (including "top" itself). "files" is a list of all the files and
+  subdirs in directory "d".
   """
-walk(top,func,args) calls func(arg, d, files) for each directory "d" in the tree
-rooted at "top" (including "top" itself). "files" is a list of all the files and
-subdirs in directory "d".
-"""
-  try:
-    names= os.listdir(top)
-  except os.error:
-    return
-  func(arg, top, names)
-  for name in names:
-    name= join(top, name)
-    if isdir(name) and not islink(name):
-       walk(name, func, arg)
-
+    try:
+        names= os.listdir(top)
+    except os.error:
+        return
+    func(arg, top, names)
+    for name in names:
+        name= join(top, name)
+        if isdir(name) and not islink(name):
+            walk(name, func, arg)
diff --git a/Lib/plat-riscos/rourl2path.py b/Lib/plat-riscos/rourl2path.py
index 033e621..522d7ea 100644
--- a/Lib/plat-riscos/rourl2path.py
+++ b/Lib/plat-riscos/rourl2path.py
@@ -13,70 +13,70 @@
     #
     tp = urllib.splittype(pathname)[0]
     if tp and tp <> 'file':
-	raise RuntimeError, 'Cannot convert non-local URL to pathname'
+        raise RuntimeError, 'Cannot convert non-local URL to pathname'
     components = string.split(pathname, '/')
     # Remove . and embedded ..
     i = 0
     while i < len(components):
-	if components[i] == '.':
-	    del components[i]
-	elif components[i] == '..' and i > 0 and \
-				  components[i-1] not in ('', '..'):
-	    del components[i-1:i+1]
-	    i = i-1
-	elif components[i] == '' and i > 0 and components[i-1] <> '':
-	    del components[i]
-	else:
-	    if components[i]<>'..' and string.find(components[i], '.')<>-1 :
-	        components[i] = string.join(string.split(components[i],'.'),'/')
-	    i = i+1
+        if components[i] == '.':
+            del components[i]
+        elif components[i] == '..' and i > 0 and \
+                                  components[i-1] not in ('', '..'):
+            del components[i-1:i+1]
+            i = i-1
+        elif components[i] == '' and i > 0 and components[i-1] <> '':
+            del components[i]
+        else:
+            if components[i]<>'..' and string.find(components[i], '.')<>-1 :
+                components[i] = string.join(string.split(components[i],'.'),'/')
+            i = i+1
     if not components[0]:
-	# Absolute unix path, don't start with colon
-	return string.join(components[1:], '.')
+        # Absolute unix path, don't start with colon
+        return string.join(components[1:], '.')
     else:
-	# relative unix path, start with colon. First replace
-	# leading .. by empty strings (giving ::file)
-	i = 0
-	while i < len(components) and components[i] == '..':
-	    components[i] = '^'
-	    i = i + 1
-	return string.join(components, '.')
+        # relative unix path, start with colon. First replace
+        # leading .. by empty strings (giving ::file)
+        i = 0
+        while i < len(components) and components[i] == '..':
+            components[i] = '^'
+            i = i + 1
+        return string.join(components, '.')
 
 def pathname2url(pathname):
     "convert mac pathname to /-delimited pathname"
     if '/' in pathname:
-	raise RuntimeError, "Cannot convert pathname containing slashes"
+        raise RuntimeError, "Cannot convert pathname containing slashes"
     components = string.split(pathname, ':')
     # Replace empty string ('::') by .. (will result in '/../' later)
     for i in range(1, len(components)):
-	if components[i] == '':
-	    components[i] = '..'
+        if components[i] == '':
+            components[i] = '..'
     # Truncate names longer than 31 bytes
     components = map(lambda x: x[:31], components)
 
     if os.path.isabs(pathname):
-	return '/' + string.join(components, '/')
+        return '/' + string.join(components, '/')
     else:
-	return string.join(components, '/')
+        return string.join(components, '/')
 
 def test():
     for url in ["index.html",
                 "/SCSI::SCSI4/$/Anwendung/Comm/Apps/!Fresco/Welcome",
                 "../index.html",
-		"bar/index.html",
-		"/foo/bar/index.html",
-		"/foo/bar/",
-		"/"]:
-	print `url`, '->', `url2pathname(url)`
+                "bar/index.html",
+                "/foo/bar/index.html",
+                "/foo/bar/",
+                "/"]:
+        print `url`, '->', `url2pathname(url)`
     for path in ["drive:",
-		 "drive:dir:",
-		 "drive:dir:file",
-		 "drive:file",
-		 "file",
-		 ":file",
-		 ":dir:",
-		 ":dir:file"]:
-	print `path`, '->', `pathname2url(path)`
+                 "drive:dir:",
+                 "drive:dir:file",
+                 "drive:file",
+                 "file",
+                 ":file",
+                 ":dir:",
+                 ":dir:file"]:
+        print `path`, '->', `pathname2url(path)`
 
 if __name__ == '__main__':
     test()
