aboutsummaryrefslogtreecommitdiff
path: root/lib/macglob.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/macglob.py')
-rw-r--r--lib/macglob.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/macglob.py b/lib/macglob.py
new file mode 100644
index 0000000..cad2c79
--- /dev/null
+++ b/lib/macglob.py
@@ -0,0 +1,46 @@
+# Module 'macglob' -- version of 'glob' for the Macintosh.
+
+# XXX At least one bug is left: a pattern like '*:' is treated
+# XXX as a relative pathname (and returns as if it was ':*:').
+
+import mac
+import macpath
+import fnmatch
+
+def glob(pathname):
+ if not has_magic(pathname): return [pathname]
+ dirname, basename = macpath.split(pathname)
+ if has_magic(dirname):
+ if dirname[-1:] = ':': dirname = dirname[:-1]
+ list = glob(dirname)
+ else:
+ list = [dirname]
+ if not has_magic(basename):
+ result = []
+ for dirname in list:
+ if basename or macpath.isdir(dirname):
+ name = macpath.cat(dirname, basename)
+ if macpath.exists(name):
+ result.append(name)
+ else:
+ result = []
+ for dirname in list:
+ sublist = glob1(dirname, basename)
+ for name in sublist:
+ result.append(macpath.cat(dirname, name))
+ return result
+
+def glob1(dirname, pattern):
+ if not dirname: dirname = ':'
+ try:
+ names = mac.listdir(dirname)
+ except mac.error:
+ return []
+ result = []
+ for name in names:
+ if name[0] <> '.' or pattern[0] = '.':
+ if fnmatch.fnmatch(name, pattern): result.append(name)
+ return result
+
+def has_magic(s):
+ return '*' in s or '?' in s or '[' in s