#include "treeh.h" //initializers & destroyer tree make_empty_tree(){ return NULL; } node* make_empty_node(){ node*n=malloc(sizeof(node)); n->letter='\0'; n->isEnd=0; for(int i=0;inext[i]=make_empty_tree(); return n; } node* make_node(char l,int end){ node*n=malloc(sizeof(node)); n->letter=l; n->isEnd=end; for(int i=0;inext[i]=make_empty_tree(); return n; } void delete_tree(tree t){ if(is_empty(t))return; for(int i=0;inext[i]); free(t); } //Casual functions bool is_empty(const tree t){ return t==NULL; } bool is_followed(const tree t){ int i; for(i=0;inext[i]!=NULL) return true; } return false; } //functions is_end bool is_end(const tree t){return t->isEnd & 13;}//0b00010101 bool ends_with_apostrophe(const tree t){return t->isEnd & 26;}//0b00101010 bool is_common_end(const tree t){return t->isEnd & 3;}//0b00000011 bool is_proper_end(const tree t){return t->isEnd & 12;}//0b00001100 bool is_acronyme_end(const tree t){return t->isEnd & 48;}//0b00110000 int hash(char c){ //needs to check c wether isalpha return c%32-1; } //loading functions bool addto_tree(tree t,const string s,char endKind){ //recursive, need to check all letter in s are alpha or "\'s" //return wether s is already in t or not bool ret; if(s[0]=='\0'){ ret=is_end(t); t->isEnd=t->isEnd|endKind; return ret; } if(s[0]=='\''){ ret=ends_with_apostrophe(t); t->isEnd=t->isEnd|endKind; return ret; } if(t->next[hash(s[0])]==NULL){ t->next[hash(s[0])]=make_node(s[0],0); addto_tree2(t->next[hash(s[0])],s+1,endKind); return false; } else return addto_tree(t->next[hash(s[0])],s+1,endKind); } void addto_tree2(tree t,const string s,char endKind){ //faster than addto_tree //used when it is known the word is not yet in dictionnary if(s[0]=='\0' || s[0]=='\''){ t->isEnd=endKind; return; } t->next[hash(s[0])]=make_node(s[0],0); addto_tree2(t->next[hash(s[0])],s+1,endKind); }