#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include "util.h"


int l_rule_is_applicable(char *form, char *l_rule)
{
  int i,j;
  int sep_index;
  int lemma_suffix_length;
  int form_suffix_length;
  int form_length = strlen(form);
  int l_rule_length = strlen(l_rule);
  
  for(sep_index=1; sep_index < l_rule_length; sep_index++)
    if(l_rule[sep_index] == '@')
      break;
  
  lemma_suffix_length = l_rule_length - 1 - sep_index;
  form_suffix_length = sep_index - 1;

  for(j=0, i=form_length - form_suffix_length; j < sep_index; i++, j++)
    if((l_rule[j] != '*') && (l_rule[j] != form[i]))
      return 0;
  return 1;
}

char *apply_l_rule(char *form, char *l_rule)
{
  int i,j;
  int sep_index;
  int lemma_suffix_length;
  int form_suffix_length;
  char *lemma = NULL;
  int form_length = strlen(form);
  int l_rule_length = strlen(l_rule);
  int lemma_length;
  
  for(sep_index=1; sep_index < l_rule_length; sep_index++)
    if(l_rule[sep_index] == '@')
      break;
  
  lemma_suffix_length = l_rule_length - 1 - sep_index;
  form_suffix_length = sep_index - 1;

  lemma_length = form_length + lemma_suffix_length - form_suffix_length;
  if(lemma_length < form_length)
    lemma_length = form_length;
  lemma = (char *) memalloc((lemma_length + 1) * sizeof(char)); 
  strcpy(lemma, form);

  for(j=0, i=form_length - form_suffix_length; j < lemma_suffix_length; i++, j++){
    lemma[i] = l_rule[sep_index + j + 1];
  }
  lemma[i] = 0;
  return lemma;
}
  

char *compute_l_rule(char *lemma, char *form, int strict)
{
  int breakpoint,j,k;
  int lemma_suffix_length;
  int form_suffix_length;
  int lemma_length = strlen(lemma);
  int form_length = strlen(form);
  char *l_rule;
  
  for(breakpoint=0; (breakpoint < lemma_length) && (breakpoint < form_length); breakpoint++)
    if(form[breakpoint] != lemma[breakpoint])
      break;

  lemma_suffix_length = lemma_length - breakpoint;
  form_suffix_length = form_length - breakpoint;

  //  printf("lemma suffix length = %d form suffix length = %d\n", lemma_suffix_length, form_suffix_length);
  l_rule = (char *)memalloc((lemma_suffix_length + form_suffix_length + 3) * sizeof(char));

  j = 0;
  l_rule[j++] = '@'; 
  for(k=0; k < form_suffix_length; k++)
    l_rule[j++] = strict? form[breakpoint + k] : '*';
  l_rule[j++] = '@';
  for(k=0; k < lemma_suffix_length; k++)
    l_rule[j++] = lemma[breakpoint + k];
  l_rule[j] = 0;
  return l_rule;
}