10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Module 'os2emxpath' -- common operations on OS/2 pathnames
20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""Common pathname manipulations, OS/2 EMX version.
30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
40a8c90248264a8b26970b4473770bcc3df8515fJosh GaoInstead of importing this module directly, import os and refer to this
50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaomodule as os.path.
60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""
70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
80a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os
90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport stat
100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom genericpath import *
110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom ntpath import (expanduser, expandvars, isabs, islink, splitdrive,
120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao                    splitext, split, walk)
130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "basename","dirname","commonprefix","getsize","getmtime",
160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "getatime","getctime", "islink","exists","lexists","isdir","isfile",
170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "ismount","walk","expanduser","expandvars","normpath","abspath",
180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "splitunc","curdir","pardir","sep","pathsep","defpath","altsep",
190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao           "extsep","devnull","realpath","supports_unicode_filenames"]
200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# strings representing various path-related bits and pieces
220a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocurdir = '.'
230a8c90248264a8b26970b4473770bcc3df8515fJosh Gaopardir = '..'
240a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoextsep = '.'
250a8c90248264a8b26970b4473770bcc3df8515fJosh Gaosep = '/'
260a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoaltsep = '\\'
270a8c90248264a8b26970b4473770bcc3df8515fJosh Gaopathsep = ';'
280a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodefpath = '.;C:\\bin'
290a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodevnull = 'nul'
300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Normalize the case of a pathname and map slashes to backslashes.
320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Other normalizations (such as optimizing '../' away) are not done
330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# (this is done by normpath).
340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
350a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef normcase(s):
360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Normalize case of pathname.
370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    Makes all characters lowercase and all altseps into seps."""
390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return s.replace('\\', '/').lower()
400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Join two (or more) paths.
430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
440a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef join(a, *p):
450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Join two or more pathname components, inserting sep as needed"""
460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    path = a
470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    for b in p:
480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if isabs(b):
490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            path = b
500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        elif path == '' or path[-1:] in '/\\:':
510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            path = path + b
520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            path = path + '/' + b
540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return path
550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Parse UNC paths
580a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef splitunc(p):
590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Split a pathname into UNC mount point and relative path specifiers.
600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    Return a 2-tuple (unc, rest); either part may be empty.
620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    If unc is not empty, it has the form '//host/mount' (or similar
630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    using backslashes).  unc+rest is always the input path.
640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    Paths containing drive letters never have an UNC part.
650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """
660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if p[1:2] == ':':
670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        return '', p # Drive letter present
680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    firstTwo = p[0:2]
690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if firstTwo == '/' * 2 or firstTwo == '\\' * 2:
700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # is a UNC path:
710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter
720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        # \\machine\mountpoint\directories...
730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        #           directory ^^^^^^^^^^^^^^^
740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        normp = normcase(p)
750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        index = normp.find('/', 2)
760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if index == -1:
770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            ##raise RuntimeError, 'illegal UNC path: "' + p + '"'
780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            return ("", p)
790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        index = normp.find('/', index + 1)
800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if index == -1:
810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            index = len(p)
820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        return p[:index], p[index:]
830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return '', p
840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return the tail (basename) part of a path.
870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
880a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef basename(p):
890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Returns the final component of a pathname"""
900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return split(p)[1]
910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return the head (dirname) part of a path.
940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
950a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef dirname(p):
960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Returns the directory component of a pathname"""
970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return split(p)[0]
980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# alias exists to lexists
1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gaolexists = exists
1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Is a path a directory?
1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Is a path a mount point?  Either a root (with or without drive letter)
1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# or an UNC path with at most a / or \ after the mount point.
1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef ismount(path):
1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Test whether a path is a mount point (defined as root of drive)"""
1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    unc, rest = splitunc(path)
1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if unc:
1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        return rest in ("", "/", "\\")
1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    p = splitdrive(path)[1]
1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return len(p) == 1 and p[0] in '/\\'
1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef normpath(path):
1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Normalize path, eliminating double slashes, etc."""
1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    path = path.replace('\\', '/')
1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    prefix, path = splitdrive(path)
1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    while path[:1] == '/':
1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        prefix = prefix + '/'
1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        path = path[1:]
1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    comps = path.split('/')
1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    i = 0
1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    while i < len(comps):
1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if comps[i] == '.':
1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            del comps[i]
1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            del comps[i-1:i+1]
1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            i = i - 1
1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        elif comps[i] == '' and i > 0 and comps[i-1] != '':
1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            del comps[i]
1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            i = i + 1
1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    # If the path is now empty, substitute '.'
1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if not prefix and not comps:
1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        comps.append('.')
1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return prefix + '/'.join(comps)
1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return an absolute path.
1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef abspath(path):
1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    """Return the absolute version of a path"""
1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    if not isabs(path):
1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        if isinstance(path, unicode):
1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            cwd = os.getcwdu()
1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        else:
1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao            cwd = os.getcwd()
1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao        path = join(cwd, path)
1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao    return normpath(path)
1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# realpath is a no-op on systems without islink support
1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gaorealpath = abspath
1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao
1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gaosupports_unicode_filenames = False
160