/**************************************************************************************************
** 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. */
}