summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/kakoune.py66
1 files changed, 66 insertions, 0 deletions
diff --git a/gdb/kakoune.py b/gdb/kakoune.py
new file mode 100644
index 00000000..f9ef11f3
--- /dev/null
+++ b/gdb/kakoune.py
@@ -0,0 +1,66 @@
+import gdb.printing
+
+class ArrayIterator:
+ def __init__ (self, data, count):
+ self.data = data
+ self.count = count
+ self.index = 0
+
+ def __iter__ (self):
+ return self
+
+ def next (self):
+ if self.index == self.count:
+ raise StopIteration
+
+ index = self.index
+ self.index = self.index + 1
+ return ('[%d]' % index, (self.data + index).dereference())
+
+class MemoryView:
+ """Print a memoryview"""
+
+ def __init__(self, val):
+ self.val = val
+
+ def display_hint(self):
+ return 'array'
+
+ def children(self):
+ return ArrayIterator(self.val['m_pointer'], self.val['m_size'])
+
+ def to_string(self):
+ value_type = self.val.type.template_argument(0).unqualified().strip_typedefs()
+ return "memoryview<%s>" % (value_type)
+
+class LineAndColumn:
+ """Print a LineAndColumn"""
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ value_type = self.val.type.unqualified()
+ return "%s(%d, %d)" % (value_type, self.val['line'], self.val['column'])
+
+class BufferIterator:
+ """ Print a BufferIterator"""
+
+ def __init__(self, val):
+ self.val = val
+
+ def to_string(self):
+ if self.val['m_buffer'] != 0:
+ return "buffer<%s>@%d" % (self.val['m_buffer'].dereference()['m_name'], self.val['m_position'])
+ else:
+ return "buffer<none>@%s" % (self.val['m_position'])
+
+def build_pretty_printer():
+ pp = gdb.printing.RegexpCollectionPrettyPrinter("kakoune")
+ pp.add_printer('memoryview', '^Kakoune::memoryview<.*>$', MemoryView)
+ pp.add_printer('LineAndColumn', '^Kakoune::LineAndColumn<.*>$', LineAndColumn)
+ pp.add_printer('BufferCoord', '^Kakoune::BufferCoord$', LineAndColumn)
+ pp.add_printer('DisplayCoord', '^Kakoune::DisplayCoord$', LineAndColumn)
+ pp.add_printer('BufferIterator', '^Kakoune::BufferIterator$', BufferIterator)
+ return pp
+