-
Notifications
You must be signed in to change notification settings - Fork 0
/
palindrome.c
101 lines (90 loc) · 2.61 KB
/
palindrome.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#include "palindrome.h"
#include "wordstat.h"
#include "mystdlib.h"
char * delims = " !\"#$%&'()*+,-./0123456789:;<=>?@[\\]^_ ';|}~\n\t\r’`";
void
str_toupper (char * word)
{
int i;
for (i = 0; i < strlen(word); i++)
word[i] = toupper (word[i]);
}
bool
is_palindrome (char * word)
{
int i, len = strlen(word);
for (i = 0; i < len/2; i++)
if (word[i] != word[len-i-1]) return false;
return true;
}
static int
list_cmp (const void * in1, const void * in2)
{
// comparison function for the structs with words and frequencies
// we must dereference the struct *s to get to the char *s
return strcmp (((word*)in1)->word, ((word*)in2)->word);
}
void
list_incr (word ** list, int * list_count, char * token)
{
word * node;
// word to search for
word search = {token, 1};
if ((node = my_bsearch(&search, *list, *list_count, sizeof(word), list_cmp)) != NULL)
// the value was found in the list; just increment it
node->freq++;
else
{
// we need to add the value into the list, our list is made up of
// real struct words (not pointers) so realloc to enough space
// for another struct word
(*list_count)++;
*list = realloc (*list, (*list_count) * sizeof(word));
(*list)[*list_count - 1].word = token;
(*list)[*list_count - 1].freq = 1;
// qsort it now so we can bsearch it later
my_qsort (*list, *list_count, sizeof(word), list_cmp);
}
}
void
palindromes (char * file, char ** dict, int dict_count)
{
char * token = strtok (file, delims); // begin tokenization
word * list = NULL;
int list_count = 0, i;
do
{
// two delims next to eachother
if (token[0] == '\0') continue;
str_toupper (token);
if (is_palindrome (token)) // we found one -- update the list
list_incr (&list, &list_count, token);
} while ((token = strtok (NULL, delims)) != NULL);
for (i = 0; i < list_count; i++) // print the data we got
printf ("%s\t\t%d\t\t%s\n", list[i].word, list[i].freq, in_dict (dict, dict_count, list[i].word) ? "Y" : "N");
free(list);
}
int
num_words (char * file)
{
int ret = 0;
char * token = strtok (file, delims);
do ret++; // add to ret while there are tokens
while ((token = strtok (NULL, delims)) != NULL);
return ret;
}
int
num_lines (char * file)
{
int ret = 0;
char * token = NULL;
token = strchr (file, '\n');
while ((token = strchr (file + (token - file) + 1, '\n')) != NULL)
ret++; // add to ret while there are tokens
return ret + 1;
}