diff options
-rw-r--r-- | Lib/plat-riscos/riscosenviron.py | 1 | ||||
-rw-r--r-- | Lib/plat-riscos/riscospath.py | 405 | ||||
-rw-r--r-- | Lib/plat-riscos/rourl2path.py | 80 |
3 files changed, 242 insertions, 244 deletions
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 @@ class _Environ: 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 @@ as os.path. 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 @@ _allowMOSFSNames= _false ## 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: + 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: - 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:]) + 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 @@ getatime= getmtime # 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 @@ ismount= islink # 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 @@ Test whether two open file objects reference the same file. # practice never used, for anything. def expanduser(p): - (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] + (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: - 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 @@ def url2pathname(pathname): # 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() |