0bc3d1ad
bjeanlou
dico created
|
1
2
3
|
#include "dico.h"
void make_empty_dico(dico d){
|
003d3e48
bjeanlou
update6 withHash
|
4
|
for(int i=0;i<NBCHAR;i++)
|
0bc3d1ad
bjeanlou
dico created
|
5
6
|
d[i]=NULL;
}
|
a0fe64d2
bjeanlou
Update dico
|
7
|
void delete_dico(dico d){
|
cf53766d
bjeanlou
update2 dico
|
8
|
for(int i=0;i<NBCHAR;i++)
|
ccb47d03
bjeanlou
menu quit ok
|
9
|
delete_tree(d+i);
|
0bc3d1ad
bjeanlou
dico created
|
10
11
|
}
|
11c78e6d
bjeanlou
update5 withHash
|
12
13
|
|
8c671959
bjeanlou
No more seg fault
|
14
|
byte addto_dico(dico d,const string word){
|
ccb47d03
bjeanlou
menu quit ok
|
15
|
//return values : -1 if word can't enter, 0if allready in dico, 1 if added
|
8c671959
bjeanlou
No more seg fault
|
16
|
int i;
|
2c6f0266
bjeanlou
load and print OK
|
17
18
|
byte isIn=0, endKind=0;
endKind=end_kind(word);
|
11c78e6d
bjeanlou
update5 withHash
|
19
|
if(!is_word(endKind)){
|
08822d77
bjeanlou
Update 9 withHash
|
20
|
printf("%s is incorrect\n",word);
|
8c671959
bjeanlou
No more seg fault
|
21
|
return -1;
|
a0fe64d2
bjeanlou
Update dico
|
22
|
}
|
2c6f0266
bjeanlou
load and print OK
|
23
|
tree*tmp=&d[hash(word[0])],*temp=tmp;
|
8c671959
bjeanlou
No more seg fault
|
24
|
//1st, let's go through the tree, until the word is not in tree
|
08822d77
bjeanlou
Update 9 withHash
|
25
|
for(i=0; word[i]!='\0' && word[i]!='\'' && !is_empty(*tmp) ;i++){
|
8c671959
bjeanlou
No more seg fault
|
26
|
temp=tmp;
|
2c6f0266
bjeanlou
load and print OK
|
27
|
if(isalpha(word[i+1]))
|
08822d77
bjeanlou
Update 9 withHash
|
28
|
tmp=&((*tmp)->next[hash(word[i+1])]);
|
8c671959
bjeanlou
No more seg fault
|
29
30
31
32
33
34
35
|
}
//if word is not ended at the end of the tree
if(is_empty(*tmp)){
isIn=0;
for(; word[i]!='\0' && word[i]!='\'';i++){
*tmp=make_node(tolower(word[i]),NOT_AN_END);
temp=tmp;
|
2c6f0266
bjeanlou
load and print OK
|
36
37
|
if(isalpha(word[i+1]))
tmp=&((*tmp)->next[hash(word[i+1])]);
|
8c671959
bjeanlou
No more seg fault
|
38
39
|
}
(*temp)->isEnd = endKind;
|
08822d77
bjeanlou
Update 9 withHash
|
40
|
printf("%s added\n",word);
|
8c671959
bjeanlou
No more seg fault
|
41
42
43
44
|
fflush(stdout);
}
//if word is ended
else{
|
08822d77
bjeanlou
Update 9 withHash
|
45
|
isIn=endKind & (*temp)->isEnd;
|
2c6f0266
bjeanlou
load and print OK
|
46
47
|
(*temp)->isEnd = endKind | (*temp)->isEnd;
printf("%s %s in\n",word,(isIn!=0)?("allready"):("not yet"));
|
8c671959
bjeanlou
No more seg fault
|
48
49
50
|
fflush(stdout);
}
return isIn;
|
a0fe64d2
bjeanlou
Update dico
|
51
52
|
}
|
8c671959
bjeanlou
No more seg fault
|
53
54
55
56
57
|
|
11c78e6d
bjeanlou
update5 withHash
|
58
59
60
|
void loadfrom_keyboard(dico d){loadfrom_file(d,stdin);}
void loadfrom_file(dico d,FILE*stream){
if(stream==NULL){
|
a89bb625
bjeanlou
Update 8 withHash
|
61
|
printf("sorry, we can't open the file\n");
|
11c78e6d
bjeanlou
update5 withHash
|
62
|
return;
|
62535895
bjeanlou
Update1 dico
|
63
|
}
|
003d3e48
bjeanlou
update6 withHash
|
64
|
char word[30]={0};
|
8c671959
bjeanlou
No more seg fault
|
65
|
while(fscanf(stream,"%30s",word)!=EOF){
|
003d3e48
bjeanlou
update6 withHash
|
66
|
addto_dico(d,word);
|
a89bb625
bjeanlou
Update 8 withHash
|
67
68
|
}
printf("load success\n");
|
11c78e6d
bjeanlou
update5 withHash
|
69
70
|
}
|
a89bb625
bjeanlou
Update 8 withHash
|
71
72
73
74
75
76
77
78
|
|
cf53766d
bjeanlou
update2 dico
|
79
|
void printto_terminal(dico d){printto_file(d,stdout);}
|
003d3e48
bjeanlou
update6 withHash
|
80
81
|
void printto_file(dico d,FILE*stream){
if(stream==NULL){
|
a89bb625
bjeanlou
Update 8 withHash
|
82
|
printf("sorry, we can't open the file\n");
|
003d3e48
bjeanlou
update6 withHash
|
83
84
85
|
return;
}
if(d==NULL){
|
a89bb625
bjeanlou
Update 8 withHash
|
86
|
printf("sorry, we can't open the dictionary\n");
|
003d3e48
bjeanlou
update6 withHash
|
87
88
|
return;
}
|
08822d77
bjeanlou
Update 9 withHash
|
89
|
printf("\n\nThis is what the dictionnary contains :\n");
|
003d3e48
bjeanlou
update6 withHash
|
90
91
92
93
94
95
96
97
98
|
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;
|
cf53766d
bjeanlou
update2 dico
|
99
100
101
102
103
|
string word=calloc((strlen(prefix)+2),sizeof(char));
strcpy(word,prefix);
strncat(word,&(t->letter),1);
|
003d3e48
bjeanlou
update6 withHash
|
104
|
if(is_end(t)){
|
cf53766d
bjeanlou
update2 dico
|
105
106
107
|
string word2=calloc((strlen(prefix)+4),sizeof(char));
strcpy(word2,word);
//common_end
|
08822d77
bjeanlou
Update 9 withHash
|
108
109
|
if(is_common_end(t) && is_straight_end(t)){
fprintf(stream,"%s\n",word2);
|
003d3e48
bjeanlou
update6 withHash
|
110
|
}
|
08822d77
bjeanlou
Update 9 withHash
|
111
112
113
114
115
116
117
118
119
120
|
if(is_common_end(t) && ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
}
//proper_end1
word2[0]=toupper(word2[0]);
if(is_proper_end(t) && is_straight_end(t)){
fprintf(stream,"%s\n",word2);
}
if(is_proper_end(t) && ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
|
003d3e48
bjeanlou
update6 withHash
|
121
|
}
|
cf53766d
bjeanlou
update2 dico
|
122
|
//acronyme_end
|
08822d77
bjeanlou
Update 9 withHash
|
123
124
125
126
127
128
|
strupper(word2);
if(is_acronyme_end(t) && is_straight_end(t)){
fprintf(stream,"%s\n",word2);
}
if(is_acronyme_end(t) && ends_with_apostrophe(t)){
fprintf(stream,"%s's\n",word2);
|
003d3e48
bjeanlou
update6 withHash
|
129
|
}
|
08822d77
bjeanlou
Update 9 withHash
|
130
|
|
cf53766d
bjeanlou
update2 dico
|
131
|
free(word2);
|
003d3e48
bjeanlou
update6 withHash
|
132
133
|
}
for(int i=0;i<NBCHAR;i++){
|
cf53766d
bjeanlou
update2 dico
|
134
|
print(t->next[i],stream,word);
|
003d3e48
bjeanlou
update6 withHash
|
135
|
}
|
cf53766d
bjeanlou
update2 dico
|
136
137
138
|
free(word);
}
|
ccb47d03
bjeanlou
menu quit ok
|
139
|
//uppers all letters in str
|
cf53766d
bjeanlou
update2 dico
|
140
141
142
|
void strupper(string str){
for(int i=0;str[i]!='\0';i++)
str[i]=toupper(str[i]);
|
0bc3d1ad
bjeanlou
dico created
|
143
|
}
|
fd1ee590
bjeanlou
Update7 withHash
|
144
145
|
|
ccb47d03
bjeanlou
menu quit ok
|
146
147
|
byte is_in(dico d,string word){
//return : -1 if incorrect word, 1 if is in, else 0
|
fd1ee590
bjeanlou
Update7 withHash
|
148
149
|
byte endKind=end_kind(word);
if(!is_word(endKind)){
|
ccb47d03
bjeanlou
menu quit ok
|
150
|
return -1;
|
fd1ee590
bjeanlou
Update7 withHash
|
151
152
|
}
tree tmp=d[hash(word[0])];
|
a89bb625
bjeanlou
Update 8 withHash
|
153
|
for(int i=1; word[i]!='\0' && word[i]!='\'' && !is_empty(tmp) ;i++){
|
fd1ee590
bjeanlou
Update7 withHash
|
154
155
156
157
|
tmp=tmp->next[hash(word[i])];
}
return !is_empty(tmp) && (endKind & is_end(tmp));
}
|
ccb47d03
bjeanlou
menu quit ok
|
158
159
160
161
162
163
164
165
166
167
|
void test_words(dico d,FILE*inStream,FILE*outStream){
stringLIFO absWords=init_stringLIFO();
char word[30]={0};
byte isIn=0,someWrong=0;
while(fscanf(inStream,"%30s",word)!=EOF){
isIn=is_in(d,word);
if(isIn<1){
if(someWrong==0){
someWrong=1;
|
b2638a8a
bjeanlou
création rapport
|
168
|
fprintf(outStream,"Voici les mots absent du dictionnaire\n");
|
ccb47d03
bjeanlou
menu quit ok
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
}
fprintf(outStream,"%s est absent dans le dictionnaire",word);
if(isIn)
fprintf(outStream,", car il est incorrect.\n");
else{
push(&absWords,word);
fprintf(outStream,".\n");
}
}
}
//ajout des mots absent?
if(is_emptyLIFO(absWords))return;
printf("Voulez-vous ajouter certains de ces mots au dictionnaire?\n(1 for yes,0 for no)\n");
someWrong=saisie(0,1);
//ajout de certains mots au cas par cas
if(someWrong){
string aword;
while(!is_emptyLIFO(absWords)){
aword=pop(&absWords);
printf("Voulez-vous ajouter %s au dictionnaire? (1 for yes,0 for no)\n",aword);
isIn=saisie(0,1);
if(isIn){
addto_dico(d,aword);
}
free(aword);
}
}
delete_LIFO(&absWords);
}
|