#include "treeh.h" //initializers & destroyer tree make_empty_tree(){ return NULL; } node* make_empty_node(){ //<=> make_node('\0',NOT_AN_END) node*n=malloc(sizeof(node)); n->letter='\0'; n->isEnd=NOT_AN_END; for(int i=0;inext[i]=make_empty_tree(); return n; } node* make_node(char l,byte 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); *t=NULL; } //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;} bool is_straight_end(const tree t){return (t->isEnd & STRAIGHT_END);} bool ends_with_apostrophe(const tree t){return (t->isEnd & APOSTROPHE_END);} bool is_common_end(const tree t){return (t->isEnd & COMMON_END);} bool is_proper_end(const tree t){return (t->isEnd & PROPER_END);} bool is_acronyme_end(const tree t){return (t->isEnd & ACRONYME_END);} //functions not directly related to the structure int hash(char c){return c%32-1;}//needs to check c wether isalpha bool ischar_of_word(char c){return (c=='\'' || isalpha(c));} bool is_word(const byte endKind){return endKind!=NOT_AN_END;} byte end_kind(const string s){ byte endKind=NOT_AN_END; int i=1; //1st, let's consider all letters if(!isalpha(s[0])) return NOT_AN_END; if(islower(s[0])){ endKind=COMMON_END; while(islower(s[i]))i++; } else {//if isupper(s[0]) endKind=PROPER_END; if(isalpha(s[1])){ if(islower(s[1])){ endKind=PROPER_END; i=2; while(islower(s[i]))i++; } else{//if isupper(s[1]) endKind=ACRONYME_END; i=2; while(isupper(s[i]))i++; } } } //then let's consider the end if(s[i]=='\0'){ return (endKind & STRAIGHT_END); } if(s[i]=='\'' && s[i+1]=='s' && s[i+2]=='\0'){ return (endKind & APOSTROPHE_END); } return NOT_AN_END; }