diff options
Diffstat (limited to 'support/w2latex/rtf.lex.c')
-rw-r--r-- | support/w2latex/rtf.lex.c | 744 |
1 files changed, 744 insertions, 0 deletions
diff --git a/support/w2latex/rtf.lex.c b/support/w2latex/rtf.lex.c new file mode 100644 index 0000000000..89949770b9 --- /dev/null +++ b/support/w2latex/rtf.lex.c @@ -0,0 +1,744 @@ +#define MAX(a,b) ( a>b ? a : b ) +char *tampon; +int length=512; +char * nomsort; +int motfini=0; +#include <stdio.h> +#include <stdlib.h> +/* Declarations*/ +int yyerror(char * ); + +#include "rtf.formule.c" +#include "rtf.fields.c" +#include "rtf.motcom.h" +/************************************************************************************************** +** Function name : valdefFD +** -------- +** Description : Attribue les valeurs par defaut aux differents champs de formatage du document +** Input : void +** Output : void +**************************************************************************************************/ +void valdefFD(void) +{ + PZ_FD.FDDEFTAB=(720/20); + PZ_FD.FDPAPERW=(12240/20); + PZ_FD.FDPAPERH=(15840/20); + PZ_FD.FDPSZ=0; + PZ_FD.FDMARGL=(1800/20); + PZ_FD.FDMARGR=(1800/20); + PZ_FD.FDMARGT=(1440/20); + PZ_FD.FDMARGB=(1440/20); + PZ_FD.FDFACINGP=0; + PZ_FD.FDGUTTER=0; + PZ_FD.FDMARGMIRROR=0; + PZ_FD.FDLANDSCAPE=0; + PZ_FD.FDPGNSTART=1; + PZ_FD.FDWIDOWCTRL=0; +} + + + +/************************************************************************************************** +** Function name : puretext +** -------- +** Description : Lorsque l'on trouve une chaine de caracteres pure, il faut enlever les + retours a la ligne. En effet WORD coupe les lignes trop longues en plein milieu des mots !! + De meme, il y a des caracteres ASCII 7 bits que TeX considere des mots de commande. Il faut les + transformer dans son propre format. Ceci ne peut etre fait a l'interieur de la grammaire, car + le texte 7 bits est un token a part entiere. +** Input : char * impuretamp: tampon avant d'avoir ete TeXifie. +** Output : char * impuretamp: le meme. +***************************************************************************************************/ +char* puretext(char * impuretamp) +{ + int i,j,k; + int longtemp=2*length; + char * tamptemp; + tamptemp=(char * ) malloc (longtemp +15); + i=0; + while(i<strlen(impuretamp)) + { + if (i==longtemp) + { + longtemp*=2; + tamptemp=(char * ) realloc (longtemp +15); + } + if (impuretamp[i]=='\n') + { + strcpy(&impuretamp[i],&impuretamp[i+1]); + } + else + { + if (impuretamp[i]=='$' || impuretamp[i]=='#' || + impuretamp[i]=='%' || impuretamp[i]=='&' || + impuretamp[i]=='_' ) + { + if ((strlen(impuretamp)+5)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=5; + } + strcpy(&tamptemp[i+1],&impuretamp[i]); + tamptemp[i]='\\'; + strcpy(&impuretamp[i],&tamptemp[i]); + i++; + } + + else + { + if ((impuretamp[i]=='\\' && impuretamp[i+1]=='{') || (impuretamp[i]=='\\' && impuretamp[i+1]=='}')) + { + /* C'est parfait, on ne fait rien */ + } + else + { + if (impuretamp[i]=='\\' && impuretamp[i+1]=='\\') + { + if ((strlen(impuretamp)+15)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=15; + } + strcpy(&tamptemp[i],"$\\backslash$"); + strcpy(&tamptemp[i+strlen("$\\backslash$")],&impuretamp[i+2]); + strcpy(&impuretamp[i],&tamptemp[i]); + i+=strlen("$\\backslash$"); + } + + else + { + if (impuretamp[i]=='~') + { + if ((strlen(impuretamp)+5)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=5; + } + strcpy(&tamptemp[i],"\\~{}"); + strcpy(&tamptemp[i+strlen("\\~{}")],&impuretamp[i+1]); + strcpy(&impuretamp[i],&tamptemp[i]); + i+=strlen("\\~{}"); + } + if (impuretamp[i]=='^') + { + if ((strlen(impuretamp)+5)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=5; + } + strcpy(&tamptemp[i],"\\^{}"); + strcpy(&tamptemp[i+strlen("\\^{}")],&impuretamp[i+1]); + strcpy(&impuretamp[i],&tamptemp[i]); + i+=strlen("\\^{}"); + } + if (impuretamp[i]==' ' && FLAG_Equation) + { + if ((strlen(impuretamp)+5)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=5; + } + strcpy(&tamptemp[i],"\\, "); + strcpy(&tamptemp[i+strlen("\\, ")],&impuretamp[i+1]); + strcpy(&impuretamp[i],&tamptemp[i]); + i+=strlen("\\, "); + } + if (strlen(impuretamp)>=i+5 && !strncmp(&impuretamp[i],"LaTeX",5)) + { + if ((strlen(impuretamp)+5)>=length) + { + impuretamp=(char * ) realloc (impuretamp, length + 5); + length+=5; + } + if(impuretamp[i+5]=='.' || impuretamp[i+5]==',' || impuretamp[i+5]==';' + || impuretamp[i+5]==':' || impuretamp[i+5]=='!' || impuretamp[i+5]=='?' + || impuretamp[i+5]==')' || impuretamp[i+5]==']') + strcpy(tamptemp,"\\LaTeX "); + else + strcpy(tamptemp,"\\LaTeX\\ "); + strcat(tamptemp,&impuretamp[i+5]); + strcpy(&impuretamp[i],tamptemp); + i++; + } + } + } + } + }; + i++; + } + + return impuretamp; +} + + +/************************************************************************************************** +** Function name : getcode +** ------- +** Description : A partir de la chaine de caracteres d'un mot de commande renvoie son type et + leve un flag en cas de non reconnaissance. +** Input : char *Mot_Comm, int * flag +** Output : int: le type de token terminal correspondant. +***************************************************************************************************/ +int getcode(char *Mot_Comm, int * flag) +{ + int i; + for (i=0;i<NB_Mots_Comm;i++) + if (strncmp(Mot_Comm,TaB_Mot_Comm[i].MC,MAX(strlen(Mot_Comm),strlen(TaB_Mot_Comm[i].MC)))==0) + { + /* ON A TROUVE UN MOT DE COMMANDE */ + yylval.motcomm=TaB_Mot_Comm[i].MC; + (*flag)=1; + return TaB_Mot_Comm[i].TK; + }; + /* Aucun mot de commande n'a pu etre trouve. */ + /*fprintf(stderr,"Unknown Command Word: \t%s\n",Mot_Comm);*/ + (*flag)=-1; + return -1; +} + +/************************************************************************************************** +** Function name : Avance_Champ +** ------------ +** Description : Avance tant que le champ a ignorer n'est pas termine +** Input : void +** Output : void +***************************************************************************************************/ +void Avance_Champ(void) +{ + char c; + int compteur=1; + do + { + c=fgetc(entree); + if (c=='{') compteur++; + if (c=='}') compteur--; + } while (compteur!=0); + ungetc(c,entree); +} + +/************************************************************************************************** +** Function name : Avance_Sauve_Champ +** ------------ +** Description : Avance tant que le champ a ignorer n'est pas termine +** Input : void +** Output : void +***************************************************************************************************/ +void Avance_Sauve_Champ(void) +{ + char c; + int compteur=1; + fclose(auxiliaire); + /* ATTENTION, A partir d'ici, les informations contenues dans le fichier + auxiliaire seront perdues !!!! ( A consommer avec moderation) */ + if ((auxiliaire=fopen(nomsort,"w"))==NULL) + { + fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File:%s\n",nomsort); + fclose(entree); + fclose(sortie); + exit(0); + } + do + { + c=fgetc(entree); + if (c=='{') compteur++; + if (c=='}') compteur--; + fprintf(auxiliaire,"%c",c); + } while (compteur!=0); + ungetc(c,entree); +} +/************************************************************************************************** +** Function name : Avance_Sauve_ChampMAC +** ------------ +** Description : Avance tant que le champ a ignorer n'est pas termine +** Input : void +** Output : void +***************************************************************************************************/ +void Avance_Sauve_ChampMAC(void) +{ + char c,c2; + int compteur=0; + int djl=0; + int motEq=0; + fclose(auxiliaire); + /* ATTENTION, A partir d'ici, les informations contenues dans le fichier + auxiliaire seront perdues !!!! ( A consommer avec moderation) */ + 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 teste le premier (que ce ne soit pas une accolade }) */ + c=fgetc(entree); + fprintf(auxiliaire,"\\pzpeq \\\\"); + if (c=='}' && (c2=fgetc(entree))=='{') + { + /* On est dans la situation suivante: \|}{\i\f20 o(.... */ + /* L'ideal serait de garder les mdc \i et \f20. Mais pour + l'instant on les ignore... */ + do + { + c=fgetc(entree); + if (c=='\\') + { + c=fgetc(entree); + if (c=='|') + { + motEq=1; + ungetc('\\',entree); + ungetc(c,entree); + } + } + } + while (c!=' ' && c!='(' && c!=')' && c!=',' && c!=';' && !motEq); + } + else + { + + fprintf(auxiliaire,"%c",c); + if (c!='{') c2=fgetc(entree); + fprintf(auxiliaire,"%c",c2); + if (c=='(') { compteur++; djl=1; } + if (c==')') compteur--; + if (c2=='(') { compteur++; djl=1; } + if (c2==')') compteur--; + }; + do + { + c=fgetc(entree); + if (c=='(') { compteur++; djl=1; } + if (c==')') compteur--; + fprintf(auxiliaire,"%c",c); + } while (compteur!=0 || !djl); + fflush(auxiliaire); +} + + + +/************************************************************************************************** +** Function name : yylex +** ----- +** Description : Analyseur Lexical d'un fichier RTF. Fournit les Tokens a yyparse. +** Input : void +** Output : Token (non specifie: YACC ou BISON le castent) +***************************************************************************************************/ +yylex() +{ + int i,j,k; + int c; + int flag=0; + int temp; + char cont_inue; + char ctemp; + tampon[0]='\0'; + c=fgetc(entree); + if (FLAG_ERROR) + { + if (FLAG_ERROR==1) + { + do + { + i=0; + while (c!='\\' && c!=EOF) + c=fgetc(entree); + if (c==EOF) + return 0; + c=fgetc(entree); + while (c!=' ' && (c>='a' && c<='z')) + { + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } + } while (getcode(tampon,&flag)!=PAR); + FLAG_ERROR++; + fprintf(sortie,"\n\n{\\bf W2\\LaTeX : ERROR}\n\n"); + return PZERROR; + + } + if (FLAG_ERROR==2) + { + FLAG_ERROR=0; + return PAR; + } + + } + if (FLAG_Equation!=0 && FLAG_Equation!=-1 && + (c==' ' || c==0x09 || c=='(' || c==')' || c==',')) + { + /* Traitement du texte de l'equation */ + yylval.calu=c; + motfini=1; + return c; + } + /* On traite les caracteres de controle. */ + if (c == EOF) + { + if (entree==auxiliaire) + { + entree=filetemp; + return yylex(); + } + else return 0; + } + if (c == '\n') return (yylex()); /* POUR L'INSTANT ON IGNORERA LES RETOURS A LA LIGNE */ + if (c=='{' || c=='}' || c==';') + { + /* yylval.calu=c; */ + motfini=1; + return c; + } + /* Traitement des mots de commande */ + /* Il faudra verifier la syntaxe pour les caracteres de commande + On supposera que les mots de commande n'excedent pas 128 octets, ce qui est le cas. */ + if ( c==0x5c /* Caractere '\' */ ) + { + i=0; + c=fgetc(entree); + if (c==0x27) /* Ascii : ' ; Caractere special On ne passe que la valeur hexa. */ + { + tampon[i++]=c; + tampon[i]='\0'; + temp=getcode(tampon,&flag); + if (flag!=-1) /* Une ceinture et des bretelles ... */ + { tampon[0]=fgetc(entree); + tampon[1]=fgetc(entree); + tampon[2]='\0'; + yylval.motcomm=tampon; + return (temp); + } + return(yyerror("Unknown Special Char\n")); + } + if ((FLAG_Equation==0 && (c=='\\')) || (c=='{' || c=='}')) + { + /* Il s'agit d'un caractere reserve et on le traitera comme tel. */ + tampon[i++]='\\'; + tampon[i++]=c; + tampon[i]='\0'; + strcpy(tampon,puretext(tampon)); + yylval.pcdata=tampon; + motfini=1; + return PCDATA; + } + if (FLAG_Equation!=0 && c==0x5c) + { + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } + if (FLAG_Equation==0) + { + while (c!=' ' && (c>='a' && c<='z')) + { + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } + } + else + { + cpt2=0; + while (c!=' ' && ( (c>='a' && c<='z')||(c>='A' && c<='Z') ) ) + { + tampon[i++]=c; + tampon[i]='\0'; + cpt2++; + c=fgetc(entree); + } + if (cpt2==0) /* On n'a pas identifie le mot de commande correctement */ + { + if(c=='|' || c=='{' || c=='}' || c=='(' || c==')' || c=='[' || c==']' ) + { + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } + } + }; + if (c != EOF && c!=' ' && c!='\n') /* On supprime les espaces utilises comme delimiteurs. */ + { + motfini=0; + ungetc (c,entree); + } + else + { + motfini=1; + } + tampon[i]='\0'; + temp=getcode(tampon,&flag); + if (temp == INFO || temp == OBJECT || temp == DO || temp == XE || temp == TC ) /* ON IGNORE CERTAINS CHAMPS */ + { + Avance_Champ(); + return temp; /* ON RETOURNE QUAND MEME LE CHAMP CLE POUR LE CONFORT DE LA GRAMMAIRE */ + } + if (temp == PIPE ) + { + Avance_Sauve_ChampMAC(); + moulineFormuleMAC(); + entree==auxiliaire; /* LE reste sera lu dans le fichier auxiliaire */ + entree=auxiliaire; /* LE reste sera lu dans le fichier auxiliaire */ + return temp; /* ON RETOURNE QUAND MEME LE CHAMP CLE POUR LE CONFORT DE LA GRAMMAIRE */ + } + if (temp == FLDINST) + { + Avance_Sauve_Champ(); + filtrefields(); + entree=auxiliaire; /* LE reste sera lu dans le fichier auxiliaire */ + return temp; /* ON RETOURNE QUAND MEME LE CHAMP CLE POUR LE CONFORT DE LA GRAMMAIRE */ + } + if (flag!=-1) + return (temp); + else + { + if ((strlen(tampon))==0) + { + /* Si ca se toruve c'est un caractere de commande... */ + tampon[0]=fgetc(entree); + tampon[1]='\0'; + temp=getcode(tampon,&flag); + if (temp == PIPE ) + { + Avance_Sauve_ChampMAC(); + moulineFormuleMAC(); + entree==auxiliaire; /* LE reste sera lu dans le fichier auxiliaire */ + entree=auxiliaire; /* LE reste sera lu dans le fichier auxiliaire */ + return temp; /* ON RETOURNE QUAND MEME LE CHAMP CLE POUR LE CONFORT DE LA GRAMMAIRE */ + } + if (flag!=-1) + return (temp); + /* Non... Il s'agit definitivement d'un code inconnu... */ + ungetc(tampon[0],entree); + } + /* Le mot de commande est inconnu */ + fprintf(stderr,"\t\t Unknown Command Word: *** %s *** (Skipping)\n",tampon); + c=fgetc(entree); /* On lis le caractere suivant */ + if (c==' ') + { + motfini=1; + return (yylex()); + } + if (c>='0' && c<='9') + { + ungetc(c,entree); + fscanf(entree,"%d",&yylval.numo); + fprintf(stderr,"\t\tParameter is being Ignored: %d\n",yylval.numo); + c=fgetc(entree); + if (c != ' ') ungetc(c,entree); + motfini=1; + return (yylex()); + } + ungetc(c,entree); + return (yylex()); + } + } + /* Traitement des valeurs numeriques associees aux mots de commande */ + if ( ( (c>='0' && c<='9') || (c=='-') ) && motfini==0 ) + { + ungetc (c,entree); + fscanf(entree,"%d",&yylval.numo); + c=fgetc(entree); + if (c != ' ') ungetc(c,entree); + motfini=1; + return NUM; + } + /* Si ce n'est ni un mot de commande, ni un entier, ni un caractere de controle simple, c'est du + texte. */ + { + i=0; + cont_inue=1; + while (cont_inue) + { + if (FLAG_Equation==0 && !FLAG_InPict) + { + do + { + /* Si le tampon est plein, il faut l'agrandir */ + if (i==length) + { + length*=2; + tampon=(char * ) realloc (tampon, length + 1); + } + if(c==' ' && i==0) + tampon[i++]='\\'; + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } while (c != EOF && c!='}' && c!='{' && c!=0x5c && c!=';'); /* ATTENTION: IL FAUDRA TRAITER LE ; + DE FACON IDEPENDANTE !!!!!!!!!!!! */ + cont_inue=0; + if (c==0x5c) ctemp=fgetc(entree); + if (c==0x5c && (ctemp==0x5c || ctemp=='{' || ctemp=='}') ) + { + cont_inue=1; + tampon[i++]=c; + tampon[i]='\0'; + c=ctemp; + } + } + else + if (!FLAG_InPict) + do + { + cont_inue=0; + /* Si le tampon est plein, il faut l'agrandir */ + if (i==length) + { + length*=2; + tampon=(char * ) realloc (tampon, length + 1); + } + if(c==' ' && i==0) + tampon[i++]='\\'; + tampon[i++]=c; + tampon[i]='\0'; + c=fgetc(entree); + } while (c != EOF && c!='}' && c!='{' && c!='\\' && c!=',' && c!='(' + && c!=')'); /* ATTENTION: IL FAUDRA TRAITER LE ; + DE FACON IDEPENDANTE !!!!*/ + if (FLAG_InPict) + { + while (c != EOF && c!='}' && c!='{' && c!=0x5c && c!=';') + c=fgetc(entree); + if (c!=EOF) + ungetc(c,entree); + cont_inue=0; + } + + } + if (FLAG_InPict) { yylval.pcdata="IMAGE"; return PCDATA; } + if (FLAG_Equation==0 && c==0x5c) ungetc(ctemp,entree); + if (c!=EOF) + ungetc(c,entree); + tampon[i]='\0'; + if (FLAG_Symbol==0) strcpy(tampon,puretext(tampon)); + /*else + { + strcpy(tampon,Rec_Formule(tampon)); + }*/ + yylval.pcdata=tampon; + motfini=1; + return PCDATA; + } +} + + +/************************************************************************************************** +** Function name : yyerror +** +** Description : +** Input : char * syyerr +** Output : rapelle yyparse en levant les flags d'Erreur. +**************************************************************************************************/ +int yyerror(char * syyerr) +{ + if (!FLAG_DebutTeX) + { + fprintf(SORT,"%%\n%% This document was generated using\n%% "); + fprintf(SORT,"w2LaTeX\n%% Bug Reports: jgarmend@cyberspace.org\n%%\n\n"); + fprintf(SORT,"\\documentstyle[a4]{article}\n"); + fprintf(SORT,"%% THIS FILE CONTAINS ERRORS! THE ORIGINAL RTF FILE\n"); + fprintf(SORT,"%% HAD A CORRUPTED HEADER\n"); + fprintf(SORT,"\n\\parindent = %d pt \n",0/*(PZ_FD.FDDEFTAB)*/); + fprintf(SORT,"\n\\oddsidemargin0cm\n"); + fprintf(SORT,"\n\\evensidemargin0cm\n"); + fprintf(SORT,"\n\\hoffset%dpt \n",(int)(-72+(PZ_FD.FDMARGL))); + fprintf(SORT,"\n\\textwidth%dpt \n",(int)(614-(PZ_FD.FDMARGL)-(PZ_FD.FDMARGR))); + fprintf(SORT,"\n\\vsize=%dpt\n",(int)(644-(PZ_FD.FDMARGT))); + fprintf(SORT,"\n\\font\\mathex=cmex10\n"); + fprintf(SORT,"\n\\font\\pzrm=cmr10\n"); + fprintf(SORT,"\n\\pagestyle{myheadings}\n"); + fprintf(SORT,"\n\\begin{document}\n"); + } + FLAG_DebutTeX=1; + fprintf(stderr, "w2LaTeX: %s: trying to recover....\n",syyerr); + if (FLAG_FIRST_ERROR) + fprintf(stderr, "w2LaTeX: OUTPUT FILE WILL NOT BE CLEAN !\n"); + FLAG_ERROR=1; + FLAG_FIRST_ERROR=0; + yyparse(); +} + + + + +/************************************************************************************************** +** Function name : main +** ---- +** Description : Fonction Principale +** Input : void +** Output : void +***************************************************************************************************/ +void main(int argc, char * argv[]) +{ + char pzexit[1024]; + char keepnomsort[512]; + int pzi=0; + fprintf(stderr,"This is w2LaTeX version 0.1 (Fri Jul 22 1994) by Javier Garmendia,\n"); + fprintf(stderr,"Centre International de Rencontres Mathematiques. Luminy. Marseille,\n"); + + FLAG_DebutTeX=1; + tampon=(char * ) malloc(length+1); + Ligne_Courante_Tabular=(char *) malloc(lengthLCT+1); + valdefFD(); + if (argc<=1) + { + fprintf(stderr,"Usage: w2LaTeX filename.rtf\n"); + exit(0); + } + if (argc>2) + { + for(pzi=2;pzi<argc;pzi++) + { + if (!strcmp(argv[pzi],"-uglyframes")) + { + pzIntermDef=pzIntermFrame; + pzEndDef=pzEndFrame; + pzStartDef=pzStartFrame; + } + if (!strcmp(argv[pzi],"-debug")) + { + yydebug=1; + } + } + } + if ((entree=fopen(argv[1],"r"))==NULL) + { + fprintf(stderr,"FATAL ERROR: Could not open Specified File::%s\n",argv[1]); + exit(0); + } + nomsort=(char *)malloc(strlen(argv[1])+15); + strcpy(nomsort,argv[1]); + if (!strcmp(&nomsort[strlen(nomsort)-4],".rtf")) + nomsort[strlen(nomsort)-4]='\0'; + strcat(nomsort,".tex"); + strcpy(keepnomsort,nomsort); + if ((sortie=fopen(nomsort,"w"))==NULL) + { + fprintf(stderr,"FATAL ERROR: Could not open Output File::%s\n",nomsort); + fclose(entree); + exit(0); + } + strcpy(nomsort,argv[1]); + strcat(nomsort,".auxtex"); + if ((auxiliaire=fopen(nomsort,"w+"))==NULL) + { + fprintf(stderr,"FATAL ERROR: Could not open Auxiliary File::%s\n",nomsort); + fclose(entree); + fclose(sortie); + exit(0); + } + SORT=sortie; + filetemp=entree; + FLAG_DebutTeX=0; + yyparse(); + if (!FLAG_EndTeX) + fprintf(SORT,"\n\\end{document}\n"); + fclose(entree); + fclose(sortie); + fclose(auxiliaire); + strcpy(pzexit,"rm -f "); + strcat(pzexit,nomsort); + system(pzexit); + fprintf(stderr,"Output written on %s\nThanks for using w2LaTeX\n",keepnomsort); +} + |