Projet mkd/mkdcpp.c

De Wiki EELL.

(Différences entre les versions)
m
m
Ligne 1 : Ligne 1 :
{{Modèle:Pas fini/autre}}
{{Modèle:Pas fini/autre}}
<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>
 +
__TOC__
 +
== version.h ==
 +
<pre>
 +
</pre>
 +
 +
 +
 +
== cpp.h ==
 +
<pre>
 +
   
 +
// cpp.cpp:
 +
extern int cpp_ (FILE *pfdoc, FILE *pnfile);
 +
//%
 +
//% DROIT DE COPIE:
 +
//% © 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.
 +
//%
 +
 +
</pre>
 +
 +
 +
 +
== mkdcpp.c ==
<pre>
<pre>
/*P
/*P

Version du 19 décembre 2010 à 17:14

Cette page n'est pas finie. Veuillez considérer le plan et le contenu comme incomplets et en préparation, temporaires et sujets à caution. Si vous souhaitez participer, il vous est recommandé de consulter sa page de discussion au préalable.

Retour aux fichiers en développement →

Sommaire

version.h



cpp.h

    
//	cpp.cpp:
	extern int cpp_ (FILE *pfdoc, FILE *pnfile);
//%
//%	DROIT DE COPIE:
//%	© 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.
//%


mkdcpp.c

/*P
 © 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.

 NOM DU FICHIER: mkdcpp.cpp
	Fichier source d'entrée du programme de test unitaire  de la fonction 
	cpp_ La compilation donne un programme exécutable en version console
	réduite au module C++ qui entre dans le projet global mkd.
	Cet exécutable peut être utilisé dans une fenêtre console; 'cmd.exe'
	sous WINDOWS; 'console' sous UNIX/LINUX; ou à l'aide d'un fichier SHELL
	ou d'un MAKEFILE.
	mkdcpp.cpp est compilable 
 PROJET: mkd 
	Générer la documentation préécrite dans les fichiers de sources multiples.
 	Génie logiciel :
	Le programmeur écrit la documentation en même temps que le code source, 
	la fiabilité de la programmation et la mise à jour des modifications s'en
	trouve améliorée.
 PROJET INITIAL: 
 	mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète. Université Montpellier II
 DOSSIER: 
 	extractdoc 04/12/2009
 PROGRAMMEUR: 
 	JP LOUYOT 11/02/2010 pour la mise à jour sous MS Visual C10 beta 2 
 DATE: 10 janvier 2010 
 MODIFICATIONS:
  Le: ../../.... par ... objet de la modification ....
  Le: ../../.... par ... objet de la modification ....
*/

/*D
	mkdcpp.cpp : Définit le point d'entrée du programme (mkdcpp.exe)
 -----------------------------------------------------------------------------
 ACTION:
	Programme d'épreuve de la fonction cpp_(). lit les paramètres entrés en
	ligne de commande, vérifie la validité des paramètres, ouvre les fichiers
	source et destination puis les transmet à la fonction cpp_().
	Ce programme est auto éprouvé et peut être facilement rendu autonome en
	ajoutant un cinquième paramètre à la ligne de commande pour entrer le nom
	du fichier destinataire.

 SYNTAXE:
	mkdcpp.exe [--Options(nst)] [-Codes(DHOPSTUw(5 max)] fichier_source

	Options :
		n : numéro de ligne (ajoute le numéro de ligne en 1ère colonne)
		s : écran (screen) (ajoute le commentaire à l'écran)
		t : texte seul (ne copie pas les caractères de 'Codes')
		v : mode bavard

	Codes : 5 caractères maximum
		Caractères usuels en programmation:
		D: pour la documentation générale sur les fonctions (listing)
		H: pour générer le fichier d'entête .h
		O: pour l'organigramme
		P: à l'attention des programmeurs
		S: pour le contrôle de la structure du programme
		T: pour les points de tests
		U: pour la documentation utilisateur
		w: pour Attention (warning)

	fichier_source : 
		fichier qui contient le code en style de commentaire C++ ou php

	fichier destinataire :
		Le fichier qui sera documenté aura le même nom que le fichier source 
		auquel on aura ajouté l'extension '.txt'

 PORTABILITE:
		x86-Win32	x64-Win64   (LINUX à vérifier)

 VALEUR RETOURNEE:
		0 en cas de réussite
		-1 en cas d'erreur de syntaxe
		-2 en cas d'erreur d'ouverture ou de fermeture de fichier

 DROIT DE COPIE: précisé dans cpp.h

*/

#include "..\..\include\version.h"
#include "cpp.h"

// Variables globales
	unsigned char n=0,s=0,t=0,v=0;				/*P*/
	char codes[5] = {0,0,0,0,0};				/*P version qui copie les codes avec l'option t dans cpp_()
													Il peut être nécessaire de modifier les lignes ~161 dans cpp.cpp */
	// char codes[5] = {' ',' ',' ',' ',' '};	/*P version qui copie les commentaires après le caractère ' ' dans cpp_()*/

int main(int argc, char *argv[])
{ /*O main Test */
	printf("Epreuve (Test, debug) de cpp.cpp\n");
//	char *fprj= "";					/*P nom fichier projet s'il existe		*/
	char fdoc[MAX];					/*P nom fichier documentaire en sortie	*/
//	char fdoc[] = "C++_doc.txt";	/*P nom fichier documentaire en sortie	*/

	char fsrc[MAX];					/*P nom fichier source a documenter		*/
//	char fsrc[] = ".\\C++_FILE.a";	/*P nom fichier source a documenter		*/
	extern  char codes[];			/*P codes */
	extern unsigned char A,B,C,F,P,S,a,f,j,l,n,p,s,t,v,w;	/*P rappels options booleennes */

/*O	init options par defaut */
	{n=0,s=0;t=0;v=0;} /*O option v = 0 (verbose) de compilation; v n'est pas utilisé dans cpp_() */
//	 O=0; /* Option=0 */

	int i=0;			/*P compteurs */
	int k=0;
	char isource=0;		/*P position nom du fichier source dans path source */
	char itarget=0;		/*P position fin du path_target avec '*' ou ':'(PC) */
	char ktar=0;		/*P position du '.' dans p_target */
	static char O;		/*P booleen =1 si option validee */
	static char L;		/*P booleen =1 si option langage */
	register int c=0;	/*P char (variable) */
	int c1=0;			/*P char (variable) pour version PC */

//	FILE *pfprj;  /*P FICHIER PROJET			*/
	FILE *pnfile; /*P FICHIER SOURCE A TRIER	*/
	FILE *pfdoc;  /*P FICHIER A DOCUMENTER		*/

	printf("argv[0] = %s\n",argv[0]); 				/*T*/
	if (argc > 1) printf("argv[1] = %s\n",argv[1]);	/*T*/
	if (argc > 2) printf("argv[2] = %s\n",argv[2]);	/*T*/
	if (argc > 3) printf("argv[3] = %s\n",argv[3]);	/*T*/
		
/*O	Si la syntaxe n'est pas correcte (argc <2) "mkdcpp [--nst] [-Code(DHOPSTUw)] Source_cpp" */
	if (argc < 2) 
/*O	Alors Préciser la syntaxe et quitter sur erreur de syntaxe -1*/
	{ /*S syntaxe intégrée */
//#ifdef FR
		printf("Syntaxe : %s [--Options(nst)] [-5 Codes(DHOPSTUw)] source_cpp\n",argv[0]);
		printf("Appuyer sur la touche 'Entree' pour quitter.\n\n");
//#endif
//#ifdef EN
		printf("Syntax: %s [--Options(nst)] [-5 Codes(DHOPSTUw)] cpp_source\n",argv[0]);
		printf("Press 'Enter' to quit.\n");
//#endif
		getc(stdin); // attente touche 'Entrée' */ 
		exit(-1);
	} /*S syntaxe intégrée */
/*O si argc = 2 (source cpp en premier paramètre) */
	if (argc == 2)
	{ /*S argc = 2 */
		if (strcpy_s(fsrc,argv[1])!=0)
		{
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		}
		else
		{ /*S*/
			strcpy_s(fdoc,argv[1]); /*O strcpy_s : évite l'erreur overflow */
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=2 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 2 */

/*O si argc = 3 (option ou code) */
	if (argc == 3)
	{ /*S argc = 3 */
		if (argv[1][0]=='-' && argv[1][1]=='-')	/*O Options ! */
		{ /*S Options */
			int i;
			// printf("argv[1][0]=%c - argv[1][1]=%c\n",argv[1][0],argv[1][1]);	/*T*/
			for (i=0 ; i<4 && (argv[1][(i+2)]!=0) ; i++) 
            { /*S*/
				if (argv[1][(i+2)]=='n') n=1;				/*O n,s,t sont des variables globales */
				else if (argv[1][(i+2)]=='s') s=1;			/*O*/
					else if (argv[1][(i+2)]=='t') t=1;		/*O*/
						else if (argv[1][(i+2)]=='v') v=1;	/*O*/
				// printf("argv[1][%d]=%c & n=%c, s=%c, t=%c\n",(i+2), argv[1][i+2],n,s,t);	/*T*/
			} /*S*/
		} /*S Options */
		else if (argv[1][0]=='-' && argv[1][1]!='-') /*O Codes ! */
		{ /*S Codes */
			int i;
			for (i=0 ; i<5 && (argv[1][i+1]!=0) ; i++) codes[i]=argv[1][i+1];	/*O affectation */	
		} /*S Codes */
		else /*O sinon erreur de syntaxe */
		{ /*S*/
			puts("Options ? || Codes ?\n");	/*O*/
			exit(-1);						/*O*/
		} /*S*/
/*O		affectation du nom de fichier (.cpp) au nom de fichier destinataire, et ajouter .txt */
		if (strcpy_s(fsrc,argv[2])!=0)
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
			strcpy_s(fdoc,argv[2]);
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=3 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 3 */

/*O si argc = 4 (options et code) */
	if (argc == 4)
	{ /*S argc = 4 */
		if (argv[1][0]=='-' && argv[1][1]=='-') /*O Options */
		{ /*S Options */
			int i;
			for (i=0 ; i<4 && (argv[1][i+2]!=0) ; i++) 
			{ /*S*/
				if (argv[1][i+2]=='n') n=1; /*O n,s,t sont des variables globales */
				else if (argv[1][i+2]=='s') s=1;
					else if (argv[1][i+2]=='t') t=1;
						else if (argv[1][(i+2)]=='v') v=1;
			} /*S*/
		} /*S Options */
		else
		{ /*S err */
			puts("Options ?\n");
			exit(-1);
		} /*S err */
		if (argv[2][0]=='-' && argv[2][1]!='-') /*O Codes */
		{ /*S Codes */
			int i;
			for (i=0 ; i<5 && (argv[2][i+1]!=0) ; i++) codes[i]=argv[2][i+1];		
		} /*S Codes */
		else /*O erreur de syntaxe */
		{ /*S*/
			puts("Codes ?\n");
			exit(-1);
		} /*S*/
		if (strcpy_s(fsrc,argv[3])!=0)
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
			strcpy_s(fdoc,argv[3]);
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=4 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 4 */

/*O ouvrir le fichier source en lecture binaire*/
	{ /*S demarrage du test */
/*O		si l'ouverture du fichier source n'est pas correcte */
		// old syntax : if  (( pnfile = fopen ( fsrc,"rb" )) == 0 )		
		if (fopen_s(&pnfile, fsrc,"rb") !=0 )
		{ /*S ! open source pnfile */
	
/*O			ecrire fichier "nomfich" non trouvé ou erreur d'ouverture */
			printf ("fichier \'%s\' : non trouvé ou erreur d'ouverture\n",fsrc);
			puts("Tapez sur la touche 'Entrée' pour quitter\n\n");
			printf ("file \'%s\' : non found or open error\n",fsrc);
			puts("Press 'Enter' to quit.\n");
			getchar();
			exit(2);
		} /*S ! open source pnfile */
/*O		sinon, ouvrir le fichier à documenter en écriture ou réécriture */
		else
		{ /*S open pfdoc write */
/*O			si il y a une erreur à l'ouverture l'écrire et quitter en renvoyant le code d'erreur 2 */
			if((fopen_s(&pfdoc,fdoc,"wb")) != 0)
			// old syntax : if((pfdoc = fopen(fdoc,"wb")) == NULL)
			{ /*S si err à l'ouverture de pfdoc*/
				printf("fichier \'%s\' : erreur d'ouverture en écriture\n",fdoc);
				puts("Tapez sur la touche 'Entrée' pour quitter\n\n");
				printf("file \'%s\' : open error\n",fdoc);
				puts("Press 'Enter' to quit.\n");
				getchar();
				exit(-2);
			} /*S si err à l'ouverture de pfdoc*/
			else
			{ /*S sinon*/
/*O				si options n ou v ou s  et pas t écrire le nom du fichier lu */
				if(n||v||s)
				{ /*S si n ou v ou s valide */
					if (!t) fprintf(pfdoc,"%s\n(file %s :)", NL, fsrc );
					if( v || s ) printf("\n\n(file %s :)\n",fsrc);
					if (!t)fprintf (pfdoc," Options n=%d s=%d t=%d verbose=%d",n,s,t,v);
					if (!t)fprintf (pfdoc, "%s", NL );
				} /*S si n ou v ou s valide */
			} /*S sinon*/
		} /*S open pfdoc write */

		cpp_(pfdoc,pnfile);

/*O		fermer le fichier source et en cas d'erreur écrire "Erreur de fermeture */
		if (fclose(pnfile))
		{ /*S si*/
			printf("Erreur de fermeture : \'%s\'\n",fsrc);
			printf("Error on closed : \'%s\'\n",fsrc);
			exit(2);
		} /*S fin si*/
/*O		Fermer tous les autres fichiers */
		{ /* fermer */
			int numclosed = _fcloseall( );
			printf( "Nombre de fichiers fermés par _fcloseall : %u\n", numclosed );
			printf( "Number of files closed by _fcloseall: %u\n", numclosed );
		} /* fermer */
	} /*S demarrage du test */
	puts("Tapez sur la touche 'Entrée' pour quitter\n");
	puts("Press 'Enter' to quit.\n");
	getchar();	
	return 0;
} /*O main Test */
Outils personnels