/**************************************************************************************************
** Function name : moulineFormule
**
** Description : Apres detection d'une formule, on la mouline de facon a rectifier les
absurdites de formatage de RTF-Fields.
** Input : void
** Output : void
**************************************************************************************************/
void moulineFormule(void)
{
int c;
int i=0;
int j=0;
int k=0;
int l=0;
int FLAG_Inblock=0;
int MFlongeur=5000;
char MFcalutemp;
char * MFtableau;
char * MFtableautemp;
char TABFmt[5][128];
/* Esperons qu'il n'y aura pas plus de 5 blocs imbriques avec 128 caracteres de mots de commande... */
MFtableau=(char *) malloc (MFlongeur);
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==MFlongeur)
{
MFlongeur*=2;
MFtableau=(char * ) realloc (MFtableau, MFlongeur + 1);
}
if (c!='\n') /* On supprime les retours a la ligne a l'interieur des formules */
MFtableau[i++]=c;
c=fgetc(auxiliaire);
}
MFtableau[i]='\0';
fclose(auxiliaire);
if ((auxiliaire=fopen(nomsort,"w"))==NULL)
{
fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort);
fclose(entree);
fclose(sortie);
exit(0);
}
/* On a recupere la formule dans le sale format de RTF. On essaye de la purifier.*/
/* Toute formule commence par "eq " */
i=0;
MFtableautemp=(char *) malloc (strlen(MFtableau));
while (i<strlen(MFtableau))
{
if (MFtableau[i]=='{')
FLAG_Inblock++;
else if (MFtableau[i]=='}')
FLAG_Inblock--;
else if (MFtableau[i]=='\\' && MFtableau[i+1]!='\\' && FLAG_Inblock && MFtableau[i+1]!='\'')
{
/* Lire les mots de commande et les enregistrer dans un tableau.
Remarque: On les conserve toujours dans MFtableau */
j=0;
while (MFtableau[i]!=' ' && i<strlen(MFtableau) && MFtableau[i]!='}' &&
MFtableau[i]!=',' && MFtableau[i]!='(' && MFtableau[i]!=')' &&
MFtableau[i]!=';')
TABFmt[FLAG_Inblock][j++]=MFtableau[i++];
TABFmt[FLAG_Inblock][j++]=' '; /* On ajoute un separateur: En mode maths les espaces sont
ignores par TeX :-) */
TABFmt[FLAG_Inblock][j]='\0';
i--;
}
else
if (FLAG_Inblock && (MFtableau[i]==',' || MFtableau[i]==';' || MFtableau[i]==')' || MFtableau[i]=='('))
{
MFcalutemp=MFtableau[i];
strcpy(MFtableautemp,&MFtableau[i+1]);
/* Fermeture du bloc */
MFtableau[i++]='}';
/* Ecriture du caractere special */
MFtableau[i++]=MFcalutemp;
/* Reouverture du bloc avec les caracteristiques precedentes */
MFtableau[i++]='{';
k=0;
while(k<=j)
{
MFtableau[i+k]=TABFmt[FLAG_Inblock][k];
k++;
}
i=strlen(MFtableau);
strcat(&MFtableau[i],MFtableautemp);
i--;
}
else
if (MFtableau[i]=='\\' && MFtableau[i+1]=='\\' && FLAG_Inblock)
{
/* Dans un bloc interne a l'equation, il y a un mot de commande de
type equation. */
/* On sauvegarde la chaine de mots de commande et ce qui suit*/
strcpy(MFtableautemp,&MFtableau[i]);
/* Fermeture du bloc */
MFtableau[i++]='}';
/* Ecriture de la chaine de mots de commande */
l=0;
do
{
MFtableau[i++]=MFtableautemp[l++];
} while (l<strlen(MFtableautemp) && MFtableautemp[l-1]!='(');
/* Reouverture du bloc avec les caracteristiques precedentes */
MFtableau[i++]='{';
k=0;
while(k<=j)
{
MFtableau[i+k]=TABFmt[FLAG_Inblock][k];
k++;
}
i=strlen(MFtableau);
strcat(&MFtableau[i],&MFtableautemp[l]);
i--;
}
i++;
}
/* On re-ecris la formule purifiee dans le fichier auxiliaire. */
fprintf(auxiliaire,"%s \\pzpendeq",MFtableau);
free(MFtableau);
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);
}
}
/**************************************************************************************************
** Function name : moulineFormuleMAC
**
** Description : Apres detection d'une formule MAC, on la mouline de facon a rectifier les
absurdites de formatage de RTF-Fields.
** Input : void
** Output : void
**************************************************************************************************/
void moulineFormuleMAC(void)
{
int c,oldc;
int i=0;
int j=0;
int k=0;
int l=0;
int FLAG_Inblock=0;
int FLAG_WasInBlock=0;
int MFlongeur=5000;
char MFcalutemp;
char * MFtableau;
char * MFtableautemp;
char TABFmt[5][128];
/* Esperons qu'il n'y aura pas plus de 5 blocs imbriques avec 128 caracteres de mots de commande... */
MFtableau=(char *) malloc (MFlongeur);
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);
oldc=c;
while(c!=EOF)
{
if (i==MFlongeur)
{
MFlongeur*=2;
MFtableau=(char * ) realloc (MFtableau, MFlongeur + 1);
}
if (c!='\n' && c!='|' && c!=';' && c!=' ' && c!=',')
/* On supprime les retours a la ligne et les espaces a l'interieur des formules */
MFtableau[i++]=c;
if (c=='|' && oldc=='\\') /* Et on remplace les '|' par des backslashs */
MFtableau[i++]='\\';
if (c==';')
MFtableau[i++]=','; /* On change les ';' en ','. On verra apres ce qui est plus adapte */
if (c==',')
MFtableau[i++]=';'; /* On change les ',' en ';'. On verra apres ce qui est plus adapte */
oldc=c;
c=fgetc(auxiliaire);
}
MFtableau[i]='\0';
fclose(auxiliaire);
if ((auxiliaire=fopen(nomsort,"w"))==NULL)
{
fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort);
fclose(entree);
fclose(sortie);
exit(0);
}
/* On a recupere la formule dans le sale format de RTF. On essaye de la purifier.*/
/* Toute formule commence par "eq " */
i=0;
MFtableautemp=(char *) malloc (strlen(MFtableau));
while (i<strlen(MFtableau))
{
if (MFtableau[i]=='{' && i>0 && MFtableau[i-1]!='\\')
FLAG_Inblock++;
else
if (MFtableau[i]=='}' && i>0 && MFtableau[i-1]!='\\')
{
FLAG_Inblock--;
if (FLAG_Inblock==-1)
{
FLAG_Inblock=0;
FLAG_WasInBlock=1;
};
}
else
if (MFtableau[i]=='\\' && i>0 && i+2<=strlen(MFtableau) &&
MFtableau[i+1]=='\\' && MFtableau[i+2]=='\\')
{
strcpy(&MFtableau[i],&MFtableau[i+1]); /* Le pipe a ete transforme en antislash, donc il y en
a quatre maintenant (un en trop). On le vire. */
}
else
if ( (MFtableau[i]=='\\' && MFtableau[i+1]!='\\') && FLAG_Inblock && MFtableau[i+1]!='\'')
{
/* Lire les mots de commande et les enregistrer dans un tableau.
Remarque: On les conserve toujours dans MFtableau */
j=0;
while (MFtableau[i]!=' ' && i<strlen(MFtableau) && MFtableau[i]!='}' &&
MFtableau[i]!=',' && MFtableau[i]!='(' && MFtableau[i]!=')' &&
MFtableau[i]!=';' && !(MFtableau[i]=='\\' && MFtableau[i+1]=='\\')
&& !(MFtableau[i]=='\\' && MFtableau[i+1]=='\''))
TABFmt[FLAG_Inblock][j++]=MFtableau[i++];
TABFmt[FLAG_Inblock][j++]=' '; /* On ajoute un separateur: On mode maths les espaces sont
ignores par TeX :-) */
TABFmt[FLAG_Inblock][j]='\0';
i--;
}
else
if (FLAG_Inblock && (MFtableau[i]==',' || MFtableau[i]==';' || MFtableau[i]==')' || MFtableau[i]=='('))
{
MFcalutemp=MFtableau[i];
strcpy(MFtableautemp,&MFtableau[i+1]);
/* Fermeture du bloc */
MFtableau[i++]='}';
/* Ecriture du caractere special */
MFtableau[i++]=MFcalutemp;
/* Reouverture du bloc avec les caracteristiques precedentes */
MFtableau[i++]='{';
k=0;
while(k<=j)
{
MFtableau[i+k]=TABFmt[FLAG_Inblock][k];
k++;
}
i=strlen(MFtableau);
strcat(&MFtableau[i],MFtableautemp);
i--;
}
else
if (MFtableau[i]=='\\' && MFtableau[i+1]=='\\' && FLAG_Inblock)
{
/* Dans un bloc interne a l'equation, il y a un mot de commande de
type equation. */
/* On sauvegarde la chaine de mots de commande et ce qui suit*/
strcpy(MFtableautemp,&MFtableau[i]);
/* Fermeture du bloc */
MFtableau[i++]='}';
/* Ecriture de la chaine de mots de commande */
l=0;
do
{
MFtableau[i++]=MFtableautemp[l++];
} while (l<strlen(MFtableautemp) && MFtableautemp[l-1]!='(');
/* Reouverture du bloc avec les caracteristiques precedentes */
MFtableau[i++]='{';
k=0;
while(k<=j)
{
MFtableau[i+k]=TABFmt[FLAG_Inblock][k];
k++;
}
i=strlen(MFtableau);
strcat(&MFtableau[i],&MFtableautemp[l]);
i--;
};
if (FLAG_WasInBlock==1)
{
FLAG_WasInBlock=-1;
strcpy(&MFtableau[i],&MFtableau[i+1]);
}
else i++;
}
/* if (FLAG_WasInBlock==-1 ) { MFtableau[i++]='}'; MFtableau[i]='\0'; }*/
if (FLAG_Inblock && FLAG_WasInBlock==0)
{
MFtableau[i++]='}';
MFtableau[i]='\0';
/* On re-ecris la formule purifiee dans le fichier auxiliaire. */
fprintf(auxiliaire,"%s \\pzpendeq {%s",MFtableau,TABFmt[FLAG_Inblock]);
}
else
{
/* On re-ecris la formule purifiee dans le fichier auxiliaire. */
if (FLAG_WasInBlock==-1)
{
fprintf(auxiliaire,"%s \\pzpendeq }",MFtableau);
}
else
{
fprintf(auxiliaire,"%s \\pzpendeq",MFtableau);
}
}
free(MFtableau);
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);
}
}