forked from OSchip/llvm-project
201 lines
4.3 KiB
C
201 lines
4.3 KiB
C
//===-- 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;
|
|
}
|
|
|