terminal.py revision 7816
113540Sandrea.mondelli@ucf.edu# Copyright (c) 2011 Advanced Micro Devices, Inc.
212893Sbrandon.potter@amd.com# All rights reserved.
312893Sbrandon.potter@amd.com#
412893Sbrandon.potter@amd.com# Redistribution and use in source and binary forms, with or without
512893Sbrandon.potter@amd.com# modification, are permitted provided that the following conditions are
612893Sbrandon.potter@amd.com# met: redistributions of source code must retain the above copyright
712893Sbrandon.potter@amd.com# notice, this list of conditions and the following disclaimer;
812893Sbrandon.potter@amd.com# redistributions in binary form must reproduce the above copyright
912893Sbrandon.potter@amd.com# notice, this list of conditions and the following disclaimer in the
1012893Sbrandon.potter@amd.com# documentation and/or other materials provided with the distribution;
1112893Sbrandon.potter@amd.com# neither the name of the copyright holders nor the names of its
1212893Sbrandon.potter@amd.com# contributors may be used to endorse or promote products derived from
1312893Sbrandon.potter@amd.com# this software without specific prior written permission.
1412893Sbrandon.potter@amd.com#
1512893Sbrandon.potter@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1612893Sbrandon.potter@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1712893Sbrandon.potter@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1812893Sbrandon.potter@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1912893Sbrandon.potter@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2012893Sbrandon.potter@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2112893Sbrandon.potter@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2212893Sbrandon.potter@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2312893Sbrandon.potter@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2412893Sbrandon.potter@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2512893Sbrandon.potter@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2612893Sbrandon.potter@amd.com#
2712893Sbrandon.potter@amd.com# Author: Steve Reinhardt
2812893Sbrandon.potter@amd.com
2912893Sbrandon.potter@amd.comimport sys
3012893Sbrandon.potter@amd.com
3112893Sbrandon.potter@amd.com# Intended usage example:
3212893Sbrandon.potter@amd.com#
3312893Sbrandon.potter@amd.com# if force_colors:
3412893Sbrandon.potter@amd.com#    from m5.util.terminal import termcap
3512893Sbrandon.potter@amd.com# elif no_colors:
3612893Sbrandon.potter@amd.com#    from m5.util.terminal import no_termcap as termcap
3712893Sbrandon.potter@amd.com# else:
3812893Sbrandon.potter@amd.com#    from m5.util.terminal import tty_termcap as termcap
3912893Sbrandon.potter@amd.com# print termcap.Blue + "This could be blue!" + termcap.Normal
4012893Sbrandon.potter@amd.com
4112893Sbrandon.potter@amd.com# ANSI color names in index order
4212893Sbrandon.potter@amd.comcolor_names = "Black Red Green Yellow Blue Magenta Cyan".split()
4312893Sbrandon.potter@amd.com
4412893Sbrandon.potter@amd.com# Character attribute capabilities.  Note that not all terminals
4512893Sbrandon.potter@amd.com# support all of these capabilities, or support them
4612893Sbrandon.potter@amd.com# differently/meaningfully.  For example:
4712893Sbrandon.potter@amd.com#
4812893Sbrandon.potter@amd.com# - In PuTTY (with the default settings), Dim has no effect, Standout
4912893Sbrandon.potter@amd.com#   is the same as Reverse, and Blink does not blink but switches to a
5012893Sbrandon.potter@amd.com#   gray background.
5112893Sbrandon.potter@amd.com#
5212893Sbrandon.potter@amd.com# Please feel free to add information about other terminals here.
5312893Sbrandon.potter@amd.com#
5412893Sbrandon.potter@amd.comcapability_map = {
5512893Sbrandon.potter@amd.com         'Bold': 'bold',
5612893Sbrandon.potter@amd.com          'Dim': 'dim',
5712893Sbrandon.potter@amd.com        'Blink': 'blink',
5812893Sbrandon.potter@amd.com    'Underline': 'smul',
5912893Sbrandon.potter@amd.com      'Reverse': 'rev',
6012893Sbrandon.potter@amd.com     'Standout': 'smso',
6112893Sbrandon.potter@amd.com       'Normal': 'sgr0'
6212893Sbrandon.potter@amd.com}
6312893Sbrandon.potter@amd.com
6412893Sbrandon.potter@amd.comcapability_names = capability_map.keys()
6512893Sbrandon.potter@amd.com
6612893Sbrandon.potter@amd.comdef null_cap_string(s, *args):
6712893Sbrandon.potter@amd.com    return ''
6812893Sbrandon.potter@amd.com
6912893Sbrandon.potter@amd.comtry:
7012893Sbrandon.potter@amd.com    import curses
7112893Sbrandon.potter@amd.com    curses.setupterm()
7212893Sbrandon.potter@amd.com    def cap_string(s, *args):
7312893Sbrandon.potter@amd.com        cap = curses.tigetstr(s)
7412893Sbrandon.potter@amd.com        if cap:
7512893Sbrandon.potter@amd.com            return curses.tparm(cap, *args)
7612893Sbrandon.potter@amd.com        else:
7712893Sbrandon.potter@amd.com            return ''
7812893Sbrandon.potter@amd.comexcept:
7912893Sbrandon.potter@amd.com    cap_string = null_cap_string
8012893Sbrandon.potter@amd.com
8112893Sbrandon.potter@amd.comclass ColorStrings(object):
8212893Sbrandon.potter@amd.com    def __init__(self, cap_string):
8312893Sbrandon.potter@amd.com        for i, c in enumerate(color_names):
8412893Sbrandon.potter@amd.com            setattr(self, c, cap_string('setaf', i))
8512893Sbrandon.potter@amd.com        for name, cap in capability_map.iteritems():
8612893Sbrandon.potter@amd.com            setattr(self, name, cap_string(cap))
8712893Sbrandon.potter@amd.com
8812893Sbrandon.potter@amd.comtermcap = ColorStrings(cap_string)
8912893Sbrandon.potter@amd.comno_termcap = ColorStrings(null_cap_string)
9012893Sbrandon.potter@amd.com
9112893Sbrandon.potter@amd.comif sys.stdout.isatty():
9212893Sbrandon.potter@amd.com    tty_termcap = termcap
9312893Sbrandon.potter@amd.comelse:
9412893Sbrandon.potter@amd.com    tty_termcap = no_termcap
9512893Sbrandon.potter@amd.com
9612893Sbrandon.potter@amd.comdef test_termcap(obj):
9712893Sbrandon.potter@amd.com    for c_name in color_names:
9812893Sbrandon.potter@amd.com        c_str = getattr(obj, c_name)
9912893Sbrandon.potter@amd.com        print c_str + c_name + obj.Normal
10012893Sbrandon.potter@amd.com        for attr_name in capability_names:
10112893Sbrandon.potter@amd.com            if attr_name == 'Normal':
10212893Sbrandon.potter@amd.com                continue
10312893Sbrandon.potter@amd.com            attr_str = getattr(obj, attr_name)
10412893Sbrandon.potter@amd.com            print attr_str + c_str + attr_name + " " + c_name + obj.Normal
10512893Sbrandon.potter@amd.com        print obj.Bold + obj.Underline + \
10612893Sbrandon.potter@amd.com              c_name + "Bold Underline " + c + obj.Normal
10712893Sbrandon.potter@amd.com
10812893Sbrandon.potter@amd.comif __name__ == '__main__':
10912893Sbrandon.potter@amd.com    print "=== termcap enabled ==="
11012893Sbrandon.potter@amd.com    test_termcap(termcap)
11112893Sbrandon.potter@amd.com    print termcap.Normal
11212893Sbrandon.potter@amd.com    print "=== termcap disabled ==="
11312893Sbrandon.potter@amd.com    test_termcap(no_termcap)
11412893Sbrandon.potter@amd.com