summaryrefslogtreecommitdiffstats
path: root/Mac/scripts/unshar.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/scripts/unshar.py')
-rw-r--r--Mac/scripts/unshar.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/Mac/scripts/unshar.py b/Mac/scripts/unshar.py
new file mode 100644
index 0000000..fa60e5a
--- /dev/null
+++ b/Mac/scripts/unshar.py
@@ -0,0 +1,71 @@
+# Extract files from a SHAR archive.
+# Run this on the Mac.
+# Usage:
+# >>> import unshar
+# >>> f = open('SHAR')
+# >>> unshar.unshar(f)
+
+import string
+
+def unshar(fp, verbose=0, overwrite=0):
+ ofp = None
+ file = None
+ while 1:
+ line = fp.readline()
+ if verbose > 3: print 'Got:', `line`
+ if line[:1] == 'X':
+ # Most common case first
+ if ofp: ofp.write(line[1:])
+ continue
+ if not line:
+ if verbose: print 'EOF'
+ if ofp:
+ print 'Unterminated file -- closing'
+ ofp.close()
+ ofp = None
+ break
+ if line[0] == '#':
+ if verbose: print line,
+ continue
+ if line[:14] == 'sed "s/^X//" >':
+ if verbose: print "!!!", `line`
+ i = string.find(line, "'")
+ j = string.find(line, "'", i+1)
+ if i >= 0 and j > i:
+ file = line[i+1:j]
+ if '/' in file:
+ words = string.splitfields(file, '/')
+ for funny in '', '.':
+ while funny in words: words.remove(funny)
+ for i in range(len(words)):
+ if words[i] == '..': words[i] = ''
+ words.insert(0, '')
+ file = string.joinfields(words, ':')
+ try:
+ ofp = open(file, 'r')
+ ofp.close()
+ ofp = None
+ over = 1
+ except IOError:
+ over = 0
+ if over and not overwrite:
+ print 'Skipping', file, '(already exists) ...'
+ continue
+ ofp = open(file, 'w')
+ if over:
+ print 'Overwriting', file, '...'
+ else:
+ print 'Writing', file, '...'
+ continue
+ if line == 'END_OF_FILE\n':
+ if not file:
+ print 'Unexpected END_OF_FILE marker'
+ if ofp:
+ print 'done'
+ ofp.close()
+ ofp = None
+ else:
+ print 'done skipping'
+ file = None
+ continue
+ if verbose: print "...", `line`