#define NB_MC_Fields 1
typedef struct _E_Q_FIELDS_ { char * FieldRTF; char * MyField; } EQField;
EQField TAB_MC_Fields[NB_MC_Fields]=
{ { "eq", "\\pzpeq" }
};

/**************************************************************************************************
**      Function name : filtrefields
**
**      Description : Recupere un champ field et le prepare a etre analyse par yylex
**      Input : void
**      Output : void
**************************************************************************************************/
void filtrefields(void)
{
 int c;
 int i=0;
 int j=0;
 int k=0;
 int l=0;
 int FLAG_Moulinne_Eq=0;
 int FFlongeur=5000;
 char FFcalutemp;
 char * FFtableau;
 char * FFtableautemp;
 char * MCField;
 FFtableau=(char *) malloc (FFlongeur);
 fclose(auxiliaire);
 if ((auxiliaire=fopen(nomsort,"r"))==NULL)
   {
     fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort);
     fclose(entree);
     fclose(sortie);
     exit(0);
   }
 rewind(auxiliaire);
 c=fgetc(auxiliaire);
 while(c!=EOF)
   {
     if (i==FFlongeur)
       {
         FFlongeur*=2;
         FFtableau=(char * ) realloc (FFtableau, FFlongeur + 1);
       }
     if (c!='\n')     /* On supprime les retours a la ligne a l'interieur des fields */
       FFtableau[i++]=c;
     c=fgetc(auxiliaire);
   }
 FFtableau[i-1]='\0';    /* i-1 car le dernier caractere est une accolade fermante qui sera reprise
                            dans le fichier d'entree standard... (bidouille du a la procedure
                            Avance_Sauve_Champ */
 fclose(auxiliaire);
 if ((auxiliaire=fopen(nomsort,"w"))==NULL)
   {
     fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort);
     exit(0);
     fclose(entree);
     fclose(sortie);
   }
 /* On a recupere le fiels dans le sale format de RTF. On essaye de le purifier.*/
 /* Recuperation du mot de commande */
 /* On saute tous les espaces */
 i=0;
 while( i< strlen(FFtableau) && FFtableau[i]==' ')
   i++;
 j=i;
 FFtableautemp=(char *) malloc (strlen(FFtableau));
 /* Si le premier caractere n'est pas '{' on recupere le mot directement */
 if ( FFtableau[i]!='{' )
   {
     while( i< strlen(FFtableau) && (FFtableau[i]=='=' || ( FFtableau[i]>='a' && FFtableau[i]<='z' )
                                     || ( FFtableau[i]>='A' && FFtableau[i]<='Z' ) ) )
       i++;
     if (i==j)
       {
         /* Il s'est produit une erreur: On n'a pas trouve de mot de commande
         fprintf(stderr,"ERREUR dans filtrefields : %s \n",FFtableau );*/
         yyerror("Fields Error");
       }
     MCField=(char *) malloc (25+i+1);
     strncpy(MCField,&FFtableau[j],i-j);
     MCField[i-j]='\0';
     strcpy(FFtableautemp,&FFtableau[i]);
   }
 /* Sinon, on l'extrait du bloc */
 else
   {
     k=1;
     i++;
     while(k!=0)
       {
         if (FFtableau[i]=='{')
           k++;
         if (FFtableau[i]=='}')
           k--;
         i++;
       }
     MCField=(char *) malloc (25+i+1);
     strncpy(MCField,&FFtableau[j],i-j);
     MCField[i-j]='\0';
     strcpy(FFtableautemp,&FFtableau[i]);
     /* Dans MCField on a le bloc contenant le mot de commande du field */
     /* On le recupere et le remplace au bloc entier */
   };
 /* Transformation du mot de commande */
 /* On compare avec la table de mots de commande de fields et on cherche un equivalent
    en pseudo-RTF */
 l=0;
 while(l<NB_MC_Fields && strcmp(MCField,TAB_MC_Fields[l].FieldRTF))
   l++;
 /* Si on n'en a pas trouve un, on positionne AUTREFIELD et on laisse le texte entre commentaires
    TEX ou on le vide */
 if (l==NB_MC_Fields)
   {
     strcpy(MCField,"\\pzpautrefield ");
     strcpy(FFtableau,MCField);
     strcat(FFtableau,"FIELD Inconnu");
   }
 else
   {
     strcpy(MCField,TAB_MC_Fields[l].MyField);
     /* Si c'etait une Equation, on positionne un FLAG qui appelle la moulinette*/
     if ( !strcmp(TAB_MC_Fields[l].FieldRTF,"eq") ) FLAG_Moulinne_Eq=1;
     /* On prepare le tout a etre renvoye dans le fichier auxiliaire */
     strcpy(FFtableau,MCField);
     strcat(FFtableau,FFtableautemp);
   };
 /* On re-ecris le field purifie dans le fichier auxiliaire. */
 fprintf(auxiliaire,"%s",FFtableau);
 free(FFtableau);
 fclose(auxiliaire);
 if ((auxiliaire=fopen(nomsort,"r"))==NULL)
   {
     fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort);
     fclose(entree);
     fclose(sortie);
     exit(0);
   }
 /* Si c'etait une equation, on apelle la moulinette et on resette le FLAG */
 if (FLAG_Moulinne_Eq) moulineFormule();
 FLAG_Moulinne_Eq=0; /* A la limite, ce n'est meme pas la peine... Variable locale. */
}