home *** CD-ROM | disk | FTP | other *** search
- # module 'macpath' -- pathname (or -related) operations for the Macintosh
-
- import string
- import os
- from stat import *
-
-
- # Normalize the case of a pathname. Dummy in Posix, but string.lower here.
-
- normcase = string.lower
-
-
- # Return true if a path is absolute.
- # On the Mac, relative paths begin with a colon,
- # but as a special case, paths with no colons at all are also relative.
- # Anything else is absolute (the string up to the first colon is the
- # volume name).
-
- def isabs(s):
- return ':' in s and s[0] <> ':'
-
-
- def join(s, *p):
- path = s
- for t in p:
- if (not s) or isabs(t):
- path = t
- continue
- if t[:1] == ':':
- t = t[1:]
- if ':' not in path:
- path = ':' + path
- if path[-1:] <> ':':
- path = path + ':'
- path = path + t
- return path
-
-
- # Split a pathname in two parts: the directory leading up to the final bit,
- # and the basename (the filename, without colons, in that directory).
- # The result (s, t) is such that join(s, t) yields the original argument.
-
- def split(s):
- if ':' not in s: return '', s
- colon = 0
- for i in range(len(s)):
- if s[i] == ':': colon = i+1
- path, file = s[:colon-1], s[colon:]
- if path and not ':' in path:
- path = path + ':'
- return path, file
-
-
- # Split a path in root and extension.
- # The extension is everything starting at the last dot in the last
- # pathname component; the root is everything before that.
- # It is always true that root + ext == p.
-
- def splitext(p):
- root, ext = '', ''
- for c in p:
- if c == ':':
- root, ext = root + ext + c, ''
- elif c == '.':
- if ext:
- root, ext = root + ext, c
- else:
- ext = c
- elif ext:
- ext = ext + c
- else:
- root = root + c
- return root, ext
-
-
- # Split a pathname into a drive specification and the rest of the
- # path. Useful on DOS/Windows/NT; on the Mac, the drive is always
- # empty (don't use the volume name -- it doesn't have the same
- # syntactic and semantic oddities as DOS drive letters, such as there
- # being a separate current directory per drive).
-
- def splitdrive(p):
- return '', p
-
-
- # Short interfaces to split()
-
- def dirname(s): return split(s)[0]
- def basename(s): return split(s)[1]
-
-
- # Return true if the pathname refers to an existing directory.
-
- def isdir(s):
- try:
- st = os.stat(s)
- except os.error:
- return 0
- return S_ISDIR(st[ST_MODE])
-
-
- # Get size, mtime, atime of files.
-
- def getsize(filename):
- """Return the size of a file, reported by os.stat()."""
- st = os.stat(filename)
- return st[stat.ST_SIZE]
-
- def getmtime(filename):
- """Return the last modification time of a file, reported by os.stat()."""
- st = os.stat(filename)
- return st[stat.ST_MTIME]
-
- def getatime(filename):
- """Return the last access time of a file, reported by os.stat()."""
- st = os.stat(filename)
- return st[stat.ST_MTIME]
-
-
- # Return true if the pathname refers to a symbolic link.
- # (Always false on the Mac, until we understand Aliases.)
-
- def islink(s):
- return 0
-
-
- # Return true if the pathname refers to an existing regular file.
-
- def isfile(s):
- try:
- st = os.stat(s)
- except os.error:
- return 0
- return S_ISREG(st[ST_MODE])
-
-
- # Return true if the pathname refers to an existing file or directory.
-
- def exists(s):
- try:
- st = os.stat(s)
- except os.error:
- return 0
- return 1
-
- #
- # dummy expandvars to retain interface-compatability with other
- # operating systems.
- def expandvars(path):
- return path
-
- #
- # dummy expanduser to retain interface-compatability with other
- # operating systems.
- def expanduser(path):
- return path
-
- # Normalize a pathname: get rid of '::' sequences by backing up,
- # e.g., 'foo:bar::bletch' becomes 'foo:bletch'.
- # Raise the exception norm_error below if backing up is impossible,
- # e.g., for '::foo'.
- # XXX The Unix version doesn't raise an exception but simply
- # returns an unnormalized path. Should do so here too.
-
- norm_error = 'macpath.norm_error: path cannot be normalized'
-
- def normpath(s):
- import string
- if ':' not in s:
- return ':' + s
- f = string.splitfields(s, ':')
- pre = []
- post = []
- if not f[0]:
- pre = f[:1]
- f = f[1:]
- if not f[len(f)-1]:
- post = f[-1:]
- f = f[:-1]
- res = []
- for seg in f:
- if seg:
- res.append(seg)
- else:
- if not res: raise norm_error, 'path starts with ::'
- del res[len(res)-1]
- if not (pre or res):
- raise norm_error, 'path starts with volume::'
- if pre: res = pre + res
- if post: res = res + post
- s = res[0]
- for seg in res[1:]:
- s = s + ':' + seg
- return s
-
-
- # Directory tree walk.
- # For each directory under top (including top itself),
- # func(arg, dirname, filenames) is called, where
- # dirname is the name of the directory and filenames is the list
- # of files (and subdirectories etc.) in the directory.
- # The func may modify the filenames list, to implement a filter,
- # or to impose a different order of visiting.
-
- def walk(top, 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):
- walk(name, func, arg)
-
-
- # Return an absolute path.
- def abspath(path):
- if not isabs(path):
- path = join(os.getcwd(), path)
- return normpath(path)
-