Projet mkd/cpp.c
De Wiki EELL.
(Différences entre les versions)
JPL (discuter | contributions) m (Mise à jour) |
JPL (discuter | contributions) m (Mise à jour) |
||
| Ligne 1 : | Ligne 1 : | ||
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | <small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</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. | + | 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_ */

