/**
* Implements a dictionary's functionality.
*/
#include <stdbool.h>
#include "dictionary.h"
#include<string.h>
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
int count=0;
node *root=NULL;
/**
* Returns true if word is in dictionary else false.
*/
bool check(const char *word)
{
node *tmp;
tmp=root;
for(int i=0;word[i]!='\0';i++)
{
int a;
if(word[i]>='A' && word[i]<='Z')
a=(int)word[i]-65;
else if(word[i]>='a' && word[i]<='z')
a=(int)word[i]-97;
else
a=26;
if(tmp->children[a]==NULL)
return false;
else
tmp=tmp->children[a];
}
return tmp->is_word;
}
/**
* Loads dictionary into memory. Returns true if successful else false.
*/
char name[LENGTH+1];
bool load(const char *dictionary)
{
node *newnode;
FILE* file = fopen(dictionary, "r");
if (file == NULL)
{
printf("Could not open dictionary.\n");
return false;
}
root= calloc(1, sizeof(node));
while (fscanf(file,"%s\n",name)>0)
{
count++;
node *tmp;
tmp=root;
for(int i=0;name[i]!='\0';i++)
{
int a;
if(isalpha(name[i]))
a=(int)name[i]-97;
else
a=26;
if(tmp->children[a]==NULL)
{
newnode=calloc(1, sizeof(node));
tmp->children[a]=newnode;
tmp=newnode;
}
else
tmp=newnode;
}
tmp->is_word=true;
}
// TODO
fclose(file);
return true;
}
/**
* Returns number of words in dictionary if loaded else 0 if not yet loaded.
*/
unsigned int size(void)
{
return count;
}
/**
* Unloads dictionary from memory. Returns true if successful else false.
*/
bool unload(void)
{ if(root==NULL)
return false;
delNode(root);
return true;
}
void delNode(node *tempNode)
{
for (int i=0;i<27;i++)
{
if (tempNode->children[i] != NULL)
delNode(tempNode->children[i]);
}
free(tempNode);
}
OUTPUT
~/workspace/pset5/speller/ (master) $ ./speller texts/ralph.txt
MISSPELLED WORDS
When
grow
up
want
to
be
principal
or
caterpillar
love
you
Principal
Skinner
Ralph
Wiggum
WORDS MISSPELLED: 15
WORDS IN DICTIONARY: 143091
WORDS IN TEXT: 20
TIME IN load: 0.19
TIME IN check: 0.00
TIME IN size: 0.00
TIME IN unload: 0.18
TIME IN TOTAL: 0.37
root
node is never allocated.