Utilisateur:Goelette Cardabela/mkdcpp

Un livre de Wikilivres.
← Retour aux fichiers mkdwiki en développement

Une version imprimable du livre « mkdcpp » est disponible.Version test du module mkdcpp.


Les sources de mkdcpp sont à recompliler en tests d'évaluation avant de créer Utilisateur:Goelette Cardabela/mkd-getwikifiles.

Version originale de mkdcpp : Mkd_(Extracteur_de_documents)/Ajouter_des_modules[1]


version.h entête pour MSDEV.41 ou VC.10[modifier | modifier le wikicode]

Cette version d'entête contient la documentation nécessaire aux tests du logiciel.

//#define UNIX /*O UNIX version */ /* Delete this line for PC version */

#ifndef UNIX            /*H*/
#define PC              /*O version de compilation PC   */  /*H*/
/*#define PC_ONLY*/     /*H find_ ne reconnait pas: .s .f .p .sh .csh  */
#define NL "\r\n"       /*H*/
//#define VC10			/*O Microsoft Visual C 10.- */
#define MSDEV41
#endif                  /*H*/
                        /*H*/
#ifdef UNIX             /*H*/
#define UNIX_ONLY       /*H find_ ne reconnait pas: .BAS .PAS .FOR ... */
#define NL "\n"         /*H*/
#endif                  /*H*/
                        /*H*/

/*H #D *************************************************************************************/
/*H *** #Define OPTIONS DE COMPILATION:  options par defaut, redefinissables: **************
          (#D pour l'extraction des options de compilation en ligne avec l'option CD3='#') */
/*H****************** #Define 'l' (ligne) commence par #define en 1ère colonne : ***********/
#define CD1 '%'   /*H #Define Option CD1 en 1ere colonne  prend fin avec NL                */
#define CD2 '-'   /*H #Define Option CD2 en 1ere colonne  prend fin avec NL                */
#define CD3 '#'   /*H #Define Option CD3 dans la ligne    prend fin avec NL                */
                  /*H #Define Option '%' commentaire postcript                             */
                  /*H #Define Option '#' commentaire shell ou pour Makefile voir option S
                      #D            ( le commentaire se termine avec new_line )            */
                  /*H #Define Option '\'' commentaires Basic                               */
                  /*H #Define Option ';'  commentaires assembleur                          */
/*H ***************** #Define Option 'p' (dans la page) #define en 1ère colonne : **********/
#define CD4 '\"'  /*H #Define Option CD4 = "  debut de commentaire                         */
#define CD5 '\"'  /*H #Define Option CD5 = "  fin de commentaire                           */
                  /*H #Define **************************************************************/
#define FULL_LINE /*H #Define Option de compil. copier toute la ligne                      */
/*H #D *************************************************************************************/
							/*H*/
#define VERSION "10.03"		/*H*/
							/*H*/
#define MAX     85			/*H longueur des buffers des path source et doc */
#define STX     0x2			/*H Start Text */
#include <stdio.h>			/*H*/
							/*H*/
#ifdef PC					/*H*/
#include <conio.h>			/*H*/
#include <process.h>		/*H*/
#include <io.h>				/*H*/
#endif						/*H*/
#ifdef VC10					/*H Microsoft Visual C 10.- */
	#define putch _putch	/*H ISO C++ */
	#define getch _getch	/*H ISO C++ */
	#define access _access	/*H ISO C++ */
#endif						/*H*/
							/*H*/
#ifdef MSDEV41				/*H*/
	#include <string.h>		/*H*/
#endif						/*H*/
							/*H*/
#ifdef UNIX					/*H*/
	/*#define getch() getchar()*/
	#define putch putchar	/*H*/
#include <signal.h>			/*H*/
#include <sys/file.h>		/*H*/
#endif						/*H*/

Rustine (patch) Version.h pour minGW[modifier | modifier le wikicode]

// define VERSION line 173

//#define UNIX 		/*O UNIX version */ /* Delete this line for PC version */
//#define GTKMM		/*O Version fenêtrée avec gtkmm pour mkdcppw uniquement */
//#define GETTEXT   //O Used only with gettext

#ifndef UNIX            /*H*/
#define PC              /*O version de compilation PC   */  /*H*/
//#define PC_ONLY         /*H find_ ne reconnaît pas: .s .f .p .sh .csh  */
#define NL "\r\n"       /*H*/
//#define VC10            /*O Microsoft Visual C 10.- */
#define MSDEV41         /*O Microsoft 2004 */
#define MinGW           /*O Mingw environment for Windows */
#endif                  /*H*/
//H
#ifdef UNIX             /*H*/
//#define UNIX_ONLY       /*H find_ ne reconnaît pas: .BAS .PAS .FOR ... */
#endif                  /*H*/
//H

/*H #D *************************************************************************************/
/*H *** #Define OPTIONS DE COMPILATION:  options par défaut, redéfinissables: **************
          (#D pour l'extraction des options de compilation en ligne avec l'option CD3='#') */
/*H****************** #Define 'l' (ligne) commence par #define en 1ère colonne : ***********/
#define CD1 '%'   /*H #Define Option CD1 en 1ère colonne  prend fin avec NL                */
#define CD2 '<'   /*H #Define Option CD2 en 1ère colonne  prend fin avec NL                */
#define CD3 '!'   /*H #Define Option CD3 dans la ligne    prend fin avec NL                */
                  /*H #Define Option '!' commentaire Fortran 90 et ultérieurs              */
                  /*H #Define Option '%' commentaire postcript                             */
                  /*H #Define Option '#' commentaire shell ou pour Makefile voir option S
                                     ( le commentaire se termine avec new_line )           */
                  /*H #Define Option '\'' commentaires Basic                               */
                  /*H #Define Option ';'  commentaires assembleur                          */
/*H ***************** #Define Option 'p' (dans la page) #define en 1ère colonne : **********/
#define CD4 '\"'  /*H #Define Option CD4 = "  debut de commentaire                         */
#define CD5 '\"'  /*H #Define Option CD5 = "  fin de commentaire                           */
                  /*H #Define **************************************************************/
#define FULL_LINE /*H #Define Option de compil. copier toute la ligne                      */
/*H #D *************************************************************************************/
//H
#define VERSION "130530"	/*H*/
//H
#define MAX     85		/*H longueur des buffers des path source et doc */
#define STX     0x2		/*H Start Text */
#include <stdio.h>		/*H*/
//H
#ifdef PC            /*H*/
// #include <conio.h>   /*H*/ // inconnu dans MinGW
#include <process.h> /*H*/
#include <io.h>      /*H*/
#endif               /*H*/
#ifdef VC10          /*H Microsoft Visual C 10.- */
	#define putch putchar // _putch    /*H ISO C++ */
	#define getch getchar // _getch    /*H ISO C++ */
	#define access _access  /*H ISO C++ */
#endif                      /*H*/
//H
#ifdef MSDEV41           /*H Valider aussi pour minGW et linux. */
	//#define STD_C       /*H SVr4, 4.3BSD, C89, C99.*/
	#include <string.h>  /*H*/
#endif                   /*H*/
//H
#ifdef  MinGW            //H
	#define exit return  //H
	#define bool int     //H
	//#define STD_C      /*H SVr4, 4.3BSD, C89, C99.*/
	#define getch() getchar() //H defined in mkd.c
	#define putch putchar /*H*/
	#include <strings.h> //H
#endif                   //H
//H
#ifdef UNIX              /*H*/
	#define NL "\n"      /*H*/
	#define exit return  //H
	#define bool int     //H
	//#define STD_C      /*H SVr4, 4.3BSD, C89, C99.*/
	//#define getch() getchar() //H defined in mkd.c
	#define putch putchar /*H*/
    #define _fcloseall closeall /*H int fcloseall(void);*/
#include <signal.h>       /*H*/
#include <sys/file.h>     /*H*/
#include <string.h>       /*H*/
#endif                    /*H*/

cpp.h[modifier | modifier le wikicode]

Entête de la fonction cpp().

//	cpp.cpp:
	extern int cpp_ (FILE *pfdoc, FILE *pnfile);

cpp.c[modifier | modifier le wikicode]

Code C, d'extraction de la documentation des fichiers en langage C ou c++.

/*H  
	// cpp.cpp:
	extern int cpp_ (FILE *pfdoc, FILE *pnfile);
*/

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

	int cpp_ (FILE* pfdoc, FILE* pnfile)
	{ /*S cpp_ */
		extern unsigned char n,s,t;  //www rappels options booléennes à 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 l'on n'est pas en fin de fichier source */
        while ( c1 != EOF && c2 != EOF && c3 != EOF )
        { /*S tq !EOF */

			/*bool*/ char ligne = 0;	 /*www bool else : char for MSDEV */
/*O			si on est en début de texte faire c1=LF */
			if (c1==STX) c1='\n';
/*O			sinon prendre pour c1 le char pointé */
			else c1=getc(pnfile);
/*O			si le char est NL, repérer la position qui suit NL, dans la variable nl */
			if(c1=='\n')
			{ /*S*/
				nl=ftell(pnfile);
				tab=0;
				num++;
			} /*S*/
			else
			{ /*S !NL */
/*O				si le caractère est '\t' incrémenter la variable tab */
				if (c1=='\t')tab++;
/*O				sinon si le caractère est '/' */
				else if(c1=='/')
/*O				alors: */
				{ /*S char = '/' */
					c2=getc(pnfile);
					c3=getc(pnfile);
/*O					si il est suivi par c2 = '*' ou '/' et si l'options[0]=0 ou si il est suivi par caractère '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						repérer 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 l'option n est validée, insérer le numéro de ligne */
						if(n)
						{ /*S*/
							fprintf( pfdoc, "%5d ", num );
							if(s) printf( "%5d ", num );
						} /*S*/
/*O						si l'option t n'est pas validée */
						if(!t)
						{ /*S!t*/
/*O							se positionner en début 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 validée) */
						else
						{ /*St*/
/*O							copier des tabulations autant qu'il y en a dans le fichier 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 le 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 : tant que l'on 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 l'option n=1 et le caractère est 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 l'option t n'est pas validée */
						if(!t)
						{ /*S*/
/*O							copier les caractères 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 validée) */
						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 caractères dans le fichier */
						ungetc(c3,pnfile);
						ungetc(c2,pnfile);
					} /*S pas le cas */
				} /*S endif char = '/' */
			} /*S endif!NL */
		} /*S end tq !EOF */
		return 0;
	} /*S cpp_ */

mkdcpp.c[modifier | modifier le wikicode]

Code du programme principal (main).

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

// Variables globales
	unsigned char n=0,s=0,t=0,v=0;				/*P déclaration et initialisation des variables */
	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.c */
	// 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 */
//	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("Epreuve de cpp.c ; mkdcpp version 01/2011 compilation avec MSDEV41 pour x86-32 (Windows XP a Windows 7\n");
	printf("Debug cpp.c ; mkdcpp version 01/2011 compiled with MSDEV41 for x86-32 (Windows xp to Windows 7\n");
	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 */
#ifdef VC10		
		if (strcpy_s(fsrc,argv[1])!=0)	/*w strcpy_s : évite l'erreur overflow */
#endif
#ifdef MSDEV41
		if (strcpy(fsrc,argv[1])==NULL)
#endif
		{
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		}
		else
		{ /*S*/
#ifdef VC10
			strcpy_s(fdoc,argv[1]); /*w strcpy_s : évite l'erreur overflow */
			strcat_s(fdoc,".txt");
#endif
#ifdef MSDEV41
			strcpy(fdoc,argv[1]); 
			strcat(fdoc,".txt");
#endif
			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 */
#ifdef VC10
		if (strcpy_s(fsrc,argv[2])!=0)
#endif
#ifdef MSDEV41
		if (strcpy(fsrc,argv[2])==NULL)
#endif
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
#ifdef VC10
			strcpy_s(fdoc,argv[2]);
			strcat_s(fdoc,".txt");
#endif
#ifdef MSDEV41
			strcpy(fdoc,argv[2]); 
			strcat(fdoc,".txt");
#endif
			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*/
#ifdef VC10
		if (strcpy_s(fsrc,argv[3])!=0)
#endif
#ifdef MSDEV41
		if (strcpy(fsrc,argv[3])==NULL)
#endif
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
#ifdef VC10
			strcpy_s(fdoc,argv[3]);
			strcat_s(fdoc,".txt");
#endif
#ifdef MSDEV41
			strcpy(fdoc,argv[3]);
			strcat(fdoc,".txt");
#endif
			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 */
#ifdef VC10 		
		if (fopen_s(&pnfile, fsrc,"rb") !=0 )
#endif
#ifdef MSDEV41
		if  (( pnfile = fopen ( fsrc,"rb" )) == 0 )	 // old syntax 
#endif
		{ /*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 */
#ifdef VC10
			if((fopen_s(&pfdoc,fdoc,"wb")) != 0)
#endif
#ifdef MSDEV41
			if((pfdoc = fopen(fdoc,"wb")) == NULL)  // old syntax
#endif
			{ /*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 */

Manuels de mkd pour mémoire anglais et français[modifier | modifier le wikicode]

mkd (Commande unix) inclut de module cpp.
Préférer les versions officielles du manuel :
https://fr.wikibooks.org/wiki/Mkd_(Extracteur_de_documents)/mkd-Manuel_(fr)

Fichiers de commandes pour les tests[modifier | modifier le wikicode]

Shell tests.bat (dos/windows)[modifier | modifier le wikicode]

Ce fichier est à copier dans le répertoire des tests, sous-répertoire des sources.
Copy tests.bat in src/tests/ or in src/Test_unitaire directory.

Directory src/ content: mkdcpp.c, cpp.c, cpp.h, version.h, (mkdcpp.exe or ./Debug/mkdcpp.exe)

Directory src/tests/ or src/Test_unitaire, content: tests.bat

tests.bat copy all files in same directory for all tests
 
@TITLE TESTS.BAT
echo off
color 2E

REM **********************************************************************************
REM tests.bat R 11.01
REM mkdcpp est très simple et n'accepte pas de fichier de destination d'où l'artifice 
REM avec les redirections > et >>
REM autrement: utiliser mkd.exe pour créer le fichier .h avec la syntaxe de mkd selon
REM les versions de mkd.exe
REM **********************************************************************************

echo mise a jour des fichier mkdcpp.exe, cpp.c et mkdcpp.c dans le repertoire courant.
echo efface les anciens fichiers texte
del *.txt
del *.h
del *.hpp
del *.c
del *.cpp
del *.html
del mkdcpp.exe

REM Si on est dans le répertoire de test_unitaire on copie les fichiers à éprouver
if exist ..\Debug\mkdcpp.exe (
	xcopy ..\Debug\mkdcpp.exe . /D
) else ( 
	if exist ..\mkdcpp.exe Xcopy ..\mkdcpp.exe . /D 
)
if exist ..\cpp.c Xcopy ..\cpp.c . /D
if exist ..\mkdcpp.c Xcopy ..\mkdcpp.c . /D

if not exist mkdcpp.exe goto ERR1
if not exist cpp.c goto ERR2
if not exist mkdcpp.c goto ERR3

echo cree le fichier d'entete cpp.h
echo "mkdcpp --t -H cpp.c" doit créer le fichier d'entête cpp.h > cpp.h
echo ----------------------------------------------------------- >> cpp.h
mkdcpp --t -H cpp.c 
type cpp.c.txt >> cpp.h
pause

echo cree l'organigramme de cpp.c et de mkdcpp.c
echo "mkdcpp --ns -O cpp.c" doit créer l'organigramme de cpp.c > cpp.org.txt
echo ------------------------------------------------------------ >> cpp.org.txt
mkdcpp --nst -O cpp.c 
type cpp.c.txt >> cpp.org.txt

echo "mkdcpp --ns -O mkdcpp" doit créer l'organigramme de cpp.c > mkdcpp.org.txt
echo ------------------------------------------------------------ >> mkdcpp.org.txt
mkdcpp --nst -O mkdcpp.c 
type mkdcpp.c.txt >> mkdcpp.org.txt
pause

echo cree la documentation hml en anglais
mkdcpp --t -E mkdcpp.c 
type mkdcpp.c.txt > mkdccpp-en.html
pause

echo cree la documentation hml en français
mkdcpp --t -F mkdcpp.c 
type mkdcpp.c.txt > mkdcpp-fr.html
pause

echo documente la structure de cpp.c et mkdcpp.c
mkdcpp --ns -S cpp.c 
type cpp.c.txt > cpp.struct.txt

mkdcpp --ns -S mkdcpp.c 
type mkdcpp.c.txt > mkdcpp.struct.txt

echo cree la doc programmeurs de cpp.c et mkdcpp.c
mkdcpp --stv -D cpp.c 
type cpp.c.txt > cpp.docu.txt

mkdcpp --stv -D mkdcpp.c 
type mkdcpp.c.txt > mkdcpp.org.txt

echo avec 3 arguments cree les docs texte de cpp.c et mkdcpp.c
echo avec 3 arguments > cpp.3doc.txt
echo ---------------- >> cpp.3doc.txt
mkdcpp --nst cpp.c 
type cpp.c.txt >> cpp.3doc.txt

echo avec 3 arguments > mkdcpp.3doc.txt
echo avec 3 arguments >> mkdcpp.3doc.txt
mkdcpp --nst mkdcpp.c 
type >> mkdcpp.3doc.txt
pause

echo 2 arguments cree les docs texte de cpp.c.txt et mkdcpp.c.txt
mkdcpp cpp.c
mkdcpp mkdcpp.c
echo FIN de ce test
pause
exit

:ERR1
echo mkdcpp.exe absent, not exist.
exit
:ERR2
echo cpp.c absent not, exist.
exit
:ERR3
echo mkdcpp.c absent, not exist.
exit

Shell tests.sh (unix/linux)[modifier | modifier le wikicode]

Ce fichier est à copier dans le répertoire des tests, sous-répertoire des sources.
# !/bin/sh
# TITLE TESTS.SH

# **********************************************************************************
# tests.sh R 200108
# mkdcpp est très simple et n'accepte pas de fichier de destination d'où l'artifice 
# avec les redirections > et >>
# autre solution: utiliser mkd pour créer le fichier .h avec la syntaxe de mkd selon
# les versions de mkd
# **********************************************************************************

clear
pwd

if pwd | grep "mkdcpp/tests"; then 
   echo "Répertoire correct pour les tests";
elif pwd | grep "mkdcpp/ubuntu/tests"; then 
   echo "Répertoire correct pour les tests";
else echo "Ce n'est pas le répertoire des tests"; exit -1;
fi

echo "mise a jour des fichier mkdcpp, cpp.c et mkdcpp.c dans le repertoire courant."
echo "efface les anciens fichiers texte"
rm *.txt
rm *.h
rm *.hpp
rm *.c
rm *.cpp
rm *.html
rm mkdcpp

# Si on est dans le répertoire de test_unitaire on copie les fichiers à éprouver
cp ../mkdcpp .
cp ../*.c .
cp ../*.h .

erreur=0

if test -a mkdcpp; then 
   echo "mkdcpp présent"; 
else 
   echo "mkdcpp absent"; erreur=1; 
fi

# echo $erreur

if test -a cpp.c; then echo "cpp.c présent"; else echo "cpp.c absent"; erreur=1; fi
if test -a  mkdcpp.c; then echo "mkdcpp.c présent"; else echo "mkdcpp.c absent"; erreur=1; fi

if test $erreur -eq 1; then 
   echo "Fichiers absents, vérifier leur présence dans le répertoire ../."; 
   dir ../;
   echo "quitte avec l'erreur: "$erreur;
   exit $erreur;
fi

echo "make the file cpp.h" > cpp.c.header.txt
echo "./mkdcpp --t -H cpp.c create cpp.h content in cpp.c.txt" >> cpp.c.header.txt
echo "-----------------------------------------------------------" >> cpp.c.header.txt
./mkdcpp --t -H cpp.c   #create the file cpp.c.txt 
cat cpp.c.txt > cpp.h  #copy the content in the file cpp.h
cat cpp.c.txt >> cpp.c.header.txt

echo "make organigrams of cpp.c and mkdcpp.c"
echo "./mkdcpp --ns -O cpp.c" create organigram of cpp.c > cpp.org.txt
echo "------------------------------------------------------------" >> cpp.org.txt
./mkdcpp --nst -O cpp.c 
cat cpp.c.txt >> cpp.org.txt

echo "./mkdcpp --ns -O mkdcpp" create organigramme of cpp.c > mkdcpp.org.txt
echo "------------------------------------------------------------" >> mkdcpp.org.txt
./mkdcpp --nst -O mkdcpp.c 
cat mkdcpp.c.txt >> mkdcpp.org.txt

echo "make html documentation in english"
./mkdcpp --t -E mkdcpp.c 
cat mkdcpp.c.txt > mkdccpp-en.html

echo "make html documentation in french"
./mkdcpp --t -F mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp-fr.html

echo "Product the structure documentation from cpp.c and mkdcpp.c"
./mkdcpp --ns -S cpp.c 
cat cpp.c.txt > cpp.struct.txt

./mkdcpp --ns -S mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp.struct.txt

echo "create the programmers doc from cpp.c et mkdcpp.c"
./mkdcpp --stv -D cpp.c 
cat cpp.c.txt > cpp.docu.txt

./mkdcpp --stv -D mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp.docu.txt

echo "with 3 arguments extract the text docs from cpp.c and mkdcpp.c"
echo "avec 3 arguments" > cpp.3doc.txt
echo "----------------" >> cpp.3doc.txt
./mkdcpp --nst cpp.c 
cat cpp.c.txt >> cpp.3doc.txt

echo "avec 3 arguments" > mkdcpp.3doc.txt
echo "avec 3 arguments" >> mkdcpp.3doc.txt
./mkdcpp --nst mkdcpp.c 
cat >> mkdcpp.3doc.txt

echo "with 2 arguments extract the text docs from cpp.c.txt et mkdcpp.c.txt"
./mkdcpp cpp.c
./mkdcpp mkdcpp.c
echo FIN de ce test
sleep 10

echo "quitte avec l'erreur: "$erreur;
exit $erreur;

Shell tests.sh (unix/linux) pour compilation avec mingw sous linux et interface wine[modifier | modifier le wikicode]

Ce fichier est à copier dans le répertoire des tests, sous-répertoire des sources.
# Ce fichier est à copier dans le répertoire des tests, sous-répertoire des sources.

# !/bin/sh
# TITLE TESTS.SH

# **********************************************************************************
# tests.sh R 2021-03-09
# mkdcpp est très simple et n'accepte pas de fichier de destination d'où l'artifice 
# avec les redirections > et >>
# autre solution: utiliser mkd pour créer le fichier .h avec la syntaxe de mkd selon
# les versions de mkd
# **********************************************************************************

clear
if pwd | grep "mkdcpp/tests"; then 
   echo "Répertoire correct pour les tests";
else echo "Ce n'est pas le répertoitre des tests"; exit -1;
fi

echo "mise a jour des fichier mkdcpp, cpp.c et mkdcpp.c dans le repertoire courant."
echo "efface les anciens fichiers texte"
rm *.txt
rm *.h
rm *.hpp
rm *.c
rm *.cpp
rm *.html
rm mkdcpp.exe

# Si on est dans le répertoire de test_unitaire on copie les fichiers à éprouver
cp ../mkdcpp.exe .
cp ../*.c .
cp ../*.h .

erreur=0

if test -a mkdcpp.exe; then 
   echo "mkdcpp.exe présent"; 
else 
   echo "mkdcpp.exe absent"; erreur=1; 
fi

# echo $erreur

if test -a cpp.c; then echo "cpp.c présent"; else echo "cpp.c absent"; erreur=1; fi
if test -a  mkdcpp.c; then echo "mkdcpp.c présent"; else echo "mkdcpp.c absent"; erreur=1; fi

if test $erreur -eq 1; then 
   echo "Fichiers absents, vérifier leur présence dans le répertoire ../."; 
   dir ../;
   echo "quitte avec l'erreur: "$erreur;
   exit $erreur;
fi
sleep 3 # pause de 3 secondes
clear

echo "make the file cpp.h"
sleep 3 # pause de 3 secondes
echo "make the file cpp.h" > cpp.c.header.txt
echo "wine ./mkdcpp.exe --t -H cpp.c create cpp.h content in cpp.c.txt" >> cpp.c.header.txt
echo "-----------------------------------------------------------" >> cpp.c.header.txt
wine ./mkdcpp.exe --t -H cpp.c   #create the file cpp.c.txt 
cat cpp.c.txt > cpp.h  #copy the content in the file cpp.h
cat cpp.c.txt >> cpp.c.header.txt
cat cpp.c.header.txt
sleep 3 # pause de 3 secondes
clear

echo "make organigrams of cpp.c and mkdcpp.c"
sleep 3 # pause de 3 secondes
echo "wine ./mkdcpp.exe --ns -O cpp.c" create organigram of cpp.c > cpp.org.txt
echo "------------------------------------------------------------" >> cpp.org.txt
wine ./mkdcpp.exe --nst -O cpp.c 
cat cpp.c.txt >> cpp.org.txt
sleep 3 # pause de 3 secondes
clear

echo "wine ./mkdcpp.exe --ns -O mkdcpp" create organigramme of cpp.c > mkdcpp.org.txt
echo "------------------------------------------------------------" >> mkdcpp.org.txt
wine ./mkdcpp.exe --nst -O mkdcpp.c 
cat mkdcpp.c.txt >> mkdcpp.org.txt
sleep 3 # pause de 3 secondes
clear

echo "make html documentation in english"
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --t -E mkdcpp.c 
cat mkdcpp.c.txt > mkdccpp-en.html
cat mkdccpp-en.html
sleep 3 # pause de 3 seconde
clear

echo "make html documentation in french"
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --t -F mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp-fr.html
cat mkdcpp-fr.html
sleep 3 # pause de 3 secondes
clear

echo "Product the structure documentation from cpp.c and mkdcpp.c"
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --ns -S cpp.c 
cat cpp.c.txt > cpp.struct.txt
sleep 3 # pause de 3 secondes
clear

wine ./mkdcpp.exe --ns -S mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp.struct.txt
sleep 3 # pause de 3 secondes
clear

echo "create the programmers doc from cpp.c et mkdcpp.c"
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --stv -D cpp.c 
cat cpp.c.txt > cpp.docu.txt
sleep 3 # pause de 3 secondes
clear

wine ./mkdcpp.exe --stv -D mkdcpp.c 
cat mkdcpp.c.txt > mkdcpp.docu.txt
sleep 3 # pause de 3 secondes
clear

echo "with 3 arguments extract the text docs from cpp.c and mkdcpp.c"
echo "avec 3 arguments" > cpp.3doc.txt
echo "----------------" >> cpp.3doc.txt
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --nst cpp.c 
cat cpp.c.txt >> cpp.3doc.txt
clear
catcpp.3doc.txt
sleep 3 # pause de 3 secondes
clear

echo "avec 3 arguments" > mkdcpp.3doc.txt
echo "avec 3 arguments" >> mkdcpp.3doc.txt
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe --nst mkdcpp.c 
cat >> mkdcpp.3doc.txt
clear
cat mkdcpp.3doc.txt
sleep 3 # pause de 3 secondes
clear

echo "avec 2 arguments extract the text docs from cpp.c et mkdcpp.c"
sleep 3 # pause de 3 secondes
wine ./mkdcpp.exe cpp.c
cat cpp.c.txt
wine ./mkdcpp.exe mkdcpp.c
cat mkdcpp.c.txt

echo "FIN de ce test"
sleep 3 # pause de 3 secondes

echo "quitte avec l'erreur: "$erreur;
exit $erreur;

makefile pour mingw-linux[modifier | modifier le wikicode]

# Makefile : build exécutable Windows - compilation impérative
w-exe: mkdcpp.c cpp.c version.h cpp.h system.h lang.h # dépendances de mises à jour
	x86_64-w64-mingw32-gcc -o mkdcpp.exe mkdcpp.c cpp.c

Outils[modifier | modifier le wikicode]

Visual C++
https://apais.developpez.com/tutoriels/c++/visual-cpp-2010-express/
Le package redistribuable Microsoft Visual C++ 2010 installe les composants runtime des bibliothèques Visual C++ nécessaires pour exécuter les applications développées en Visual C++ sur un ordinateur sur lequel Visual C++ 2010 n'est pas installé:  https://www.microsoft.com/fr-fr/download/details.aspx?id=5555
Exemple de contenu d'un répertoire de travail et de test (test du module cpp.c avec mkdcpp.exe) : Utilisateur:Goelette_Cardabela/mkdcpp/Directory_contents
minGW léger (avis)
https://www.sqlpac.com/referentiel/docs/mingw-minimalist-gnu-pour-windows.html
minGW minimalist complet
https://sourceforge.net/projects/mingw/files/
minGW 32 et 64 bits
https://sourceforge.net/projects/mingw-w64/ (Threads POSIX pour les compilations multitâches.)
Macros et fonctions de pthread : https://pubs.opengroup.org/onlinepubs/007904975/basedefs/pthread.h.html

Références[modifier | modifier le wikicode]

  1. https://fr.wikibooks.org/wiki/Mkd_(Extracteur_de_documents)/Ajouter_des_modules