14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Module 'os2emxpath' -- common operations on OS/2 pathnames
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Common pathname manipulations, OS/2 EMX version.
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoInstead of importing this module directly, import os and refer to this
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomodule as os.path.
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport stat
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom genericpath import *
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ntpath import (expanduser, expandvars, isabs, islink, splitdrive,
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    splitext, split, walk)
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["normcase","isabs","join","splitdrive","split","splitext",
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "basename","dirname","commonprefix","getsize","getmtime",
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "getatime","getctime", "islink","exists","lexists","isdir","isfile",
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "ismount","walk","expanduser","expandvars","normpath","abspath",
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "splitunc","curdir","pardir","sep","pathsep","defpath","altsep",
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "extsep","devnull","realpath","supports_unicode_filenames"]
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# strings representing various path-related bits and pieces
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocurdir = '.'
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopardir = '..'
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoextsep = '.'
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosep = '/'
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaltsep = '\\'
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopathsep = ';'
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodefpath = '.;C:\\bin'
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodevnull = 'nul'
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Normalize the case of a pathname and map slashes to backslashes.
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Other normalizations (such as optimizing '../' away) are not done
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# (this is done by normpath).
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef normcase(s):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Normalize case of pathname.
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Makes all characters lowercase and all altseps into seps."""
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return s.replace('\\', '/').lower()
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Join two (or more) paths.
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef join(a, *p):
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Join two or more pathname components, inserting sep as needed"""
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path = a
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for b in p:
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isabs(b):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            path = b
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif path == '' or path[-1:] in '/\\:':
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            path = path + b
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            path = path + '/' + b
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return path
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Parse UNC paths
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef splitunc(p):
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Split a pathname into UNC mount point and relative path specifiers.
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Return a 2-tuple (unc, rest); either part may be empty.
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If unc is not empty, it has the form '//host/mount' (or similar
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    using backslashes).  unc+rest is always the input path.
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Paths containing drive letters never have an UNC part.
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if p[1:2] == ':':
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '', p # Drive letter present
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    firstTwo = p[0:2]
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if firstTwo == '/' * 2 or firstTwo == '\\' * 2:
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # is a UNC path:
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # \\machine\mountpoint\directories...
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #           directory ^^^^^^^^^^^^^^^
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        normp = normcase(p)
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        index = normp.find('/', 2)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if index == -1:
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ##raise RuntimeError, 'illegal UNC path: "' + p + '"'
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return ("", p)
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        index = normp.find('/', index + 1)
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if index == -1:
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            index = len(p)
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return p[:index], p[index:]
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return '', p
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return the tail (basename) part of a path.
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef basename(p):
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Returns the final component of a pathname"""
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return split(p)[1]
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return the head (dirname) part of a path.
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef dirname(p):
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Returns the directory component of a pathname"""
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return split(p)[0]
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# alias exists to lexists
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaolexists = exists
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Is a path a directory?
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Is a path a mount point?  Either a root (with or without drive letter)
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# or an UNC path with at most a / or \ after the mount point.
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef ismount(path):
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Test whether a path is a mount point (defined as root of drive)"""
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    unc, rest = splitunc(path)
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if unc:
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return rest in ("", "/", "\\")
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    p = splitdrive(path)[1]
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return len(p) == 1 and p[0] in '/\\'
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef normpath(path):
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Normalize path, eliminating double slashes, etc."""
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    path = path.replace('\\', '/')
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    prefix, path = splitdrive(path)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    while path[:1] == '/':
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prefix = prefix + '/'
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        path = path[1:]
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    comps = path.split('/')
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    i = 0
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    while i < len(comps):
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if comps[i] == '.':
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del comps[i]
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del comps[i-1:i+1]
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = i - 1
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif comps[i] == '' and i > 0 and comps[i-1] != '':
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del comps[i]
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = i + 1
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # If the path is now empty, substitute '.'
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not prefix and not comps:
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        comps.append('.')
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return prefix + '/'.join(comps)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return an absolute path.
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef abspath(path):
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Return the absolute version of a path"""
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not isabs(path):
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(path, unicode):
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cwd = os.getcwdu()
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cwd = os.getcwd()
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        path = join(cwd, path)
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return normpath(path)
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# realpath is a no-op on systems without islink support
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaorealpath = abspath
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosupports_unicode_filenames = False
160