]> Git Repo - binutils.git/blob - gdb/python/lib/gdb/function/strfns.py
c56957bdb28026e171ecfb7fda205ebfe7ae07be
[binutils.git] / gdb / python / lib / gdb / function / strfns.py
1 # Useful gdb string convenience functions.
2 # Copyright (C) 2012-2019 Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 """$_memeq, $_strlen, $_streq, $_regex"""
18
19 import gdb
20 import re
21
22
23 class _MemEq(gdb.Function):
24   """$_memeq - compare bytes of memory.
25
26 Usage: $_memeq (A, B, LEN)
27
28 Returns:
29   True if LEN bytes at A and B compare equally."""
30   def __init__(self):
31     super(_MemEq, self).__init__("_memeq")
32
33   def invoke(self, a, b, length):
34     if length < 0:
35       raise ValueError("length must be non-negative")
36     if length == 0:
37       return True
38     # The argument(s) to vector are [low_bound,]high_bound.
39     byte_vector = gdb.lookup_type("char").vector(length - 1)
40     ptr_byte_vector = byte_vector.pointer()
41     a_ptr = a.reinterpret_cast(ptr_byte_vector)
42     b_ptr = b.reinterpret_cast(ptr_byte_vector)
43     return a_ptr.dereference() == b_ptr.dereference()
44
45
46 class _StrLen(gdb.Function):
47   """$_strlen - compute string length.
48
49 Usage: $_strlen (A)
50
51 Returns:
52   Length of string A, assumed to be a string in the current language."""
53   def __init__(self):
54     super(_StrLen, self).__init__("_strlen")
55
56   def invoke(self, a):
57     s = a.string()
58     return len(s)
59
60
61 class _StrEq(gdb.Function):
62   """$_streq - check string equality.
63
64 Usage: $_streq (A, B)
65
66 Returns:
67   True if A and B are identical strings in the current language.
68
69 Example (amd64-linux):
70   catch syscall open
71   cond $bpnum $_streq((char*) $rdi, "foo")"""
72   def __init__(self):
73     super(_StrEq, self).__init__("_streq")
74
75   def invoke(self, a, b):
76     return a.string() == b.string()
77
78
79 class _RegEx(gdb.Function):
80   """$_regex - check if a string matches a regular expression.
81
82 Usage: $_regex (STRING, REGEX)
83
84 Returns:
85   True if string STRING (in the current language) matches the
86   regular expression REGEX."""
87   def __init__(self):
88     super(_RegEx, self).__init__("_regex")
89
90   def invoke(self, string, regex):
91     s = string.string()
92     r = re.compile(regex.string())
93     return bool(r.match(s))
94
95
96 # GDB will import us automagically via gdb/__init__.py.
97 _MemEq()
98 _StrLen()
99 _StrEq()
100 _RegEx()
This page took 0.020093 seconds and 2 git commands to generate.