dico.c
2.54 KB
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "dico.h"
void make_empty_dico(dico d){
for(int i=0;i<NBCHAR;i++)
d[i]=NULL;
}
void delete_dico(dico d){
for(int i=0;i<NBCHAR;i++)
delete_tree(d[i]);
}
bool addto_dico(dico d,const string s){
byte endKind=end_kind(s);
if(!is_word(endKind)){
printf("incorrect word");
return true;
}
if(is_empty(d[hash(s[0])])){
d[hash(s[0])]=make_node(s[0],0);
addto_tree2(d[hash(s[0])],s+1,endKind);
return false;
}
else {
return addto_tree(d[hash(s[0])],s+1,endKind);
}
}
void loadfrom_keyboard(dico d){loadfrom_file(d,stdin);}
void loadfrom_file(dico d,FILE*stream){
if(stream==NULL){
printf("sorry, we can't open the file");
return;
}
char word[30]={0};
while(fscanf(stream,"%s",word)!=EOF)
addto_dico(d,word);
printf("load success");
}
void printto_terminal(dico d){printto_file(d,stdout);}
void printto_file(dico d,FILE*stream){
if(stream==NULL){
printf("sorry, we can't open the file");
return;
}
if(d==NULL){
printf("sorry, we can't open the dictionary");
return;
}
for(int i=0;i<NBCHAR;i++){
print(d[i],stream,"");
}
}
void print(tree t,FILE*stream,string prefix){
//needs to check stream!=NULL
if(is_empty(t))
return;
string word=calloc((strlen(prefix)+2),sizeof(char));
strcpy(word,prefix);
strncat(word,&(t->letter),1);
if(is_end(t)){
string word2=calloc((strlen(prefix)+4),sizeof(char));
strcpy(word2,word);
//common_end
if(is_common_end(t)){
if(is_straight_end(t)){
fprintf(stream,"%s\n",word2);
}
if(ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
}
}
//proper_end
if(is_proper_end(t)){
word2[0]=toupper(word2[0]);
if(is_straight_end(t)){
fprintf(stream,"%s\n",word2);
}
if(ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
}
}
//acronyme_end
if(is_acronyme_end(t)){
strupper(word2);
if(is_straight_end(t)){
fprintf(stream,"%s\n",word2);
}
if(ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
}
}
free(word2);
}
for(int i=0;i<NBCHAR;i++){
print(t->next[i],stream,word);
}
free(word);
}
void strupper(string str){
for(int i=0;str[i]!='\0';i++)
str[i]=toupper(str[i]);
}
bool is_in(dico d,string word){
byte endKind=end_kind(word);
if(!is_word(endKind)){
return false;
}
tree tmp=d[hash(word[0])];
for(int i=1;word[i]!='\0' && word[i]!='\'' && !is_empty(tmp);i++){
tmp=tmp->next[hash(word[i])];
}
return !is_empty(tmp) && (endKind & is_end(tmp));
}