dico.c
2.55 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
123
124
125
126
127
128
129
130
131
132
133
134
#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\n");
return true;
}
return addto_treeIT(&(d[hash(s[0])]),s,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\n");
return;
}
char word[30]={0};
while(fgets(word,30,stream)!=NULL){
if(word[0]=='\n')break;
printf("ok. next :");
fflush(stdout);
addto_dico(d,word);
}
printf("load success\n");
}
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\n");
return;
}
if(d==NULL){
printf("sorry, we can't open the dictionary\n");
return;
}
printf("This is what the dictionnary contains :\n");
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));
}