| import getopt |
| import sys |
| try: |
| from StringIO import StringIO |
| except ImportError: |
| from io import StringIO |
| |
| def convertToCaretAndMNotation(data): |
| newdata = StringIO() |
| if isinstance(data, str): |
| data = bytearray(data) |
| |
| for intval in data: |
| if intval == 9 or intval == 10: |
| newdata.write(chr(intval)) |
| continue |
| if intval > 127: |
| intval = intval -128 |
| newdata.write("M-") |
| if intval < 32: |
| newdata.write("^") |
| newdata.write(chr(intval+64)) |
| elif intval == 127: |
| newdata.write("^?") |
| else: |
| newdata.write(chr(intval)) |
| |
| return newdata.getvalue().encode() |
| |
| |
| def main(argv): |
| arguments = argv[1:] |
| short_options = "v" |
| long_options = ["show-nonprinting"] |
| show_nonprinting = False; |
| |
| try: |
| options, filenames = getopt.gnu_getopt(arguments, short_options, long_options) |
| except getopt.GetoptError as err: |
| sys.stderr.write("Unsupported: 'cat': %s\n" % str(err)) |
| sys.exit(1) |
| |
| for option, value in options: |
| if option == "-v" or option == "--show-nonprinting": |
| show_nonprinting = True; |
| |
| writer = getattr(sys.stdout, 'buffer', None) |
| if writer is None: |
| writer = sys.stdout |
| if sys.platform == "win32": |
| import os, msvcrt |
| msvcrt.setmode(sys.stdout.fileno(),os.O_BINARY) |
| for filename in filenames: |
| try: |
| fileToCat = open(filename,"rb") |
| contents = fileToCat.read() |
| if show_nonprinting: |
| contents = convertToCaretAndMNotation(contents) |
| writer.write(contents) |
| sys.stdout.flush() |
| fileToCat.close() |
| except IOError as error: |
| sys.stderr.write(str(error)) |
| sys.exit(1) |
| |
| if __name__ == "__main__": |
| main(sys.argv) |