#define OK 1
/**************************************************************************************************
   **	Function name : leveeq
   **                   ------
   **	Description : Enleve le symbole 'eq' montrant le debut d'une equation.
   **	Input : char*: Formule en format RTF
   **	Output : int : 1 si reussi, -1 si echec.
   **************************************************************************************************/
int leveeq(char * formuleRTF)
{
  int i,j,k;
  i=0;
  while(formuleRTF[i]==' ' || formuleRTF[i]==0x09 /* Tab */)
    i++;
  if (formuleRTF[i]!='e' || formuleRTF[i+1]!='q')
    return -1;
  i+=2;
  while(formuleRTF[i]==' ' || formuleRTF[i]==0x09 /* Tab */)
    i++;
  strcpy(formuleRTF,&formuleRTF[i]);
  return OK;
}

/**************************************************************************************************
   **	Function name : Rec_Expression
   **                   --------------
   **	Description : Determine l'expression math'ematique correspondante, et trouve sa traduction
   en TeX ou appelle une autre fonction pour la gerer.
   **	Input : char*, char* : formule RTF et formule TeX (en output mais pointeur)
   **	Output : int: nombre de caracteres reconnus. (-1 si erreur).
   **************************************************************************************************/
int Rec_Expression(char* formuleRTF, char* formuleTeX)
{
  int i,j,k,l,m,n;
  int Num_col_Matrix=0;
  char temp[10];
  char coef=0;
  if (FLAG_Equation==2)
    coef='a'-'A';        /* Il s'agit d'une equation MAC en minuscules */
  m=0;
  if ((FLAG_Equation!=2) && (formuleRTF[0]!=0x5c || formuleRTF[1]!=0x5c))
    {
      /* La formule ne commence pas par un mot de commande: */
    while(formuleRTF[m]!=0x5c)
      {
	if (m>=strlen(formuleRTF))
	  {
	    return m;
	  }
	sprintf(temp,"%c",formuleRTF[m]);
	strcat(formuleTeX,temp);
	m++;
      }
    }
  i=m+4; 
  switch(formuleRTF[2+m]+coef)
    {
  case 'I':
    /* Il s'agit d'une integrale */
    strcat(formuleTeX,"\\int");
    strcat(formuleTeX,"_{");
    j=i;
    while(formuleRTF[i]!=',')
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    i++;
    strcat(formuleTeX,"}^{");
    j=i;
    while(formuleRTF[i]!=',')
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    i++;
    strcat(formuleTeX,"}");
    j=i;
    k=1;
    while(k!=0)
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      if (formuleRTF[i]=='(')
	k++;
      if (formuleRTF[i]==')')
	k--;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    return i+1;
    break;
  case 'A':
    /* Il s'agit d'une matrice */
    strcat(formuleTeX,"\n\\begin{array}{");
    j=i;
    while(formuleRTF[i]!=',')
      {
	if (formuleRTF[i]=='(')
	  {
	    /* On saute jusqu'a la fin de la parenthese fermante */
	    k=1;
	    Num_col_Matrix++;
	    while(k!=0)
	      {
		i++;
		if (formuleRTF[i]=='(')
		  k++;
		if (formuleRTF[i]==')')
		  k--;
	      }
	    /* i--; */
	  }
	/* if (formuleRTF[i]=='.')
	   Num_col_Matrix++; */
	i++;
      }
    i=j;
    for (n=0;n<=Num_col_Matrix;n++)
      strcat(formuleTeX,"c");
    strcat(formuleTeX,"}\n");
    k=1;
    while (k!=0)
      {
	while(formuleRTF[i]!=',' && k!=0)
	  {
	    
	    if (formuleRTF[i]=='.')
	      strcat(formuleTeX," & ");
	    /* Tester si recursivite */
	    if (formuleRTF[i]==0x5c)
	      {
		l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
		if (l<0) printf("ERREUR\n");
		else { i=i+l-1; j+=l; }
	      }
	    i++;
	    if (formuleRTF[i]=='(')
	      k++;
	    if (formuleRTF[i]==')')
	      k--;
	  }
	strncat(formuleTeX,&formuleRTF[j],i-j);
	i++;
	j=i;
	strncat(formuleTeX,"\\\\\n");
      }
    strcat(formuleTeX,"\n\\end{array}");
    return i+1;
    break;
  case 'X':
    /* La formule est encadree */
    return -1;
    break;
  case 'F':
    strcat(formuleTeX,"\\frac");
    strcat(formuleTeX,"{");
    j=i;
    while(formuleRTF[i]!=',')
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    i++;
    strcat(formuleTeX,"}{");
    j=i;
    k=1;
    while(k!=0)
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      if (formuleRTF[i]=='(')
	k++;
      if (formuleRTF[i]==')')
	k--;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    strcat(formuleTeX,"}");
    return i+1;
    break;
  case 'R':
    /* Il s'agit d'une racine n-ieme */
    strcat(formuleTeX,"{\\sqrt");
    strcat(formuleTeX,"[");
    j=i;
    while(formuleRTF[i]!=',')
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    i++;
    strcat(formuleTeX,"]{");
    j=i;
    k=1;
    while(k!=0)
      {
	/* Tester si recursivite */
      if (formuleRTF[i]==0x5c)
	{
	  l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	  if (l<0) printf("ERREUR\n");
	  else { i=i+l-1; j+=l; }
	}
      i++;
      if (formuleRTF[i]=='(')
	k++;
      if (formuleRTF[i]==')')
	k--;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    strcat(formuleTeX,"}}");
    return i+1;
    break;
  case 'L':
    /* Il s'agit d'une liste */
    return -1;
    break;
  case 'S':
    /* Il s'agit d'un jeu de coordonnees */
    return -1;
    break;
  case 'O':
    /* Il s'agit d'une superposition */
    return -1;
    break;
  case 'B':
    /* Il s'agit d'un element entre grosses parentheses */
    strcat(formuleTeX,"\\left(");
    j=i;
    k=1;
    while(k!=0)
      {
	/* Tester si recursivite */
	if (formuleRTF[i]==0x5c)
	  {
	    l=Rec_Expression(&formuleRTF[i],&formuleTeX[strlen(formuleTeX)]);
	    if (l<0) printf("ERREUR\n");
	    else { i=i+l-1; j+=l; }
	  }
	i++;
	if (formuleRTF[i]=='(')
	  k++;
	if (formuleRTF[i]==')')
	  k--;
      }
    strncat(formuleTeX,&formuleRTF[j],i-j);
    strcat(formuleTeX,"\\right)");
    return i+1;
    break;
  default:
    /* Code inconnu */
    return -1;
    break;
    }
}


/**************************************************************************************************
   **	Function name : Rec_Formule
   **                   -----------
   **	Description : Reconnaissance d'une formule mathematique
   **	Input : char *: Formule en format RTF
   **	Output : char *: Formule en format TEX
   **************************************************************************************************/
char * Rec_Formule(char * formuleRTF)
{
  char * formuleTeX;
  char temp[512];
  char coef=0;
  int i,j,k;
  if (FLAG_Equation==1)    /* Il s'agit d'une equation PC: Field */
    if (leveeq(formuleRTF)==-1)
      return puretext(formuleRTF);
  formuleTeX=(char *) malloc (2*length);
  if (FLAG_Dollars==0)
    strcpy(formuleTeX,"$");
  else
    strcpy(formuleTeX,"$$");
  j=0;
  do 
    {
      k=Rec_Expression(&formuleRTF[j],&formuleTeX[strlen(formuleTeX)]);
      if (k <0) 
	return puretext(formuleRTF);
      j=j+k;
    } while (j<strlen(formuleRTF));
  if (FLAG_Dollars==0)
    strcat(formuleTeX,"$");
  else
    strcat(formuleTeX,"$$");
  return formuleTeX;
}

/*void main(void)
{
  strcpy(tampon," eq \\\\B(\\\\A(\\\\F(x+sin(x),1),\\\\R(27,sin(x)+ch(th(x))),\\\\I(1,2,log(x+sin(x)))))");
  printf("\n\n\t\t[%s]\n\n",Rec_Formule(tampon));
}*/