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 */
"â", /*â */
"ä", /*ä */
"à", /*à */
"ç", /*ç */
"é", /*é */
"ê", /*ê */
"ë", /*ë */
"è", /*è */
"î", /*î */
"ï", /*ï */
"ô", /*ô */
"ö", /*ö */
"2", /*<sup>2</sup> */
"û", /*û */
"ü", /*ü */
"ù", /*ù */
"\n","<",">","&" };
/* pour DOS->HTML : {"â","ä","à","ç","é","ê","ë","è","î","ï","ô","ö","2","û","ü","ù","&","<",">"}; */
int NB=16; /*nb de chaines dans e (et aussi dans s) (sans compter &,< et > et \n)*/
chaine s[]={
"â",
"ä",
"à",
"ç",
"é",
"ê",
"ë",
"è",
"î",
"ï",
"ô",
"ö",
"<sup>2</sup>",
"û",
"ü",
"ù",
"<BR>","<",">","&" };
/* 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