/* programme de "traitement" de fichier texte : remplacement de chanes */
/* P. TRAU, Universit Louis Pasteur Strasbourg,*/

#include <string.h>
#include <stdio.h>

/* version PC (txt windows) -> HTML */
char *titre="PC -> HTML (&, <, > et return optionnels)";

typedef char *chaine;
chaine e[]={
/* l'ordre a une importance !!! en dernier ceux qui peuvent tre un rsultat des autres */
"â",	/*&acirc; */
"ä",	/*&auml; */
"à",	/*&agrave; */
"ç",	/*&ccedil; */
"é",	/*&eacute; */
"ê",	/*&ecirc; */
"ë",	/*&euml; */
"è",	/*&egrave; */
"î",	/*&icirc; */
"ï",	/*&iuml; */
"ô",	/*&ocirc; */
"ö",	/*&ouml; */
"²",	/*<sup>2</sup> */
"û",	/*&ucirc; */
"ü",	/*&uuml; */
"ù",	/*&ugrave; */
"\n","<",">","&"   };
/* pour DOS->HTML : {"","","","","","","","","","","","","ý","","","","&","<",">"}; */

int NB=16; /*nb de chaines dans e (et aussi dans s) (sans compter &,< et > et \n)*/

chaine s[]={
	"&acirc;",
	"&auml;",
	"&agrave;",
	"&ccedil;",
	"&eacute;",
	"&ecirc;",
	"&euml;",
	"&egrave;",
	"&icirc;",
	"&iuml;",
	"&ocirc;",
	"&ouml;",
	"<sup>2</sup>",
	"&ucirc;",
	"&uuml;",
	"&ugrave;",
	"<BR>","&lt;","&gt;","&amp;"    };

/* newline	<br> */
/* paragraph	<P> */

//pour une transfo Pascal -> C ****************************************
//chaine e[]={"(*","*)","{", "}", "begin","end","<>",":=","'" ,
//            "readln","writeln","case","false","true","procedure"    };
//chaine s[]={"/*","*/","/*","*/","{",    "}"  ,"!=","=" ,"\"",
//            "scanf" ,"printf" ,"switch","0"  ,"1"   ,"void"         };
//#define NB 15 *******************************************************

int debut_egal(char *ch,char *sch)
/* rpond si sch est exactement le dbut de ch */
/* utilis par la fonction "recherche" */
 {
  while (*sch && *ch)
	 {
	  if (*sch!=*ch) return(0); else {ch++;sch++;}
   }
  return(!(*sch));
 }

char *recherche(char *ch,char *sch)
/* rend la premire position de sch dans ch, NULL si pas trouv */
 {
  while (*ch)
   {
    if (debut_egal(ch,sch)) return(ch);
    ch++;
   }
  return(NULL);
 }

void enleve(char*deb,int nb)
/* enleve les nb premiers caractres d'une chaine */
{
 do *deb=*(deb+nb); while(*(deb++));
}

char * insere(char * ch, char * sch)
/* insre sch au dbut de ch, rend la nouvelle position de l'ancien contenu de ch */
{
 int i;
 char buf[10000];
 for(i=0;ch[i];i++)buf[i]=ch[i];
 buf[i]=0;
 for(i=0;sch[i];i++)ch[i]=sch[i];
 sch=ch+i; /*sch utilis pour stocker le nouveau dbut du texte de ch */
 for(i=0;buf[i];i++)sch[i]=buf[i];
 sch[i]=0;
 return(sch);
}

void traite(char *buf)
{
 char *deb;
 int i;
 for(i=NB-1;i>=0;i--) /* pour chaque mot  trouver */
  {
   deb=buf;
   do        /* rechercher Toutes les occurences dals la ligne */
    {
     deb=recherche(deb,e[i]);
     if(deb)  /* si trouv */
      {
       /* supprimer le mot */
       enleve(deb,strlen(e[i]));
       /* remettre l'autre mot et placer deb en fin du nouveau mot */
       deb=insere(deb,s[i]);
      }
    }
   while(deb);
  }
}

void main(void)
{
 FILE *E,*S;
 char ne[40];
 char ns[40];
 char oui;
 char buf[10000];

 /* ouvre fichiers */
 printf("ce programme convertit des fichiers : %s\n",titre);
 printf("fichier source ? ");
 gets(ne);
 printf("ficher rsultat ? ");
 gets(ns);
 printf("changer aussi les &,<,> et return ? (N/o) ?");
 oui=getche();puts(" ");
 if(oui=='o'||oui=='O')NB+=4;
 E = fopen(ne, "rt"); /* lecture seule, texte */
 S = fopen(ns, "wt+");/* criture, mise  jour, texte */
 while(fgets(buf,sizeof(buf),E)) /* rpond NULL si erreur ou fin de fic */
                    /* le \n est galement dans la buf, suivi d'un \0 */
  {
   traite(buf);
   fprintf(S,"%s\n",buf);
  }
 fclose(E);
 fclose(S);
}


