Projet mkd/mkdcpp.c
De Wiki EELL.
Version du 10 janvier 2011 à 11:59 par Eudelo (discuter | contributions)
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 entête pour MSDEV.41 à VC.10
/* * © 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. */ /*P NOM DU FICHIER: version.h PROJET INITIAL: mkd console linux & MSDOS DOSSIER INITIAL : mkdoc3.12 Centre d'Electronique de Montpellier PROGRAMMEUR: JPL DATE: 18/12/2009 MODIFICATIONS: le: 09/01/2011 par JPL objet: Ajouté l'option de compilation pour MSDEV41 le: ../../.. par .............. objet de la modification .... le: ../../.. par .............. objet de la modification .... */ /*E ?C?*/ /**# MKD.C ############################*/ /*H*/ /*U UTILISATEURS */ /*H*/ /*O ORGANIGRAMME */ /*H*/ /*S STRUCTURE */ /*H*/ /*T TESTS */ /*H*/ /*P PROGRAMMEUR */ /*H*/ /*www remarques particulieres */ /*H*/ /**####################################*/ /*H*/ //#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 *************************************************************************************/ /*U*** MKD ******************************************************************** *M name: mkd (make documentation) *U (programme extracteur de documents, Manuel, Organigramme, Structure, *U warnings, points de Test, notes pour la maintenance du Programmeur, etc... ) *M origine: Centre d'Electronique de Montpellier *M Univ. Sciences & Techniques du Languedoc *M 34060 MONTPELLIER CEDEX *P programmeur R3.12: JPLouyot, adr electronique: louyot@obelix.cnusc.fr *P programme R3.12 pour systeme UNIX mkdoc, et version PC IBM mkd.exe *U *U Ce programme range dans un fichier.doc par defaut, ou dans tout fichier *U nomme en dernier parametre: *U avec les options l et p:( CD1,CD2,CD3,CD4,CD5, sont definis dans version.h ) *U -- la ligne COMMENCANT par les caracteres CD1 ou CD2 ou CD3 et suivis par *U un des 5 caracteres donnes en parametre char_codes (avec option l). *U -- la ligne CONTENANT le caractere defini par CD3 suivi par un des 5 *U caracteres donnes en parametre char_codes (avec option l). *U -- les lignes CONTENANT et SUIVANT le caractere defini par CD4 et suivi par *U un des 5 caracteres donnes en parametre char_codes (avec option p) *U JUSQU'A la ligne qui contient le caractere CD5. Attention, si le carac- *U tere CD5 est NL la ligne suivante sera ignoree. *U *U avec les options: A, B, C, F, P, et S: *U le tri est effectue conformement a la definition des commentaires de *U chaque langage, A:Assenbleur, B:Basic, c:C, F:Fortran, P:Pascal, S:Shell *U *U avec char_code = '**' tous les commentaires correspondants aux langages ou *U aux options l et p selectionnes sont copies. *U *U syntaxe de la ligne de commande: *U syntaxe pour pc IBM: *U mkd [-ABCFPSajlnpstvw] char_codes [drive:]path_source [[drive:]path_target] *M syntax for UNIX version: *M mkdoc [-ABCFPSajlnpstvw] char_codes path_source [path_target] *M *M -- path_source : path source file (or project file: option j ) *M -- char_codes : all ASCII *M -- options : -A Assembler source file or similar ( ; -> NL ) *M -B Basic source file or similar (REM or ' -> NL) *M -C C source file, or similar (PROLOG) ( / * -> * / ) *M -F Fortran source file or similar (c,C or * -> NL) *M -P Pascal source file ( {to}, (*to*) ) *M -S Shell files or similar ( # -> NL ' ) *M -a append target file *M -f find langage source file (useful with project file) *M -j if path_source is a project file only *M -l line read line only *M -n insert line number *M -p page read text *M -s screen view *M -t comment only *M -v verbose mode *M -w overwrite target file *M ( default option: overwrite switch off) *M -- path_target : path target file *M *M examples for UNIX version: *M ++++++++++++++++++++++++++ *M mkdoc -Csn '*S' mkdoc3.c verif.struct *M mkdoc -Fst UM version.h /usr/local/docu/mkdoc.docu *M mkdoc -Cst M version.h /usr/local/man/manl/mkdoc.l *M mkdoc -lt '*UM' mkdoc3.c \*.manual with CD1='*' or CD2='*' *M mkdoc -jv '**' mkd_docu.prj (for all comments, sources in prj file) *M mkdoc -pjnv '**' mkd_docu.prj (for all strings, sources in prj file, *M with CD4=CD5='\"') *U exemples pour version PC: *U +++++++++++++++++++++++++ *U mkd -Csn *SOn \mkdoc3.c verif.str (char space:' ' is not available) *U mkd -Fst UM a:version.h c:\man\mkd.doc *U mkd -Fst M a:version.h d:mkd.man *U mkd -lt *UM mkdoc.c *.MAN (for users and manual, with CD1='*', CD2='*') *U mkd -jv ** file.prj (for all comments, sources in project file) *U or mkd -pjnv '**' mkd_docu.prj (for all strings, sources in .prj file, *U with CD4=CD5='"') *U *U Pour l'ASSEMBLEUR utiliser ; avec l'option A *U (ou l'option l avec CD3=';') *U Pour le BASIC (ou BATCH) utiliser ' ou REM avec l'option B *U (ou option l avec CD3='\'') *U Pour le C et PROLOG utiliser / * et * / avec l'option C *U Pour le FORTRAN utiliser C, c, ou * en 1ere colonne avec l'option F *U ( ou option l avec CD1='c' CD2='C' CD3='*' ) *U Pour le PASCAL utiliser les accolades { et } ou (* et *) *U ( ou option p avec CD4='{' et CD5='}' ) *U Pour le CSHELL utiliser # avec l'option S *U ( ou option l avec CD3='#' cas fin de ligne = NL ) *U Pour les fichiers projet avec des sources UNIX: .s .c .i .f .r .p melanges, *U ou .ASM .C .FOR .PAS etc... sources PC, utiliser l'option f (find). *U Pour les commentaires de fichiers POSCRIPT compiler avec CD3='%' ******************************************************************************/ /*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*/
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. //%
cpp.c à compiler de MSDEV.41 à VC.10
/* * © 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.cpp 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: 08/01/2011 par JPL pour essai de compilation avec MSDEV 41 remplacement de bool par char, Compilation correcte sans autre modif 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) : */ /*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*/ char ligne = 0; /*www bool else : char for MSDEV */ /*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_ */
mkdcpp.c à compiler de MSDEV.41 à VC.10
/*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: JPL 11/02/2010 pour la mise à jour sous MS Visual C10 beta 2 DATE: 10 janvier 2010 MODIFICATIONS: Le: 09/01/2011 par JPL objet de la modification compilation avec MSDEV41 pour Windows XP Le: ../../.... par ... objet de la modification .... Le: ../../.... par ... objet de la modification .... */ /*E <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>mkdcpp.exe</title> </head> <body> <h2>mkdcpp.exe </h2> <p>Test program for cpp module and cpp_( ) <br /> mkdcpp.c : Is the entry point for mkdcpp.exe test program</p> <p><a href="#ACTION" target="_self">Action</a><br /> <a href="#SYNTAXE">Syntax</a><br /> <a href="#PORTABILITE">Portability</a><br /> <a href="#RETOUR">Return value</a> <br /> <a href="#DROIT">Copy Right<br /> </a><br /> -----------------------------------------------------------------------------<br /> <a name="ACTION" id="ACTION"></a>ACTION:<br /> cpp_( ) test program. Reads the input parameters on the command line,<br /> verify the validity of the parameters, open the source and destination files,<br /> and transmit parameters to cpp_( ) function. <br /> This program is autotest an can easily be made independant by adding a fifth<br /> parameter at command line for enter the destination filename</p> <p> <a name="SYNTAXE" id="SYNTAXE"></a>SYNTAX:<br /> mkdcpp.exe [--Options(nst)] [-Codes(DHOPSTUw(5 max)] source_file</p> <p> Options :<br /> n : adds the line number in first colomn<br /> s : adds comment at the screen<br /> t : text only.<br /> v: verbose mode</p> <p> Codes : 5 caracters maximum<br /> Usual caracters in common programming:<br /> <strong>D: to generate Documentation file ( functions listing)<br /> H: to generate the header file *.h</strong><br /> O: to generate the organizational file, <i>or adds lines in file</i><br /> P: to generate attentions for the programmers in file, <i>or adds in file</i><br /> S: to generate structures file for control, <i>or adds in file</i><br /> T: to generate tests points file, <i>or adds in file</i><br /> <strong>U, or lang : to generate users documentation (F </strong>for Fr<strong>, E </strong>for En<strong> etc.) </strong><br /> w: to generate warnings on file, <i>or adds in fle</i></p> <p> source_file : <br /> Source file that contains the code in the cpp style C, C++, or php</p> <p> destination file :<br /> The file will be documents will have the same name as the source file which<br /> we add the extension ".txt"</p> <p> <a name="PORTABILITE" id="PORTABILITE"></a>PORTABILITY:<br /> x86-Win32 x64-Win64 (LINUX à vérifier)</p> <p> <a name="RETOUR" id="RETOUR"></a>RETURN VALUE:<br /> 0 en cas de réussite<br /> -1 on syntax error<br /> -2 on open or close file error </p> <p> <a name="DROIT" id="DROIT"></a>COPY RIGHT:<br /> © EELL, Editeurs Européens de Logiciels Libres, 20074<br /> Association à but non lucratif selon l'Article 11 de la convention <br /> européenne des droits de l'homme.<br /> <br /> Concédée sous licence EUPL, version 1.1 ou – dès leur approbation par la <br /> Commission européenne - versions ultérieures de l’EUPL (la «Licence»).<br /> Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.<br /> Vous pouvez obtenir une copie de la Licence à l’adresse suivante:<br /> <br /> <a href="http://ec.europa.eu/idabc/en/document/7774.html">Licence EUPL FR (pdf)</a><br /> <a href="En : http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979">Licence EUPL EN (pdf)</a><br /> <a href="http://ec.europa.eu/idabc/en/document/7774.html">Licence EUPL 1.1 in other lang.</a><br /> <br /> Sauf obligation légale ou contractuelle écrite, le logiciel distribué <br /> sous la Licence est distribué «en l’état»,<br /> SANS GARANTIES OU CONDITIONS QUELLES QU’ELLES SOIENT, <br /> expresses ou implicites.<br /> Consultez la Licence pour les autorisations et les restrictions <br /> linguistiques spécifiques relevant de la Licence.<br /> <br /> </p> <p></p> </body> </html> */ /*F <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>mkdcpp.exe</title> </head> <body> <h2>mkdcpp.exe </h2> <p>Programme de test unitaire du module cpp, fonction cpp_( ) <br /> mkdcpp.c : Est le point d'entrée du programme de test (mkdcpp.exe)</p> <p><a href="#ACTION" target="_self">Action</a><br /> <a href="#SYNTAXE">Syntaxe</a><br /> <a href="#PORTABILITE">Portabilité</a><br /> <a href="#RETOUR">Valeur retournée</a> <br /> <a href="#DROIT">Droit de copie<br /> </a><br /> -----------------------------------------------------------------------------<br /> <a name="ACTION" id="ACTION"></a>ACTION:<br /> Programme d'épreuve de la fonction cpp_( ). lit les paramètres entrés en<br /> ligne de commande, vérifie la validité des paramètres, ouvre les fichiers<br /> source et destination puis les transmet à la fonction cpp_( ).<br /> Ce programme est auto éprouvé et peut être facilement rendu autonome en<br /> ajoutant un cinquième paramètre à la ligne de commande pour entrer le nom<br /> du fichier destinataire.</p> <p> <a name="SYNTAXE" id="SYNTAXE"></a>SYNTAXE:<br /> mkdcpp.exe [--Options(nst)] [-Codes(DHOPSTUw(5 max)] fichier_source</p> <p> Options :<br /> n : numéro de ligne (ajoute le numéro de ligne en 1ère colonne)<br /> s : écran (screen) (ajoute le commentaire à l'écran)<br /> t : texte seul (ne copie pas les caractères de 'Codes')<br /> v : mode bavard</p> <p> Codes : 5 caractères maximum<br /> Caractères usuels en programmation:<br /> D: pour la documentation générale sur les fonctions (listing)<br /> H: pour générer le fichier d'entête .h<br /> O: pour l'organigramme<br /> P: à l'attention des programmeurs<br /> S: pour le contrôle de la structure du programme<br /> T: pour les points de tests<br /> U: pour la documentation utilisateur<br /> w: pour Attention (warning)</p> <p> fichier_source : <br /> fichier qui contient le code en style de commentaire C++ ou php</p> <p> fichier destinataire :<br /> Le fichier qui sera documenté aura le même nom que le fichier source <br /> auquel on aura ajouté l'extension '.txt'</p> <p> <a name="PORTABILITE" id="PORTABILITE"></a>PORTABILITE:<br /> x86-Win32 x64-Win64 (LINUX à vérifier)</p> <p> <a name="RETOUR" id="RETOUR"></a>VALEUR RETOURNEE:<br /> 0 en cas de réussite<br /> -1 en cas d'erreur de syntaxe<br /> -2 en cas d'erreur d'ouverture ou de fermeture de fichier</p> <p> <a name="DROIT" id="DROIT"></a>DROIT DE COPIE:<br /> © EELL, Editeurs Européens de Logiciels Libres, 20074<br /> Association à but non lucratif selon l'Article 11 de la convention <br /> européenne des droits de l'homme.<br /> <br /> Concédée sous licence EUPL, version 1.1 ou – dès leur approbation par la <br /> Commission européenne - versions ultérieures de l’EUPL (la «Licence»).<br /> Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.<br /> Vous pouvez obtenir une copie de la Licence à l’adresse suivante:<br /> <br /> http://ec.europa.eu/idabc/eupl5<br /> <br /> Sauf obligation légale ou contractuelle écrite, le logiciel distribué <br /> sous la Licence est distribué «en l’état»,<br /> SANS GARANTIES OU CONDITIONS QUELLES QU’ELLES SOIENT, expresses ou <br /> implicites.<br /> Consultez la Licence pour les autorisations et les restrictions <br /> linguistiques spécifiques relevant de la Licence.<br /> <br /> </p> <p></p> </body> </html> */ //#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 */
Shell tests.bat
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