treeh.c 2.12 KB
#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;i<NBCHAR;i++)
    n->next[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;i<NBCHAR;i++)
    n->next[i]=make_empty_tree();
  return n;
}
void delete_tree(tree *t){
  if(is_empty(*t))return;
  for(int i=0;i<NBCHAR;i++)
    delete_tree(&((*t)->next[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;i<NBCHAR;i++){
    if(t->next[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;
}