72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
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)
|