#include #include #include #include struct cell { int stop; struct cell * liste[26]; }; int num(char c){ int x; x=c; if (x>96 && x<123){x=x-97;} if (x>64 && x<91) {x=x-65;} return x; } int ajout_mot(struct cell ** d,char * m){ char c; struct cell **tmp1 , *tmp2 ; int x=0; if (*d==NULL){return EXIT_FAILURE;} tmp1=d; c=m[x]; while (c != '\0'){ //printf("%c",c); if ((*tmp1)->liste[num(c)]==NULL){ tmp2=malloc(sizeof(struct cell)); (*tmp1)->liste[num(c)]=tmp2; } tmp1=&((*tmp1)->liste[num(c)]); x++; c=m[x]; } (*tmp1)->stop=1; //printf("\n"); return 1; } void creation_dico(FILE *fd, struct cell **d){ char s[20]; while (fscanf(fd,"%s",s)==1){ ajout_mot(d,s); } } int fin_mot(char c){ if (c == '\0' || c == ' ' || c== '.' || c == ':' || c == ',' || c == '?' || c == ';'){ return 1;} return 0; } int comparaison(char *m , int x , int conjug){ if (fin_mot(m[x])==1){ return 1; } if (conjug==1){ if (fin_mot(m[x+1])==1 && m[x]=='s'){ return 1; } if (fin_mot(m[x+2])==1 && m[x+1]=='d' && m[x]=='e'){ return 1; } if (fin_mot(m[x+3])==1 && m[x+2]=='g' && m[x+1]=='n' && m[x]=='i'){ return 1; } } return 0; } int reconaissance(struct cell * d,char * m){ char c; struct cell *tmp1; int x=0; tmp1=d; if (d==NULL){return 1;} c=m[x]; while (comparaison (m,x,1) == 0 ){ if (tmp1->liste[num(c)]==NULL){return 1;} tmp1=(tmp1->liste[num(c)]); x++; c=m[x]; } if (tmp1->stop==1) {return 0;} return 1; } int lecture(FILE *fd, struct cell *d){ char s[20]; int cmpt=0; int x; while (fscanf(fd,"%s",s)==1){ x=reconaissance(d,s); cmpt+=x; if(x==1){printf("%s \n",s);} } return cmpt; } void suprime_dico(struct cell **d){ int i=0; for (i=0;i<26;i++){ if ((*d)->liste[i]!=NULL){ suprime_dico(&((*d)->liste[i])); } } free(*d); } int main(int argc, char *argv[]) { if (argc < 3) { fprintf(stderr, "usage: hash \n"); return EXIT_FAILURE; } FILE *fp; printf("%s\n",argv[1]); fp=fopen(argv[1], "r"); if (fp==NULL) { fprintf(stderr, "no such file, or unreachable: %s\n", argv[1]); return EXIT_FAILURE; } FILE *fd; printf("%s\n",argv[2]); fd=fopen(argv[2], "r"); if (fd==NULL) { fprintf(stderr, "no such file, or unreachable: %s\n", argv[2]); return EXIT_FAILURE; } struct cell *d; d=malloc(sizeof(struct cell)); creation_dico(fp,&d); int inc; inc=lecture(fd,d); printf("%d mots non reconnus \n", inc); suprime_dico(&d); }