/*----------------------------------------------------------------------------- | | | tex8to7 | | | ------------------------------------------------------------------------------- | | | Auteur: Mael Hill�reau | | M�l : mael.hillereau@free.fr | | Web : http://mael.hillereau.free.fr | | Cr�ation : 01/11/2001 | | Derni�re modif.: 21/08/2003 | | Version: 1.1c | | Description: Conversion de fichiers sources LaTeX : remplacement des | | caract�res accentu�s fran�ais par leurs �quivalents LaTeX | | dans l'encodage 7bits am�ricain. | | Cr�ation d'un nouveau fichier ayant le m�me nom que le | | fichier de d�part augment� d'un "7". | | | ------------------------------------------------------------------------------- | | | tex8to7 -- Conversion de fichiers sources LaTeX. | | Copyright (C) 2001 Mael Hill�reau | | | | This program is free software; you can redistribute it and/or | | modify it under the terms of the GNU General Public License | | as published by the Free Software Foundation; either version 2 | | of the License, or (at your option) any later version. | | | | This program is distributed in the hope that it will be useful, | | but WITHOUT ANY WARRANTY; without even the implied warranty of | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | GNU General Public License for more details. | | | | You should have received a copy of the GNU General Public License | | along with this program; if not, write to the Free Software | | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | | | -----------------------------------------------------------------------------*/ #define _VERSION_ "1.1c" #define _DATE_ "21/08/2003" /*---------- | inclusions --*/ #include <stdlib.h> #include <stdio.h> #include <string.h> /*---------- | d�finitions --*/ #define SEP(buf) ((buf == ' ') || (buf == '\t') || (buf == '\n') || (buf == '\r')) #define TAILLE_MAX_PILE 100 /*---------- | variables globales --*/ char *pile; int nbChar; /*---------- | affichage des messages d'aide --*/ void aideRapide() { fprintf(stdout,"\nUTILISATION\n\n"); fprintf(stdout," tex8to7 [option] <fichier.tex>\n\n"); fprintf(stdout," tapez \"tex8to7 -?\" pour une aide compl�te.\n\n"); } void aideComplete() { fprintf(stdout,"\nNOM\n\n"); fprintf(stdout," tex8to7 -- Conversion de fichiers sources LaTeX.\n\n"); fprintf(stdout,"\nSYNOPSIS\n\n"); fprintf(stdout," tex8to7 [option] <fichier.tex>\n\n"); fprintf(stdout,"\nDESCRIPTION\n\n"); fprintf(stdout," Remplace les caract�res accentu�s par leurs �quivalents LaTeX dans\n"); fprintf(stdout," l'encodage 7bits am�ricain. Le r�sultat est plac� dans un fichier ayant\n"); fprintf(stdout," pour nom <fichier.tex7>.\n\n"); fprintf(stdout,"\nOPTIONS\n\n"); fprintf(stdout," -?, -h ou --help\n"); fprintf(stdout," Affiche cette aide.\n\n"); fprintf(stdout," -v ou --version\n"); fprintf(stdout," Affiche la version.\n\n"); } void version() { fprintf(stdout,"tex8to7 version %s, %s - Conversion de fichiers sources LaTeX.\nCopyright (C) 2003 Mael Hill�reau\n",_VERSION_,_DATE_); } /*---------- | �criture d'une chaine de caract�res dans le fichier "fich" --*/ void ecrire(char *buf, FILE *fich, int len) { if( !fwrite(buf, sizeof(char), len, fich) ) { printf("Erreur d'�criture !"); exit(2); } } /*---------- | fermeture du fichier "fich" --*/ void fermer(FILE *fich, char *nom) { if( fclose(fich) ) { printf("Erreur lors de la fermeture du fichier %s.\n", nom); exit(3); } } /*---------- | �limination d'une fin de ligne --*/ void avalerligne(FILE *fich_e, FILE *fich_s, char *pbuf) { while(fread(pbuf, sizeof(char), 1, fich_e) && *pbuf != '\n') ecrire(pbuf, fich_s, 1); ecrire(pbuf, fich_s, 1); } /*---------- | empiler un caract�re --*/ void empiler(char c) { if( nbChar < TAILLE_MAX_PILE ) { pile[nbChar]=c; nbChar++; } } /*---------- | d�piler un caract�re --*/ char depiler() { if( nbChar > 0 ) { nbChar--; return pile[nbChar]; } else return '\0'; } /*---------- | renvoie le caract�re en haut de la pile --*/ char tete() { if( nbChar > 0 ) return pile[nbChar-1]; else return '\0'; } /*---------- | fonction principale --*/ main(int argc, char **argv) { FILE *fich_e, *fich_s; char *nom_fich_s, *ext; char buf, antebuf; ext = (char*) malloc(sizeof(char)*5); strcpy(ext, "7"); /* v�rification de la syntaxe. */ if( argc < 2 || argc > 3 ) { aideRapide(); exit(1); } if( !strcmp(argv[1],"-v") || !strcmp(argv[1],"--version") ) { version(); exit(0); } if( !strcmp(argv[1],"-?") || !strcmp(argv[1],"-h") || !strcmp(argv[1],"--help") ) { aideComplete(); exit(0); } if( argc != 2 ) { aideRapide(); exit(1); } /* ouverture du fichier source. */ if( !(fich_e = fopen(argv[1], "r")) ) { printf("Impossible d'ouvrir le fichier source %s.\n", argv[1]); exit(1); } /* cr�ation du nouveau fichier source. */ nom_fich_s = (char*) malloc((strlen(argv[1])+strlen(ext)+1)*sizeof(char)); strcpy(nom_fich_s, argv[1]); strcat(nom_fich_s, ext); if( !(fich_s = fopen(nom_fich_s, "w+")) ) { printf("Impossible d'ouvrir le fichier %s en �criture.\n", nom_fich_s); exit(1); } /* initialisation de la pile */ pile = (char*) malloc(sizeof(char)*TAILLE_MAX_PILE); nbChar = 0; /* traduction caract�re par caract�re. */ antebuf = '\0'; while(fread(&buf, sizeof(char), 1, fich_e)) { if(buf == '�') /* a */ ecrire("\\`{a}", fich_s, 5); else if(buf == '�') ecrire("\\'{a}", fich_s, 5); else if(buf == '�') ecrire("\\^{a}", fich_s, 5); else if(buf == '�') ecrire("\\~{a}", fich_s, 5); else if(buf == '�') ecrire("\\\"{a}", fich_s, 5); else if(buf == '�') ecrire("\ae ", fich_s, 4); else if(buf == '�') /* A */ ecrire("\\`{A}", fich_s, 5); else if(buf == '�') ecrire("\\'{A}", fich_s, 5); else if(buf == '�') ecrire("\\^{A}", fich_s, 5); else if(buf == '�') ecrire("\\~{A}", fich_s, 5); else if(buf == '�') ecrire("\\\"{A}", fich_s, 5); else if(buf == '�') ecrire("\\AE ", fich_s, 4); else if(buf == '�') /* c */ ecrire("\\c{c}", fich_s, 5); else if(buf == '�') /* C */ ecrire("\\c{C}", fich_s, 5); else if(buf == '�') /* e */ ecrire("\\`{e}", fich_s, 5); else if(buf == '�') ecrire("\\'{e}", fich_s, 5); else if(buf == '�') ecrire("\\^{e}", fich_s, 5); else if(buf == '�') ecrire("\\\"{e}", fich_s, 5); else if(buf == '�') /* E */ ecrire("\\`{E}", fich_s, 5); else if(buf == '�') ecrire("\\'{E}", fich_s, 5); else if(buf == '�') ecrire("\\^{E}", fich_s, 5); else if(buf == '�') ecrire("\\\"{E}", fich_s, 5); else if(buf == '�') /* i */ ecrire("\\`{\\i}", fich_s, 6); else if(buf == '�') ecrire("\\'{\\i}", fich_s, 6); else if(buf == '�') ecrire("\\^{\\i}", fich_s, 6); else if(buf == '�') ecrire("\\\"{\\i}", fich_s, 6); else if(buf == '�') /* I */ ecrire("\\`{I}", fich_s, 5); else if(buf == '�') ecrire("\\'{I}", fich_s, 5); else if(buf == '�') ecrire("\\^{I}", fich_s, 5); else if(buf == '�') ecrire("\\\"{I}", fich_s, 5); else if(buf == '�') /* n */ ecrire("\\~{n}", fich_s, 5); else if(buf == '�') /* N */ ecrire("\\~{N}", fich_s, 5); else if(buf == '�') /* o */ ecrire("\\`{o}", fich_s, 5); else if(buf == '�') ecrire("\\'{o}", fich_s, 5); else if(buf == '�') ecrire("\\^{o}", fich_s, 5); else if(buf == '�') ecrire("\\~{o}", fich_s, 5); else if(buf == '�') ecrire("\\\"{o}", fich_s, 5); else if(buf == '�') ecrire("\\oe ", fich_s, 4); else if(buf == '�') /* O */ ecrire("\\`{O}", fich_s, 5); else if(buf == '�') ecrire("\\'{O}", fich_s, 5); else if(buf == '�') ecrire("\\^{O}", fich_s, 5); else if(buf == '�') ecrire("\\~{O}", fich_s, 5); else if(buf == '�') ecrire("\\\"{O}", fich_s, 5); else if(buf == '�') ecrire("\\OE ", fich_s, 4); else if(buf == '�') /* u */ ecrire("\\`{u}", fich_s, 5); else if(buf == '�') ecrire("\\'{u}", fich_s, 5); else if(buf == '�') ecrire("\\^{u}", fich_s, 5); else if(buf == '�') ecrire("\\\"{u}", fich_s, 5); else if(buf == '�') /* U */ ecrire("\\`{U}", fich_s, 5); else if(buf == '�') ecrire("\\'{U}", fich_s, 5); else if(buf == '�') ecrire("\\^{U}", fich_s, 5); else if(buf == '�') ecrire("\\\"{U}", fich_s, 5); else if(buf == '�') /* y */ ecrire("\\'{y}", fich_s, 5); else if(buf == '�') ecrire("\\\"{y}", fich_s, 5); else if(buf == '�') /* Y */ ecrire("\\'{Y}", fich_s, 5); else if(buf == '"') /* guilemets */ { if( antebuf != '\\' ) { switch(tete()) { case '{' : case '\0' : ecrire("\\og ", fich_s, 4); empiler('<'); break; case '<' : ecrire("\\fg ", fich_s, 4); depiler(); break; } } else /* doubles-c�tes */ { ecrire("\"", fich_s, 1); } } else if(antebuf != '\\' && buf == '{') /* accolades */ { empiler('{'); ecrire(&buf, fich_s, 1); } else if(antebuf != '\\' && buf == '}') { while( (depiler() != '{') && (depiler() != '\0') ); ecrire(&buf, fich_s, 1); } else if( antebuf != '\\' && buf == '%' ) /* commentaires */ { ecrire(&buf, fich_s, 1); avalerligne(fich_e, fich_s, &buf); } else /* caract�res classiques */ ecrire(&buf, fich_s, 1); if( antebuf == '\\' && buf =='\\' ) antebuf = '\0'; else antebuf = buf; } /* lib�ration des ressources. */ fermer(fich_e, argv[1]); fermer(fich_s, nom_fich_s); printf("le ficher %s a �t� cr�� avec succ�s.\n", nom_fich_s); free(nom_fich_s); free(ext); free(pile); exit(0); }