Projet mkd/cpp.c
De Wiki EELL.
Version du 29 novembre 2012 à 13:23 par JPL (discuter | contributions)
Retour aux fichiers en développement →
- Les tabulations posent parfois quelques problèmes de lisibilité
- ATTENTION, ce fichier a fait l'objet de modifications dans l'application mkdcppw pour être utilisable en inclusion dans le fichier C++, et aussi en fin de fichier pour éviter le caractère EOF.
- Notez que le mode verbose (option v) n'est pas pris en compte dans ce fichier
/* * © mkd, version 2009.12 et ultérieures * * Concédée sous licence EUPL, version 1.1 ou – dès leur approbation par la * Commission européenne - versions ultérieures de l’EUPL (la «Licence»). * Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence. * Vous pouvez obtenir une copie de la Licence à l’adresse suivante: * * http://ec.europa.eu/idabc/eupl5 * * Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous * la Licence est distribué «en l’état», * SANS GARANTIES OU CONDITIONS QUELLES QU’ELLES SOIENT, expresses ou implicites. * Consultez la Licence pour les autorisations et les restrictions linguistiques * spécifiques relevant de la Licence. */ /*O NOM DU FICHIER : cpp.c PROJET : mkd http://edeulo.free.fr/wiki/index.php/Portail:mkd PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète. DOSSIER : http://edeulo.free.fr/wiki/index.php/Projet_mkd PROGRAMMEUR: http://edeulo.free.fr/wiki/index.php/Utilisateut:JPL DATE: 10 janvier 2010 MODIFICATIONS: Le: 11/02/2010 pour la mise à jour sous MS Visual C10 beta 2 par JPL Le: ../../.. par Le: ../../.. par */ /*P ----------------------------------------------------------------------------- © EELL, contact: http://edeulo.free.fr/wiki/index.php/Utilisateur:eudelo © EELL, Editeurs Européens de Logiciels Libres, 20074 Association à but non lucratif selon l'Article 11 de la convention européenne des droits de l'homme. */ /*D fonction cpp_ ----------------------------------------------------------------------------- ACTION: La fonction cpp_ lit le fichier source (pnfile) qui est transmis en paramètre et décode les lignes de commentaires précodés dans le style C++ puis les transcrit dans le fichier de destination (pfdoc) lorsque le code correspond à un des codes externes à la fonction; Les variables globales sont les codes et les options. Les codes, tabeau de 5 caractères: extern char codes[]; ils doivent être définis dans le programme d'appel: char codes[5] = {0,0,0,0,0}; Les options, n,s,t,v. extern unsigned char n,s,t,v; elles doivent définies dans le programme d'appel: unsigned char n=0,s=0,t=0,v=0; Avec les options : n: La transcription est précédée du numéro de ligne. Ceci permet d'atteindre facilement la ligne commentée. t: Avec l'option t seul le texte commenté est recopié. Sans l'option t le commentaire est entièrement recopié. Cette option t permet donc de générer des documents directement exploitables ou publiables. s: ajoute le commentaire à l'écran. v: mode bavard Remarque : Si la dédection d'un commentare à transcrire commence par le caractère '/' suivi de '*' il sera transcrit jusqu'à rencontrer le caractère '*' suivi de '/', quel que soit le commentaire ligne inclus dans ce commentaire. Si la détection d'un commentaire commence par deux caractères '/', le commentaire sera copié jusqu'au prochain retour à la ligne (NL) ou fin de fichier (EOF). Ces dispositions facilitent la génération automatique des fichiers d'entête fichier.h ou .hpp etc. SYNTAXE: #include "version.h" #include "cpp.h" int cpp(FILE *pfdoc, FILE *pnfile); PORTABILITE: Microsoft Visual studio sous Windows : x86(Win32) x64(Win32 et WIN64) gcc sous Linux. DESCRIPTION: cpp_ fonction FILE* pfdoc: pointeur sur le fichier de destination ouvert par le programme appelant. FILE* pnfile: pointeur sur le fichier source ouvert par le programme appelant VALEUR RETOURNEE: Retourne 0 DROIT DE COPIE: (précisé dans cpp.h ou version.h) : */ /*H // cpp.cpp: extern int cpp_ (FILE *pfdoc, FILE *pnfile); */ //% //% DROIT DE COPIE: //% © Jean-Paul LOUYOT contact: http://jeanpaullouyot.free.fr/ //% © EELL, Editeurs Européens de Logiciels Libres, 20074 //% Association à but non lucratif selon l'Article 11 de la convention //% européenne des droits de l'homme. //% //% Concédée sous licence EUPL, version 1.1 ou – dès leur approbation par la //% Commission européenne - versions ultérieures de l’EUPL (la «Licence»). //% Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence. //% Vous pouvez obtenir une copie de la Licence à l’adresse suivante: //% //% http://ec.europa.eu/idabc/eupl5 //% //% Sauf obligation légale ou contractuelle écrite, le logiciel distribué //% sous la Licence est distribué «en l’état», //% SANS GARANTIES OU CONDITIONS QUELLES QU’ELLES SOIENT, expresses ou //% implicites. //% Consultez la Licence pour les autorisations et les restrictions //% linguistiques spécifiques relevant de la Licence. //% #include "version.h" #include "cpp.h" int cpp_ (FILE* pfdoc, FILE* pnfile) { /*S cpp_ */ extern unsigned char n,s,t; //www rappels options booleennes à définir dans main() ou winmain() extern char codes[]; unsigned int i,tab; unsigned num = 0; long ll,nl; int c1 = STX; /* STX : Start Text */ int c2 = STX; int c3 = STX; /*O tant que pas fin de fichier source */ while ( c1 != EOF && c2 != EOF && c3 != EOF ) { /*S tq !EOF */ bool ligne = 0; /*O si debut de texte faire c1=LF */ if (c1==STX) c1='\n'; /*O sinon prendre pour c1 le char pointe */ else c1=getc(pnfile); /*O si le char est NL reperer la position qui suit NL, dans nl */ if(c1=='\n') { /*S*/ nl=ftell(pnfile); tab=0; num++; } /*S*/ else { /*S !NL */ /*O si le char est '\t' incrementer tab */ if (c1=='\t')tab++; /*O sinon si le char est '/' */ else if(c1=='/') /*O alors: */ { /*S char = '/' */ c2=getc(pnfile); c3=getc(pnfile); /*O si suivi par c2 = '*' ou '/' et si options[0]=0 ou si suivi par char code utilisateur */ if( (c2=='*'||c2=='/') && (!codes[0]|| c3 == codes[0] || c3 == codes[1] || c3 == codes[2] || c3 == codes[3] || c3 == codes[4] ) ) /*O alors: */ { /*S traiter le commentaire C */ /*O si c2 = '/' positionner le booléen ligne à vrai (=1) */ if(c2=='/') ligne=1; /*O reperer la position commentaire */ //Pw Apparition de codes dans les lignes si les codes[] sont à 0 // if(!codes[0])ungetc(c3,pnfile); //Pw dépend de la déclaration de codes[] ll=ftell(pnfile); /*O si option n insérer le numéro de ligne */ if(n) { /*S*/ fprintf( pfdoc, "%5d ", num ); if(s) printf( "%5d ", num ); } /*S*/ /*O si pas option t */ if(!t) { /*S!t*/ /*O se positionner en dédut de ligne */ fseek(pnfile,nl,0); /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ /*O copier la ligne jusqu'au commentaire, dans le fichier doc */ for(i=(int)(ll-nl);i>0;i--) { /*S*/ c1=getc(pnfile); putc(c1,pfdoc); if(s)putch(c1); } /*S*/ } /*S!t*/ /*O sinon: (option t) */ else { /*St*/ /*O copier des tab autant qu'il y en a dans le source */ for(i=0;i<tab;i++) { /*S*/ putc('\t',pfdoc); if(s)putch('\t'); } /*S*/ /*O copier des blancs jusqu'à la position commentaire */ for(i=(int)(ll-nl-tab);i>0;i--) { /*S*/ putc(' ',pfdoc); if(s)putch(' '); } /*S*/ } /*St*/ /*O puis si booléen ligne est vrai (=1) */ if(ligne) /*O alors : copier le commentaire jusqu'en fin de ligne ou End Of File (EOF) */ { /*Sligne*/ while ( (c1=getc(pnfile)) != '\n' && c1 !=EOF) { /*S copier commentaire */ putc(c1,pfdoc); if(s)putch(c1); } /*S copier commentaire */ ungetc(c1,pnfile); /* pour la recopie fin de ligne */ } /*Sligne*/ /*O sinon : tq ne rencontre pas * suivi de /, copier le commentaire */ else { /*Selse*/ while ( !(c1=='*' && c2=='/') ) { /*Sw*/ if( (c1=getc(pnfile)) != '*') { /*S*/ /*www if(c1=='\n') fprintf(pfdoc, "%s", NL );*/ /*P CR/LF sous DOS */ /*www else */ putc(c1,pfdoc); if(s)putch(c1); /*O si option n et char=NL insérer le numéro de la ligne qui suit NL */ if( n && c1=='\n' ) { /*S*/ num++; fprintf( pfdoc,"%5d ", num ); if(s) printf("%5d ", num ); } /*S*/ } /*S*/ else /*P (c1='*' voir c2) */ { /*S*/ if((c2=getc(pnfile))=='/') { /*S*/ ungetc(c2,pnfile); ungetc(c1,pnfile); /* pour la recopie fin de ligne */ } /*S*/ else /*P c1 = toujours '*' */ { /*S fausse alerte */ ungetc(c2,pnfile); putc(c1,pfdoc); if(s)putch(c1); } /*S fausse alerte */ } /*S*/ } /*Sw*/ } /*Selse*/ #ifdef FULL_LINE /*O Opt. compil. *** FULL_LINE *** */ /*O si pas option t */ if(!t) { /*S*/ /*O copier les chars jusqu'en fin de ligne (ou EOF) y compris '\r' sous DOS */ while ( (c1=getc(pnfile)) != '\n' && c1!=EOF ) { /*S*/ putc(c1,pfdoc); if(s)putch(c1); } /*S*/ } /*S*/ /*O sinon (option t) */ else #endif /*O Opt. compil. end *** FULL_LINE *** */ { /*S*/ /*O aller au bout de la ligne sans copier, sauf les 'retour chariot' */ while ( (c1=getc(pnfile)) != '\n' && c1!=EOF ) { /*Sw*/ if (c1=='\r') { /*S*/ putc( c1, pfdoc ); if(s) putch( c1 ); } /*S*/ } /*Sw*/ } /*S*/ /*O puis envoyer les NL sous forme \n */ /*www fprintf(pfdoc, "%s", NL );*/ /*www if(s) puts("");*/ putc(c1,pfdoc); if(s)putch(c1); /*O revenir sur NL */ ungetc(c1,pnfile); } /*S traiter le commentaire C */ /*O sinon: (pas de commentaire */ else { /*S pas le cas */ /*O revenir en arrière de 2 caraxctères */ ungetc(c3,pnfile); ungetc(c2,pnfile); } /*S pas le cas */ } /*S endif char = '/' */ } /*S endif!NL */ } /*S end tq !EOF */ return 0; } /*S cpp_ */