Blame view

dico.c 4.54 KB
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);
  }