if exit: sys.exit(0)
-def usage(code=0):
+def usage(code=0, errormsg=''):
version(0)
sys.stdout.write("""\
-Usage: %s [-h|--help] [-V|--version] [-cCDP] [-f charset] [-d header] [-p header:param] [-beit mask] [filename]
+Usage: %s [-h|--help] [-V|--version] [-cCDP] [-f charset] [-d header] [-p header:param] [-beit mask] [-o output_file] [input_file [output_file]]
""" % me)
+ if errormsg:
+ sys.stderr.write(errormsg + '\n')
sys.exit(code)
-def output(s, outfile=sys.stdout):
- outfile.write(s)
+def output(s):
+ gopts.outfile.write(s)
-def output_headers(msg, outfile=sys.stdout):
+def output_headers(msg):
unix_from = msg.get_unixfrom()
if unix_from:
output(unix_from + '\n')
for key, value in msg.items():
- output("%s: %s\n" % (key, value), outfile)
- output("\n", outfile) # End of headers
+ output("%s: %s\n" % (key, value))
+ output("\n") # End of headers
def recode(s, charset):
ignore_mask = [] # Ignore (skip, do not decode and do not include into output)
error_mask = [] # Raise error if encounter one of these
+ input_filename = None
+ output_filename = None
+
gopts = GlobalOptions
-def init():
+def get_opt():
from getopt import getopt, GetoptError
try:
- options, arguments = getopt(sys.argv[1:], 'hVcCDPf:d:p:b:e:i:t:',
+ options, arguments = getopt(sys.argv[1:], 'hVcCDPf:d:p:b:e:i:t:o:',
['help', 'version'])
except GetoptError:
usage(1)
gopts.ignore_mask.append(value)
elif option == '-e':
gopts.error_mask.append(value)
+ elif option == '-o':
+ gopts.output_filename = value
else:
usage(1)
if __name__ == "__main__":
- arguments = init()
+ arguments = get_opt()
la = len(arguments)
- if la >= 2:
- usage(1)
- if (la == 0) or (arguments[0] == '-'):
+ if la == 0:
+ gopts.input_filename = '-'
+ gopts.output_filename = '-'
infile = sys.stdin
+ outfile = sys.stdout
+ elif la in (1, 2):
+ if (arguments[0] == '-'):
+ gopts.input_filename = '-'
+ infile = sys.stdin
+ else:
+ gopts.input_filename = arguments[0]
+ infile = open(arguments[0], 'r')
+ if la == 1:
+ if gopts.output_filename:
+ outfile = open(gopts.output_filename, 'w')
+ else:
+ gopts.output_filename = '-'
+ outfile = sys.stdout
+ elif la == 2:
+ if gopts.output_filename:
+ usage(1, 'Too many output filenames')
+ if (arguments[1] == '-'):
+ gopts.output_filename = '-'
+ outfile = sys.stdout
+ else:
+ gopts.output_filename = arguments[1]
+ outfile = open(arguments[1], 'w')
else:
- infile = open(arguments[0], 'r')
+ usage(1, 'Too many arguments')
+
+ if (infile is sys.stdin) and (outfile is sys.stdout) and \
+ sys.stdin.isatty() and sys.stdout.isatty():
+ usage(1, 'Filtering from console to console is forbidden')
+ gopts.outfile = outfile
decode_file(infile)
+
+ infile.close()
+ outfile.close()