diff options
Diffstat (limited to 'Lib/plat-riscos/riscospath.py')
-rw-r--r-- | Lib/plat-riscos/riscospath.py | 405 |
1 files changed, 202 insertions, 203 deletions
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) |