#include "dico.h" void make_empty_dico(dico d){ for(int i=0;inext[hash(word[i+1])]); } //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; if(isalpha(word[i+1])) tmp=&((*tmp)->next[hash(word[i+1])]); } (*temp)->isEnd = endKind; } //if word is ended else{ isIn=endKind & (*temp)->isEnd; (*temp)->isEnd = endKind | (*temp)->isEnd; } return isIn; } 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(fscanf(stream,"%30s",word)==1){ 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("\n\nThis is what the dictionnary contains :\n"); for(int i=0;iletter),1); if(is_end(t)){ string word2=calloc((strlen(prefix)+4),sizeof(char)); strcpy(word2,word); //common_end if(is_common_end(t) && is_straight_end(t)){ fprintf(stream,"%s\n",word2); } 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); } //acronyme_end 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); } free(word2); } for(int i=0;inext[i],stream,word); } free(word); } //uppers all letters in str void strupper(string str){ for(int i=0;str[i]!='\0';i++) str[i]=toupper(str[i]); } byte is_in(dico d,string word){ //return : -1 if incorrect word, 1 if is in, else 0 byte endKind=end_kind(word); if(!is_word(endKind)){ return -1; } 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)); } 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){ /*//get rid of punctuation marks isIn=0; while(ischar_of_word(word[(int)isIn])) isIn++; word[(int)isIn]='\0'; */ isIn=is_in(d,word); if(isIn<1){ if(someWrong==0){ someWrong=1; fprintf(outStream,"Voici les mots absent du dictionnaire\n"); } 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"); } } } //fermer outStream pour permettre à l'utilisateur de lire le compte rendu des tests if(outStream!=stdout) fclose(outStream); outStream=stdout; //aucun mot ne peut être ajouté au dictionnaire ? if(is_emptyLIFO(absWords)){ if(someWrong) printf("Parmi les mots absents du dictionnaire, aucun ne peut être ajouté au dictionnaire.\n"); else printf("Felicitations !!!\nAucun des mots que vous avez entre n'est absents du dictionnaire.\n"); return; } //ajout des mots absent? 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); }