Projet mkd/cpp.c

De Wiki EELL.

(Différences entre les versions)
m (Mise à jour)
m (Mise à jour)
Ligne 1 : Ligne 1 :
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
: Les tabulations posent parfois quelques problèmes de lisibilité
: 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
<pre>
<pre>
/*
/*
Ligne 20 : Ligne 22 :
/*O
/*O
-
NOM DU FICHIER : cpp.cpp
+
NOM DU FICHIER : cpp.c
PROJET : mkd http://edeulo.free.fr/wiki/index.php/Portail:mkd
PROJET : mkd http://edeulo.free.fr/wiki/index.php/Portail:mkd
PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète.
PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète.

Version du 29 novembre 2012 à 13:23

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_ */
Outils personnels