#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));
}*/