Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #!/usr/bin/env python
  2. ##########################################################################
  3. #
  4. # Copyright 2008 VMware, Inc.
  5. # All Rights Reserved.
  6. #
  7. # Permission is hereby granted, free of charge, to any person obtaining a
  8. # copy of this software and associated documentation files (the
  9. # "Software"), to deal in the Software without restriction, including
  10. # without limitation the rights to use, copy, modify, merge, publish,
  11. # distribute, sub license, and/or sell copies of the Software, and to
  12. # permit persons to whom the Software is furnished to do so, subject to
  13. # the following conditions:
  14. #
  15. # The above copyright notice and this permission notice (including the
  16. # next paragraph) shall be included in all copies or substantial portions
  17. # of the Software.
  18. #
  19. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20. # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  21. # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  22. # IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  23. # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  24. # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  25. # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26. #
  27. ##########################################################################
  28.  
  29.  
  30. import sys
  31.  
  32.  
  33. class Formatter:
  34.     '''Plain formatter'''
  35.  
  36.     def __init__(self, stream):
  37.         self.stream = stream
  38.  
  39.     def text(self, text):
  40.         self.stream.write(text)
  41.  
  42.     def newline(self):
  43.         self.text('\n')
  44.  
  45.     def function(self, name):
  46.         self.text(name)
  47.  
  48.     def variable(self, name):
  49.         self.text(name)
  50.  
  51.     def literal(self, value):
  52.         self.text(str(value))
  53.  
  54.     def address(self, addr):
  55.         self.text(str(addr))
  56.  
  57.  
  58. class AnsiFormatter(Formatter):
  59.     '''Formatter for plain-text files which outputs ANSI escape codes. See
  60.    http://en.wikipedia.org/wiki/ANSI_escape_code for more information
  61.    concerning ANSI escape codes.
  62.    '''
  63.  
  64.     _csi = '\33['
  65.  
  66.     _normal = '0m'
  67.     _bold = '1m'
  68.     _italic = '3m'
  69.     _red = '31m'
  70.     _green = '32m'
  71.     _blue = '34m'
  72.  
  73.     def _escape(self, code):
  74.         self.text(self._csi + code)
  75.  
  76.     def function(self, name):
  77.         self._escape(self._bold)
  78.         Formatter.function(self, name)
  79.         self._escape(self._normal)
  80.  
  81.     def variable(self, name):
  82.         self._escape(self._italic)
  83.         Formatter.variable(self, name)
  84.         self._escape(self._normal)
  85.  
  86.     def literal(self, value):
  87.         self._escape(self._blue)
  88.         Formatter.literal(self, value)
  89.         self._escape(self._normal)
  90.  
  91.     def address(self, value):
  92.         self._escape(self._green)
  93.         Formatter.address(self, value)
  94.         self._escape(self._normal)
  95.  
  96.  
  97. class WindowsConsoleFormatter(Formatter):
  98.     '''Formatter for the Windows Console. See
  99.    http://code.activestate.com/recipes/496901/ for more information.
  100.    '''
  101.  
  102.     STD_INPUT_HANDLE  = -10
  103.     STD_OUTPUT_HANDLE = -11
  104.     STD_ERROR_HANDLE  = -12
  105.  
  106.     FOREGROUND_BLUE      = 0x01
  107.     FOREGROUND_GREEN     = 0x02
  108.     FOREGROUND_RED       = 0x04
  109.     FOREGROUND_INTENSITY = 0x08
  110.     BACKGROUND_BLUE      = 0x10
  111.     BACKGROUND_GREEN     = 0x20
  112.     BACKGROUND_RED       = 0x40
  113.     BACKGROUND_INTENSITY = 0x80
  114.  
  115.     _normal = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
  116.     _bold = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY
  117.     _italic = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
  118.     _red = FOREGROUND_RED | FOREGROUND_INTENSITY
  119.     _green = FOREGROUND_GREEN | FOREGROUND_INTENSITY
  120.     _blue = FOREGROUND_BLUE | FOREGROUND_INTENSITY
  121.  
  122.     def __init__(self, stream):
  123.         Formatter.__init__(self, stream)
  124.  
  125.         if stream is sys.stdin:
  126.             nStdHandle = self.STD_INPUT_HANDLE
  127.         elif stream is sys.stdout:
  128.             nStdHandle = self.STD_OUTPUT_HANDLE
  129.         elif stream is sys.stderr:
  130.             nStdHandle = self.STD_ERROR_HANDLE
  131.         else:
  132.             nStdHandle = None
  133.  
  134.         if nStdHandle:
  135.             import ctypes
  136.             self.handle = ctypes.windll.kernel32.GetStdHandle(nStdHandle)
  137.         else:
  138.             self.handle = None
  139.  
  140.     def _attribute(self, attr):
  141.         if self.handle:
  142.             import ctypes
  143.             ctypes.windll.kernel32.SetConsoleTextAttribute(self.handle, attr)
  144.  
  145.     def function(self, name):
  146.         self._attribute(self._bold)
  147.         Formatter.function(self, name)
  148.         self._attribute(self._normal)
  149.  
  150.     def variable(self, name):
  151.         self._attribute(self._italic)
  152.         Formatter.variable(self, name)
  153.         self._attribute(self._normal)
  154.  
  155.     def literal(self, value):
  156.         self._attribute(self._blue)
  157.         Formatter.literal(self, value)
  158.         self._attribute(self._normal)
  159.  
  160.     def address(self, value):
  161.         self._attribute(self._green)
  162.         Formatter.address(self, value)
  163.         self._attribute(self._normal)
  164.  
  165.  
  166. def DefaultFormatter(stream):
  167.     if sys.platform in ('linux2', 'cygwin'):
  168.         return AnsiFormatter(stream)
  169.     elif sys.platform in ('win32',):
  170.         return WindowsConsoleFormatter(stream)
  171.     else:
  172.         return Formatter(stream)
  173.  
  174.