| Index: third_party/pexpect/tools/display-terminalinfo.py | 
| diff --git a/third_party/pexpect/tools/display-terminalinfo.py b/third_party/pexpect/tools/display-terminalinfo.py | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..15911d417cf991868488f830999449601dcdeec7 | 
| --- /dev/null | 
| +++ b/third_party/pexpect/tools/display-terminalinfo.py | 
| @@ -0,0 +1,209 @@ | 
| +#!/usr/bin/env python | 
| +""" Display known information about our terminal. """ | 
| +from __future__ import print_function | 
| +import termios | 
| +import locale | 
| +import sys | 
| +import os | 
| + | 
| +BITMAP_IFLAG = { | 
| +    'IGNBRK': 'ignore BREAK condition', | 
| +    'BRKINT': 'map BREAK to SIGINTR', | 
| +    'IGNPAR': 'ignore (discard) parity errors', | 
| +    'PARMRK': 'mark parity and framing errors', | 
| +    'INPCK': 'enable checking of parity errors', | 
| +    'ISTRIP': 'strip 8th bit off chars', | 
| +    'INLCR': 'map NL into CR', | 
| +    'IGNCR': 'ignore CR', | 
| +    'ICRNL': 'map CR to NL (ala CRMOD)', | 
| +    'IXON': 'enable output flow control', | 
| +    'IXOFF': 'enable input flow control', | 
| +    'IXANY': 'any char will restart after stop', | 
| +    'IMAXBEL': 'ring bell on input queue full', | 
| +    'IUCLC': 'translate upper case to lower case', | 
| +} | 
| + | 
| +BITMAP_OFLAG = { | 
| +    'OPOST': 'enable following output processing', | 
| +    'ONLCR': 'map NL to CR-NL (ala CRMOD)', | 
| +    'OXTABS': 'expand tabs to spaces', | 
| +    'ONOEOT': 'discard EOT\'s `^D\' on output)', | 
| +    'OCRNL': 'map CR to NL', | 
| +    'OLCUC': 'translate lower case to upper case', | 
| +    'ONOCR': 'No CR output at column 0', | 
| +    'ONLRET': 'NL performs CR function', | 
| +} | 
| + | 
| +BITMAP_CFLAG = { | 
| +    'CSIZE': 'character size mask', | 
| +    'CS5': '5 bits (pseudo)', | 
| +    'CS6': '6 bits', | 
| +    'CS7': '7 bits', | 
| +    'CS8': '8 bits', | 
| +    'CSTOPB': 'send 2 stop bits', | 
| +    'CREAD': 'enable receiver', | 
| +    'PARENB': 'parity enable', | 
| +    'PARODD': 'odd parity, else even', | 
| +    'HUPCL': 'hang up on last close', | 
| +    'CLOCAL': 'ignore modem status lines', | 
| +    'CCTS_OFLOW': 'CTS flow control of output', | 
| +    'CRTSCTS': 'same as CCTS_OFLOW', | 
| +    'CRTS_IFLOW': 'RTS flow control of input', | 
| +    'MDMBUF': 'flow control output via Carrier', | 
| +} | 
| + | 
| +BITMAP_LFLAG = { | 
| +    'ECHOKE': 'visual erase for line kill', | 
| +    'ECHOE': 'visually erase chars', | 
| +    'ECHO': 'enable echoing', | 
| +    'ECHONL': 'echo NL even if ECHO is off', | 
| +    'ECHOPRT': 'visual erase mode for hardcopy', | 
| +    'ECHOCTL': 'echo control chars as ^(Char)', | 
| +    'ISIG': 'enable signals INTR, QUIT, [D]SUSP', | 
| +    'ICANON': 'canonicalize input lines', | 
| +    'ALTWERASE': 'use alternate WERASE algorithm', | 
| +    'IEXTEN': 'enable DISCARD and LNEXT', | 
| +    'EXTPROC': 'external processing', | 
| +    'TOSTOP': 'stop background jobs from output', | 
| +    'FLUSHO': 'output being flushed (state)', | 
| +    'NOKERNINFO': 'no kernel output from VSTATUS', | 
| +    'PENDIN': 'XXX retype pending input (state)', | 
| +    'NOFLSH': 'don\'t flush after interrupt', | 
| +} | 
| + | 
| +CTLCHAR_INDEX = { | 
| +    'VEOF': 'EOF', | 
| +    'VEOL': 'EOL', | 
| +    'VEOL2': 'EOL2', | 
| +    'VERASE': 'ERASE', | 
| +    'VWERASE': 'WERASE', | 
| +    'VKILL': 'KILL', | 
| +    'VREPRINT': 'REPRINT', | 
| +    'VINTR': 'INTR', | 
| +    'VQUIT': 'QUIT', | 
| +    'VSUSP': 'SUSP', | 
| +    'VDSUSP': 'DSUSP', | 
| +    'VSTART': 'START', | 
| +    'VSTOP': 'STOP', | 
| +    'VLNEXT': 'LNEXT', | 
| +    'VDISCARD': 'DISCARD', | 
| +    'VMIN': '---', | 
| +    'VTIME': '---', | 
| +    'VSTATUS': 'STATUS', | 
| +} | 
| + | 
| + | 
| +def display_bitmask(kind, bitmap, value): | 
| +    """ Display all matching bitmask values for ``value`` given ``bitmap``. """ | 
| +    col1_width = max(map(len, list(bitmap.keys()) + [kind])) | 
| +    col2_width = 7 | 
| +    FMT = '{name:>{col1_width}} {value:>{col2_width}}   {description}' | 
| +    print(FMT.format(name=kind, | 
| +                     value='Value', | 
| +                     description='Description', | 
| +                     col1_width=col1_width, | 
| +                     col2_width=col2_width)) | 
| +    print('{0} {1}   {2}'.format('-' * col1_width, | 
| +                                 '-' * col2_width, | 
| +                                 '-' * max(map(len, bitmap.values())))) | 
| +    for flag_name, description in bitmap.items(): | 
| +        try: | 
| +            bitmask = getattr(termios, flag_name) | 
| +            bit_val = 'on' if bool(value & bitmask) else 'off' | 
| +        except AttributeError: | 
| +            bit_val = 'undef' | 
| +        print(FMT.format(name=flag_name, | 
| +                         value=bit_val, | 
| +                         description=description, | 
| +                         col1_width=col1_width, | 
| +                         col2_width=col2_width)) | 
| +    print() | 
| + | 
| + | 
| +def display_ctl_chars(index, cc): | 
| +    """ Display all control character indicies, names, and values. """ | 
| +    title = 'Special Character' | 
| +    col1_width = len(title) | 
| +    col2_width = max(map(len, index.values())) | 
| +    FMT = '{idx:<{col1_width}}   {name:<{col2_width}} {value}' | 
| +    print('Special line Characters'.center(40).rstrip()) | 
| +    print(FMT.format(idx='Index', | 
| +                     name='Name', | 
| +                     value='Value', | 
| +                     col1_width=col1_width, | 
| +                     col2_width=col2_width)) | 
| +    print('{0}   {1} {2}'.format('-' * col1_width, | 
| +                                 '-' * col2_width, | 
| +                                 '-' * 10)) | 
| +    for index_name, name in index.items(): | 
| +        try: | 
| +            index = getattr(termios, index_name) | 
| +            value = cc[index] | 
| +            if value == b'\xff': | 
| +                value = '_POSIX_VDISABLE' | 
| +            else: | 
| +                value = repr(value) | 
| +        except AttributeError: | 
| +            value = 'undef' | 
| +        print(FMT.format(idx=index_name, | 
| +                         name=name, | 
| +                         value=value, | 
| +                         col1_width=col1_width, | 
| +                         col2_width=col2_width)) | 
| +    print() | 
| + | 
| + | 
| +def display_conf(kind, names, getter): | 
| +    col1_width = max(map(len, names)) | 
| +    FMT = '{name:>{col1_width}}   {value}' | 
| +    print(FMT.format(name=kind, | 
| +                     value='value', | 
| +                     col1_width=col1_width)) | 
| +    print('{0} {1}'.format('-' * col1_width, '-' * 27)) | 
| +    for name in names: | 
| +        try: | 
| +            value = getter(name) | 
| +        except OSError as err: | 
| +            value = err | 
| +        print(FMT.format(name=name, value=value, col1_width=col1_width)) | 
| +    print() | 
| + | 
| + | 
| +def main(): | 
| +    fd = sys.stdin.fileno() | 
| +    locale.setlocale(locale.LC_ALL, '') | 
| +    encoding = locale.getpreferredencoding() | 
| + | 
| +    print('os.isatty({0}) => {1}'.format(fd, os.isatty(fd))) | 
| +    print('locale.getpreferredencoding() => {0}'.format(encoding)) | 
| + | 
| +    display_conf(kind='pathconf', | 
| +                 names=os.pathconf_names, | 
| +                 getter=lambda name: os.fpathconf(fd, name)) | 
| + | 
| +    try: | 
| +        (iflag, oflag, cflag, lflag, ispeed, ospeed, cc | 
| +         ) = termios.tcgetattr(fd) | 
| +    except termios.error as err: | 
| +        print('stdin is not a typewriter: {0}'.format(err)) | 
| +    else: | 
| +        display_bitmask(kind='Input Mode', | 
| +                        bitmap=BITMAP_IFLAG, | 
| +                        value=iflag) | 
| +        display_bitmask(kind='Output Mode', | 
| +                        bitmap=BITMAP_OFLAG, | 
| +                        value=oflag) | 
| +        display_bitmask(kind='Control Mode', | 
| +                        bitmap=BITMAP_CFLAG, | 
| +                        value=cflag) | 
| +        display_bitmask(kind='Local Mode', | 
| +                        bitmap=BITMAP_LFLAG, | 
| +                        value=lflag) | 
| +        display_ctl_chars(index=CTLCHAR_INDEX, | 
| +                          cc=cc) | 
| +        print('os.ttyname({0}) => {1}'.format(fd, os.ttyname(fd))) | 
| +        print('os.ctermid() => {0}'.format(os.ttyname(fd))) | 
| + | 
| + | 
| +if __name__ == '__main__': | 
| +    main() | 
|  |