| # Copyright Bruno da Silva de Oliveira 2003. Use, modification and |
| # distribution is subject to the Boost Software License, Version 1.0. |
| # (See accompanying file LICENSE_1_0.txt or copy at |
| # http://www.boost.org/LICENSE_1_0.txt) |
| |
| from __future__ import generators |
| import string |
| import sys |
| |
| #============================================================================== |
| # enumerate |
| #============================================================================== |
| def enumerate(seq): |
| i = 0 |
| for x in seq: |
| yield i, x |
| i += 1 |
| |
| |
| #============================================================================== |
| # makeid |
| #============================================================================== |
| _valid_chars = string.ascii_letters + string.digits + '_' |
| _valid_chars = dict(zip(_valid_chars, _valid_chars)) |
| |
| def makeid(name): |
| 'Returns the name as a valid identifier' |
| if type(name) != str: |
| print type(name), name |
| newname = [] |
| for char in name: |
| if char not in _valid_chars: |
| char = '_' |
| newname.append(char) |
| newname = ''.join(newname) |
| # avoid duplications of '_' chars |
| names = [x for x in newname.split('_') if x] |
| return '_'.join(names) |
| |
| |
| #============================================================================== |
| # remove_duplicated_lines |
| #============================================================================== |
| def remove_duplicated_lines(text): |
| includes = text.splitlines() |
| d = dict([(include, 0) for include in includes]) |
| includes = d.keys() |
| includes.sort() |
| return '\n'.join(includes) |
| |
| |
| #============================================================================== |
| # left_equals |
| #============================================================================== |
| def left_equals(s): |
| s = '// %s ' % s |
| return s + ('='*(80-len(s))) + '\n' |
| |
| |
| #============================================================================== |
| # post_mortem |
| #============================================================================== |
| def post_mortem(): |
| |
| def info(type, value, tb): |
| if hasattr(sys, 'ps1') or not sys.stderr.isatty(): |
| # we are in interactive mode or we don't have a tty-like |
| # device, so we call the default hook |
| sys.__excepthook__(type, value, tb) |
| else: |
| import traceback, pdb |
| # we are NOT in interactive mode, print the exception... |
| traceback.print_exception(type, value, tb) |
| print |
| # ...then start the debugger in post-mortem mode. |
| pdb.pm() |
| |
| sys.excepthook = info |