98 lines
2.1 KiB
Python
98 lines
2.1 KiB
Python
# Extract files from a SHAR archive.
|
|
# Run this on the Mac.
|
|
# Usage:
|
|
# >>> import unshar
|
|
# >>> f = open('SHAR')
|
|
# >>> unshar.unshar(f)
|
|
|
|
import string
|
|
import EasyDialogs
|
|
|
|
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`
|
|
|
|
def main():
|
|
import sys
|
|
import os
|
|
if len(sys.argv) > 1:
|
|
for fname in sys.argv[1:]:
|
|
fp = open(fname, 'r')
|
|
dir, fn = os.path.split(fname)
|
|
if dir:
|
|
os.chdir(dir)
|
|
unshar(fp)
|
|
else:
|
|
import macfs
|
|
fname = EasyDialogs.AskFileForOpen()
|
|
if not fname:
|
|
sys.exit(0)
|
|
fp = open(fname, 'r')
|
|
dirname = EasyDialogs.AskFolder(message='Folder to save files in:')
|
|
if not dirname:
|
|
sys.exit(0)
|
|
os.chdir(dirname)
|
|
unshar(fp)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|