terminal.py revision 13709
15790Sgblack@eecs.umich.edu# Copyright (c) 2011 Advanced Micro Devices, Inc. 25790Sgblack@eecs.umich.edu# All rights reserved. 35790Sgblack@eecs.umich.edu# 45790Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 55790Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 65790Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 75790Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 85790Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 95790Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 105790Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 115790Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 125790Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 135790Sgblack@eecs.umich.edu# this software without specific prior written permission. 145790Sgblack@eecs.umich.edu# 155790Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 165790Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 175790Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 185790Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 195790Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205790Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 215790Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 225790Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 235790Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245790Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 255790Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265790Sgblack@eecs.umich.edu# 275790Sgblack@eecs.umich.edu# Author: Steve Reinhardt 285790Sgblack@eecs.umich.edu 295790Sgblack@eecs.umich.edufrom __future__ import print_function 305790Sgblack@eecs.umich.edu 315790Sgblack@eecs.umich.eduimport sys 325790Sgblack@eecs.umich.edu 3312157Sandreas.sandberg@arm.com# Intended usage example: 345790Sgblack@eecs.umich.edu# 3512459Sjang.hanhwi@gmail.com# if force_colors: 3612459Sjang.hanhwi@gmail.com# from m5.util.terminal import termcap 3712459Sjang.hanhwi@gmail.com# elif no_colors: 3812459Sjang.hanhwi@gmail.com# from m5.util.terminal import no_termcap as termcap 3912459Sjang.hanhwi@gmail.com# else: 4012459Sjang.hanhwi@gmail.com# from m5.util.terminal import tty_termcap as termcap 4112459Sjang.hanhwi@gmail.com# print(termcap.Blue + "This could be blue!" + termcap.Normal) 4212459Sjang.hanhwi@gmail.com 4312459Sjang.hanhwi@gmail.com# ANSI color names in index order 4412459Sjang.hanhwi@gmail.comcolor_names = "Black Red Green Yellow Blue Magenta Cyan".split() 4512459Sjang.hanhwi@gmail.com 4612459Sjang.hanhwi@gmail.com# Character attribute capabilities. Note that not all terminals 4712459Sjang.hanhwi@gmail.com# support all of these capabilities, or support them 4812459Sjang.hanhwi@gmail.com# differently/meaningfully. For example: 4912459Sjang.hanhwi@gmail.com# 509898Sandreas@sandberg.pp.se# - In PuTTY (with the default settings), Dim has no effect, Standout 519898Sandreas@sandberg.pp.se# is the same as Reverse, and Blink does not blink but switches to a 529898Sandreas@sandberg.pp.se# gray background. 539898Sandreas@sandberg.pp.se# 549898Sandreas@sandberg.pp.se# Please feel free to add information about other terminals here. 559898Sandreas@sandberg.pp.se# 569898Sandreas@sandberg.pp.secapability_map = { 579898Sandreas@sandberg.pp.se 'Bold': 'bold', 589898Sandreas@sandberg.pp.se 'Dim': 'dim', 599898Sandreas@sandberg.pp.se 'Blink': 'blink', 609898Sandreas@sandberg.pp.se 'Underline': 'smul', 6112464Sjang.hanhwi@gmail.com 'Reverse': 'rev', 629898Sandreas@sandberg.pp.se 'Standout': 'smso', 639898Sandreas@sandberg.pp.se 'Normal': 'sgr0' 649898Sandreas@sandberg.pp.se} 659898Sandreas@sandberg.pp.se 669898Sandreas@sandberg.pp.secapability_names = list(capability_map.keys()) 675790Sgblack@eecs.umich.edu 685790Sgblack@eecs.umich.edudef null_cap_string(s, *args): 695790Sgblack@eecs.umich.edu return '' 705790Sgblack@eecs.umich.edu 715790Sgblack@eecs.umich.edutry: 725790Sgblack@eecs.umich.edu import curses 735790Sgblack@eecs.umich.edu curses.setupterm() 745790Sgblack@eecs.umich.edu def cap_string(s, *args): 755790Sgblack@eecs.umich.edu cap = curses.tigetstr(s) 769898Sandreas@sandberg.pp.se if cap: 779898Sandreas@sandberg.pp.se return curses.tparm(cap, *args) 7812160Sandreas.sandberg@arm.com else: 7912160Sandreas.sandberg@arm.com return '' 8012160Sandreas.sandberg@arm.comexcept: 8112160Sandreas.sandberg@arm.com cap_string = null_cap_string 8212160Sandreas.sandberg@arm.com 8312160Sandreas.sandberg@arm.comclass ColorStrings(object): 8412424Sjang.hanhwi@gmail.com def __init__(self, cap_string): 8512157Sandreas.sandberg@arm.com for i, c in enumerate(color_names): 8612157Sandreas.sandberg@arm.com setattr(self, c, cap_string('setaf', i)) 8712160Sandreas.sandberg@arm.com for name, cap in capability_map.items(): 8812160Sandreas.sandberg@arm.com setattr(self, name, cap_string(cap)) 8912157Sandreas.sandberg@arm.com 9012157Sandreas.sandberg@arm.comtermcap = ColorStrings(cap_string) 9112160Sandreas.sandberg@arm.comno_termcap = ColorStrings(null_cap_string) 9212157Sandreas.sandberg@arm.com 9312160Sandreas.sandberg@arm.comif sys.stdout.isatty(): 9412160Sandreas.sandberg@arm.com tty_termcap = termcap 9512160Sandreas.sandberg@arm.comelse: 9612160Sandreas.sandberg@arm.com tty_termcap = no_termcap 9712160Sandreas.sandberg@arm.com 9812157Sandreas.sandberg@arm.comdef get_termcap(use_colors = None): 9912157Sandreas.sandberg@arm.com if use_colors: 10012157Sandreas.sandberg@arm.com return termcap 10112160Sandreas.sandberg@arm.com elif use_colors is None: 102 # option unspecified; default behavior is to use colors iff isatty 103 return tty_termcap 104 else: 105 return no_termcap 106 107def test_termcap(obj): 108 for c_name in color_names: 109 c_str = getattr(obj, c_name) 110 print(c_str + c_name + obj.Normal) 111 for attr_name in capability_names: 112 if attr_name == 'Normal': 113 continue 114 attr_str = getattr(obj, attr_name) 115 print(attr_str + c_str + attr_name + " " + c_name + obj.Normal) 116 print(obj.Bold + obj.Underline + 117 c_name + "Bold Underline " + c + obj.Normal) 118 119if __name__ == '__main__': 120 print("=== termcap enabled ===") 121 test_termcap(termcap) 122 print(termcap.Normal) 123 print("=== termcap disabled ===") 124 test_termcap(no_termcap) 125