[Lldb-commits] [lldb] r132512 - in /lldb/trunk/examples/scripting: ./ dictionary.c tree_utils.py
Caroline Tice
ctice at apple.com
Thu Jun 2 16:23:47 PDT 2011
Author: ctice
Date: Thu Jun 2 18:23:47 2011
New Revision: 132512
URL: http://llvm.org/viewvc/llvm-project?rev=132512&view=rev
Log:
Add source files for Python scripting example (coming soon).
Added:
lldb/trunk/examples/scripting/
lldb/trunk/examples/scripting/dictionary.c
lldb/trunk/examples/scripting/tree_utils.py (with props)
Added: lldb/trunk/examples/scripting/dictionary.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/scripting/dictionary.c?rev=132512&view=auto
==============================================================================
--- lldb/trunk/examples/scripting/dictionary.c (added)
+++ lldb/trunk/examples/scripting/dictionary.c Thu Jun 2 18:23:47 2011
@@ -0,0 +1,200 @@
+//===-- dictionary.c ---------------------------------------------*- C -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+typedef struct tree_node
+{
+ const char *word;
+ struct tree_node *left;
+ struct tree_node *right;
+} tree_node;
+
+/* Given a char*, returns a substring that starts at the first
+ alphabet character and ends at the last alphabet character, i.e. it
+ strips off beginning or ending quotes, punctuation, etc. */
+
+char *
+strip (char **word)
+{
+ char *start = *word;
+ int len = strlen (start);
+ char *end = start + len - 1;
+
+ while ((start < end) && (!isalpha (start[0])))
+ start++;
+
+ while ((end > start) && (!isalpha (end[0])))
+ end--;
+
+ if (start > end)
+ return NULL;
+
+ end[1] = '\0';
+ *word = start;
+
+ return start;
+}
+
+/* Given a binary search tree (sorted alphabetically by the word at
+ each node), and a new word, inserts the word at the appropriate
+ place in the tree. */
+
+void
+insert (tree_node *root, char *word)
+{
+ if (root == NULL)
+ return;
+
+ int compare_value = strcmp (word, root->word);
+
+ if (compare_value == 0)
+ return;
+
+ if (compare_value < 0)
+ {
+ if (root->left != NULL)
+ insert (root->left, word);
+ else
+ {
+ tree_node *new_node = (tree_node *) malloc (sizeof (tree_node));
+ new_node->word = strdup (word);
+ new_node->left = NULL;
+ new_node->right = NULL;
+ root->left = new_node;
+ }
+ }
+ else
+ {
+ if (root->right != NULL)
+ insert (root->right, word);
+ else
+ {
+ tree_node *new_node = (tree_node *) malloc (sizeof (tree_node));
+ new_node->word = strdup (word);
+ new_node->left = NULL;
+ new_node->right = NULL;
+ root->right = new_node;
+ }
+ }
+}
+
+/* Read in a text file and storea all the words from the file in a
+ binary search tree. */
+
+void
+populate_dictionary (tree_node **dictionary, char *filename)
+{
+ FILE *in_file;
+ char word[1024];
+
+ in_file = fopen (filename, "r");
+ if (in_file)
+ {
+ while (fscanf (in_file, "%s", word) == 1)
+ {
+ char *new_word = (strdup (word));
+ new_word = strip (&new_word);
+ if (*dictionary == NULL)
+ {
+ tree_node *new_node = (tree_node *) malloc (sizeof (tree_node));
+ new_node->word = new_word;
+ new_node->left = NULL;
+ new_node->right = NULL;
+ *dictionary = new_node;
+ }
+ else
+ insert (*dictionary, new_word);
+ }
+ }
+}
+
+/* Given a binary search tree and a word, search for the word
+ in the binary search tree. */
+
+int
+find_word (tree_node *dictionary, char *word)
+{
+ if (!word || !dictionary)
+ return 0;
+
+ int compare_value = strcmp (word, dictionary->word);
+
+ if (compare_value == 0)
+ return 1;
+ else if (compare_value < 0)
+ return find_word (dictionary->left, word);
+ else
+ return find_word (dictionary->right, word);
+}
+
+/* Print out the words in the binary search tree, in sorted order. */
+
+void
+print_tree (tree_node *dictionary)
+{
+ if (!dictionary)
+ return;
+
+ if (dictionary->left)
+ print_tree (dictionary->left);
+
+ printf ("%s\n", dictionary->word);
+
+
+ if (dictionary->right)
+ print_tree (dictionary->right);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ tree_node *dictionary = NULL;
+ char buffer[1024];
+ char *filename;
+ int done = 0;
+
+ if (argc == 2)
+ filename = argv[1];
+
+ if (!filename)
+ return -1;
+
+ populate_dictionary (&dictionary, filename);
+ fprintf (stdout, "Dictionary loaded.\nEnter search word: ");
+ while (!done && fgets (buffer, sizeof(buffer), stdin))
+ {
+ char *word = buffer;
+ int len = strlen (word);
+ int i;
+
+ for (i = 0; i < len; ++i)
+ word[i] = tolower (word[i]);
+
+ if ((len > 0) && (word[len-1] == '\n'))
+ {
+ word[len-1] = '\0';
+ len = len - 1;
+ }
+
+ if (find_word (dictionary, word))
+ fprintf (stdout, "Yes!\n");
+ else
+ fprintf (stdout, "No!\n");
+
+ fprintf (stdout, "Enter search word: ");
+ }
+
+ fprintf (stdout, "\n");
+ return 0;
+}
+
Added: lldb/trunk/examples/scripting/tree_utils.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/scripting/tree_utils.py?rev=132512&view=auto
==============================================================================
--- lldb/trunk/examples/scripting/tree_utils.py (added)
+++ lldb/trunk/examples/scripting/tree_utils.py Thu Jun 2 18:23:47 2011
@@ -0,0 +1,118 @@
+"""
+# ===-- tree_utils.py ---------------------------------------*- Python -*-===//
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+# ===---------------------------------------------------------------------===//
+
+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
+"""
+
+
+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() == 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() == 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 == 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() != None) and (int (root.GetChildAtIndex(1).GetValue(), 16) != 0):
+ print_tree (root.GetChildAtIndex(1))
+
+ print root.GetChildAtIndex(0).GetSummary()
+
+ if (root.GetChildAtIndex(2).GetValue() != None) and (int (root.GetChildAtIndex(2).GetValue(), 16) != 0):
+ print_tree (root.GetChildAtIndex(2))
+
+
Propchange: lldb/trunk/examples/scripting/tree_utils.py
------------------------------------------------------------------------------
svn:executable = *
More information about the lldb-commits
mailing list