summaryrefslogtreecommitdiff
path: root/support/w2latex/rtf.fields.c
blob: 3f6eb2c40b25ed87a386baa24f63126a68ca3917 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#define NB_MC_Fields 1
typedef struct _E_Q_FIELDS_ { char * FieldRTF; char * MyField; } EQField;
EQField TAB_MC_Fields[NB_MC_Fields]=
{ { "eq", "\\pzpeq" }
};

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