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