source C de PC2HTML

vous trouverez ci-dessous le code source (en C) d'un programme transformant un texte ASCII accentué (en code 8 bits Windows ou ISO LATIN) en codes 7 bits HTML. vous pouvez récupérer le source ASCII ou un .exe compilé pour MSDos.


/* 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; */
"2",	/*<sup>2</sup> */
"û",	/*&ucirc; */
"ü",	/*&uuml; */
"ù",	/*&ugrave; */
"\n","<",">","&"   };
/* pour DOS->HTML : {"â","ä","à","ç","é","ê","ë","è","î","ï","ô","ö","2","û","ü","ù","&","<",">"}; */

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

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



page écrite parP. Trau le 6/2/97