Index: gdb/python/lib/gdb/function/strfns.py |
diff --git a/gdb/python/lib/gdb/function/strfns.py b/gdb/python/lib/gdb/function/strfns.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..efdf9501da830ec2ade9918f6224f98fee630f99 |
--- /dev/null |
+++ b/gdb/python/lib/gdb/function/strfns.py |
@@ -0,0 +1,108 @@ |
+# Useful gdb string convenience functions. |
+# Copyright (C) 2012-2013 Free Software Foundation, Inc. |
+ |
+# This program is free software; you can redistribute it and/or modify |
+# it under the terms of the GNU General Public License as published by |
+# the Free Software Foundation; either version 3 of the License, or |
+# (at your option) any later version. |
+# |
+# This program is distributed in the hope that it will be useful, |
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+# GNU General Public License for more details. |
+# |
+# You should have received a copy of the GNU General Public License |
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
+ |
+"""$_memeq, $_strlen, $_streq, $_regex""" |
+ |
+import gdb |
+import re |
+ |
+ |
+class _MemEq(gdb.Function): |
+ """$_memeq - compare bytes of memory |
+ |
+Usage: |
+ $_memeq(a, b, len) |
+ |
+Returns: |
+ True if len bytes at a and b compare equally. |
+""" |
+ def __init__(self): |
+ super(_MemEq, self).__init__("_memeq") |
+ |
+ def invoke(self, a, b, length): |
+ if length < 0: |
+ raise ValueError("length must be non-negative") |
+ if length == 0: |
+ return True |
+ # The argument(s) to vector are [low_bound,]high_bound. |
+ byte_vector = gdb.lookup_type("char").vector(length - 1) |
+ ptr_byte_vector = byte_vector.pointer() |
+ a_ptr = a.reinterpret_cast(ptr_byte_vector) |
+ b_ptr = b.reinterpret_cast(ptr_byte_vector) |
+ return a_ptr.dereference() == b_ptr.dereference() |
+ |
+ |
+class _StrLen(gdb.Function): |
+ """$_strlen - compute string length |
+ |
+Usage: |
+ $_strlen(a) |
+ |
+Returns: |
+ Length of string a, assumed to be a string in the current language. |
+""" |
+ def __init__(self): |
+ super(_StrLen, self).__init__("_strlen") |
+ |
+ def invoke(self, a): |
+ s = a.string() |
+ return len(s) |
+ |
+ |
+class _StrEq(gdb.Function): |
+ """$_streq - check string equality |
+ |
+Usage: |
+ $_streq(a, b) |
+ |
+Returns: |
+ True if a and b are identical strings in the current language. |
+ |
+Example (amd64-linux): |
+ catch syscall open |
+ cond $bpnum $_streq((char*) $rdi, "foo") |
+""" |
+ def __init__(self): |
+ super(_StrEq, self).__init__("_streq") |
+ |
+ def invoke(self, a, b): |
+ return a.string() == b.string() |
+ |
+ |
+class _RegEx(gdb.Function): |
+ """$_regex - check if a string matches a regular expression |
+ |
+Usage: |
+ $_regex(string, regex) |
+ |
+Returns: |
+ True if string str (in the current language) matches the |
+ regular expression regex. |
+""" |
+ def __init__(self): |
+ super(_RegEx, self).__init__("_regex") |
+ |
+ def invoke(self, string, regex): |
+ s = string.string() |
+ r = re.compile(regex.string()) |
+ return bool(r.match(s)) |
+ |
+ |
+# GDB will import us automagically via gdb/__init__.py. |
+_MemEq() |
+_StrLen() |
+_StrEq() |
+_RegEx() |