1 # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
2 # Printer interface adaptor.
4 # Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
6 # This file is part of boost-gdb-printers.
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 from collections
import Mapping
27 from boost
.util
.compatibility
import use_gdb_printing
29 class SimplePrinter(object):
31 def __init__(self
, name
, function
):
33 self
.function
= function
36 def invoke(self
, val
):
39 return self
.function(self
.name
, val
)
41 class NameLookup(Mapping
):
45 self
.name_regex
= re
.compile('^([\w:]+)(<.*>)?')
47 def add(self
, name
, printer
):
48 self
.map[name
] = printer
53 def __getitem__(self
, type):
54 typename
= self
._basic
_type
(type)
55 if typename
and typename
in self
.map:
56 return self
.map[typename
]
62 def _basic_type(self
, type):
63 basic_type
= self
.basic_type(type)
65 match
= self
.name_regex
.match(basic_type
)
72 if type.code
== gdb
.TYPE_CODE_REF
:
74 type = type.unqualified().strip_typedefs()
77 class FunctionLookup(Mapping
):
82 def add(self
, test
, printer
):
83 self
.map[test
] = printer
88 def __getitem__(self
, type):
89 for (test
, printer
) in six
.iteritems(self
.map):
97 class Printer(object):
99 def __init__(self
, name
):
101 self
.subprinters
= []
102 self
.name_lookup
= NameLookup()
103 self
.func_lookup
= FunctionLookup()
106 def add(self
, name
, function
, lookup
= None):
107 printer
= SimplePrinter(name
, function
)
108 self
.subprinters
.append(printer
)
110 self
.name_lookup
.add(name
, printer
)
112 self
.func_lookup
.add(lookup
, printer
)
115 def __call__(self
, val
):
116 printer
= self
.name_lookup
[val
.type]
118 printer
= self
.func_lookup
[val
.type]
121 return printer
.invoke(val
)
124 def register_pretty_printer(printer
, obj
):
125 '''Registers printer with objfile'''
128 gdb
.printing
.register_pretty_printer(obj
, printer
)
132 obj
.pretty_printers
.append(printer
)
134 # vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: