summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/examples/scripting/tree_utils.py
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
committerpatrick <patrick@openbsd.org>2020-08-03 14:33:06 +0000
commit061da546b983eb767bad15e67af1174fb0bcf31c (patch)
tree83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/examples/scripting/tree_utils.py
parentImport LLVM 10.0.0 release including clang, lld and lldb. (diff)
downloadwireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz
wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/examples/scripting/tree_utils.py')
-rwxr-xr-xgnu/llvm/lldb/examples/scripting/tree_utils.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/examples/scripting/tree_utils.py b/gnu/llvm/lldb/examples/scripting/tree_utils.py
new file mode 100755
index 00000000000..e99f7c63bed
--- /dev/null
+++ b/gnu/llvm/lldb/examples/scripting/tree_utils.py
@@ -0,0 +1,119 @@
+"""
+# ===-- tree_utils.py ---------------------------------------*- Python -*-===//
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+# ===---------------------------------------------------------------------===//
+
+tree_utils.py - A set of functions for examining binary
+search trees, based on the example search tree defined in
+dictionary.c. These functions contain calls to LLDB API
+functions, and assume that the LLDB Python module has been
+imported.
+
+For a thorough explanation of how the DFS function works, and
+for more information about dictionary.c go to
+http://lldb.llvm.org/scripting.html
+"""
+
+from __future__ import print_function
+
+
+def DFS(root, word, cur_path):
+ """
+ Recursively traverse a binary search tree containing
+ words sorted alphabetically, searching for a particular
+ word in the tree. Also maintains a string representing
+ the path from the root of the tree to the current node.
+ If the word is found in the tree, return the path string.
+ Otherwise return an empty string.
+
+ This function assumes the binary search tree is
+ the one defined in dictionary.c It uses LLDB API
+ functions to examine and traverse the tree nodes.
+ """
+
+ # Get pointer field values out of node 'root'
+
+ root_word_ptr = root.GetChildMemberWithName("word")
+ left_child_ptr = root.GetChildMemberWithName("left")
+ right_child_ptr = root.GetChildMemberWithName("right")
+
+ # Get the word out of the word pointer and strip off
+ # surrounding quotes (added by call to GetSummary).
+
+ root_word = root_word_ptr.GetSummary()
+ end = len(root_word) - 1
+ if root_word[0] == '"' and root_word[end] == '"':
+ root_word = root_word[1:end]
+ end = len(root_word) - 1
+ if root_word[0] == '\'' and root_word[end] == '\'':
+ root_word = root_word[1:end]
+
+ # Main depth first search
+
+ if root_word == word:
+ return cur_path
+ elif word < root_word:
+
+ # Check to see if left child is NULL
+
+ if left_child_ptr.GetValue() is None:
+ return ""
+ else:
+ cur_path = cur_path + "L"
+ return DFS(left_child_ptr, word, cur_path)
+ else:
+
+ # Check to see if right child is NULL
+
+ if right_child_ptr.GetValue() is None:
+ return ""
+ else:
+ cur_path = cur_path + "R"
+ return DFS(right_child_ptr, word, cur_path)
+
+
+def tree_size(root):
+ """
+ Recursively traverse a binary search tree, counting
+ the nodes in the tree. Returns the final count.
+
+ This function assumes the binary search tree is
+ the one defined in dictionary.c It uses LLDB API
+ functions to examine and traverse the tree nodes.
+ """
+ if (root.GetValue is None):
+ return 0
+
+ if (int(root.GetValue(), 16) == 0):
+ return 0
+
+ left_size = tree_size(root.GetChildAtIndex(1))
+ right_size = tree_size(root.GetChildAtIndex(2))
+
+ total_size = left_size + right_size + 1
+ return total_size
+
+
+def print_tree(root):
+ """
+ Recursively traverse a binary search tree, printing out
+ the words at the nodes in alphabetical order (the
+ search order for the binary tree).
+
+ This function assumes the binary search tree is
+ the one defined in dictionary.c It uses LLDB API
+ functions to examine and traverse the tree nodes.
+ """
+ if (root.GetChildAtIndex(1).GetValue() is not None) and (
+ int(root.GetChildAtIndex(1).GetValue(), 16) != 0):
+ print_tree(root.GetChildAtIndex(1))
+
+ print(root.GetChildAtIndex(0).GetSummary())
+
+ if (root.GetChildAtIndex(2).GetValue() is not None) and (
+ int(root.GetChildAtIndex(2).GetValue(), 16) != 0):
+ print_tree(root.GetChildAtIndex(2))