#!/usr/bin/python3 """Like *ix head, but allows arbitrary line terminators.""" import os import sys sys.path.insert(0, '/usr/local/lib') sys.path.insert(0, os.path.expanduser('~/lib')) import readline0 # noqa: E402 def usage(retval): """Output a usage message.""" sys.stderr.write('Usage: %s [-n lines] [-d delimiter] [-h]\n' % (sys.argv[0], )) sys.stderr.write('-n lines\tsays to output so many lines\n') sys.stderr.write('-d delimiter\tsays separate lines on "delimiter", not on a null byte\n') sys.stderr.write('-h\tsays to output this help message\n') sys.stderr.write('-v\tsays to operate verbosely\n') sys.exit(retval) number_of_lines = -1 delimiter = b'\0' verbose = False while sys.argv[1:]: if sys.argv[1] == '-n' and sys.argv[2:]: number_of_lines = int(sys.argv[2]) del sys.argv[1] elif sys.argv[1] == '-d' and sys.argv[2:]: delimiter = sys.argv[2] if len(delimiter) != 1: # Actually, multi-character delimiters might be fine. I've not tested that. sys.stderr.write('Sorry, your delimiter %s is invalid. It must be a single character\n' % delimiter) usage(1) del sys.argv[1] elif sys.argv[1] == '-h': usage(0) elif sys.argv[1] == '-v': verbose = True else: usage(1) del sys.argv[1] if number_of_lines < 0: sys.stderr.write('Sorry, you must give a non-negative number of lines with -n\n') usage(1) for lineno, line in enumerate(readline0.readline0(file_=0, separator=delimiter)): if lineno >= number_of_lines: break if verbose: sys.stderr.write('Line number %d\n' % lineno) sys.stderr.write('type(line) == %s' % (type(line)), ) os.write(1, line + delimiter)