projetV2.c~ 2.57 KB
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

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 <file_name>\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);
}