dico.c 2.54 KB
#include "dico.h"

void make_empty_dico(dico d){
  for(int i=0;i<NBCHAR;i++)
    d[i]=NULL;
}
void delete_dico(dico d){
  for(int i=0;i<NBCHAR;i++)
    delete_tree(d[i]);
}



bool addto_dico(dico d,const string s){
  byte endKind=end_kind(s);
  if(!is_word(endKind)){
    printf("incorrect word");
    return true;
  }
  if(is_empty(d[hash(s[0])])){
     d[hash(s[0])]=make_node(s[0],0);
     addto_tree2(d[hash(s[0])],s+1,endKind);
     return false;
  }
  else {
    return addto_tree(d[hash(s[0])],s+1,endKind);
  }
}

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");
    return;
  }
  char word[30]={0};
  while(fscanf(stream,"%s",word)!=EOF)
    addto_dico(d,word);
  printf("load success");
}

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");
    return;
  }
  if(d==NULL){
    printf("sorry, we can't open the dictionary");
    return;
  }
  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;
  
  string word=calloc((strlen(prefix)+2),sizeof(char));
  strcpy(word,prefix);
  strncat(word,&(t->letter),1);
  
  if(is_end(t)){
    string word2=calloc((strlen(prefix)+4),sizeof(char));
    strcpy(word2,word);
    //common_end
    if(is_common_end(t)){
      if(is_straight_end(t)){
	fprintf(stream,"%s\n",word2);
      }
      if(ends_with_apostrophe(t)){
	fprintf(stream,"%s's\n",word2);
      }
    }
    //proper_end
    if(is_proper_end(t)){
      word2[0]=toupper(word2[0]);
      if(is_straight_end(t)){
	fprintf(stream,"%s\n",word2);
      }
      if(ends_with_apostrophe(t)){
	fprintf(stream,"%s's\n",word2);
      }
    }
    //acronyme_end
    if(is_acronyme_end(t)){
      strupper(word2);
      if(is_straight_end(t)){
	fprintf(stream,"%s\n",word2);
      }
      if(ends_with_apostrophe(t)){
	fprintf(stream,"%s's\n",word2);
      }
    }
    free(word2);
  }
  for(int i=0;i<NBCHAR;i++){
    print(t->next[i],stream,word);
  }
    free(word);
}

void strupper(string str){
  for(int i=0;str[i]!='\0';i++)
    str[i]=toupper(str[i]);
}


bool is_in(dico d,string word){
  byte endKind=end_kind(word);
  if(!is_word(endKind)){
    return false;
  }
  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));
}