diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/w2latex/rtf.formule.c |
Initial commit
Diffstat (limited to 'support/w2latex/rtf.formule.c')
-rw-r--r-- | support/w2latex/rtf.formule.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/support/w2latex/rtf.formule.c b/support/w2latex/rtf.formule.c new file mode 100644 index 0000000000..923aa63386 --- /dev/null +++ b/support/w2latex/rtf.formule.c @@ -0,0 +1,333 @@ +/************************************************************************************************** +** 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); + } +} + |