Projet mkd/shell.c
De Wiki EELL.
Retour aux fichiers en développement →
Sommaire |
Fichiers de la fonction shell_()
Ce programme copie les commentaires des lignes contenant le caractère # suivi par un des caractères 'Codes' entrés en paramètre. Si le caractère '#' est précédé de \ ou si il est intégré dans une chaîne, alors il n'est pas considéré comme début de commentaire.
shell.c, shell.cc, shell.inc.cc
/*P
FILE NAME: shell.c for konsole shell.cc for individual compilation in
c++ or shell.inc.cc to include file in sources files with gtkmm
PROJECT: mkd
mkd is a UNIX command to extract pre-encoded comments lines to generate the
software documentation according to ISO standards.
mkd is the abbreviation of make documentation. This command was originally
known under the name mkdoc (make documentation).
This command is not integrated into the standard distributions of Unix / Linux
INITIAL PROJECT:
mkdoc 1989 for MS-DOS and UNIX now obsolete. CEM - University of Montpellier II
ADMINISTRATIVE RECORD:
extractdoc 04/12/2009
FILE UPDATE:
Date: ../../1986 by JPL Initial programming for MSDOS and UNIX on SUN
Date: 09/06/1989 by JPL
Date: 03/01/1991 by JPL mkdoc 3.11 for PC and UNIX
Date: ../../1991 by JPL mkdoc 3.12 for PC and UNIX
Date: 09/05/2013 by Clara for mkd 13.05 alpha
*/
// Date: ../../.... by ... purpose of the modification ....
/*T
FILE NAME: shell.c for konsole shell.cc for individual compilation in
c++ or shell.inc.cc to include file in sources files with gtkmm
Directives de tests unitaires version alpha 2013
Généralités pour tous les modules.
-------------------------------------------------
Vérifiez les options n, s et t séparément:
Vérifiez que la numérotation des lignes est correcte dans tous les cas de
décodage (lignes et blocs). n, ns. nt, nst.
Vérifiez que le texte reste à la bonne place dans tous les cas de décodage:
toute la ligne (dans la cas de la directive de compilation FULL_LINE), ou
texte seul.
-- Vérifiez que les tabulations sont bien prises en charge dans tous les
cas, décodage des lignes et des blocs.
-- Vérifiez de même pour les espaces.
La fonction doit être éprouvée de telle sorte qu'un commentaire qui se
termine par le caractère de fin de fichier soit entièrement copié dans le
fichier cible.
Le caractère de fin de fichier décodé avant le(les) caractère(s) de fin de
commentaire doit être remplacé par un caractère de fin de ligne 0x0A. Noter
que le caractère 0x0A précédant EOF est considéré comme fin de ligne.
Le caractère de fin de fichier (EOF 0xFF) NE DOIT JAMAIS APPARAÎTRE DANS LE
TEXTE DU FICHIER CIBLE.
Ceci provoquait un bug dans la version Alpha de l'application fenêtrée
mkdbasicw à l'étape du test d'intégration.
Vérifiez que l'extraction de tous les commentaires avec pour code de
décodage '**' soient copiés et que ceux-ci soient à la bonne place.
*/
/*D
function shell_
-----------------------------------------------------------------------------
FILE NAME: shell.c for konsole shell.cc for individual compilation in
c++ or shell.inc.cc to include file in sources files with gtkmm
FUNTION NAME:
shell_
SYNOPSIS, SYNTAX:
#include "/usr/include/mkd/version.h" // IMPORTANT: Compilation directives
#include "/usr/include/mkd/shell.h" // or mkd.h
int shell_(FILE * pfdoc, FILE * pnfile);
FILE * pfdoc: pointer of the target stream opened by the calling function
FILE * pnfile: pointer of the source stream opened by the calling function
ACTION, DESCRIPTION:
The shell_ function reads the source file (pnfile) transmitted from the
calling function, and decodes the comments pre-encoded in lines or
blocks. and then writing this comments to a target file (pfdoc).
Pre-coded characters are defined in a external global table 'Codes';
The golbal variables are 'Codes' and 'Options'.
The 'Codes': table of 5 characters:
extern char codes[];
They must be defined in the calling function:
char codes[5] = {0,0,0,0,0};
The 'Options': n,s,t,v:
extern unsigned char n,s,t;
They must be defined in the calling function:
unsigned char n=0,s=0,t=0;
With the options:
-n: The transcript is preceded by line number. This allows to easily
reach the commented line.
-s: Add the comment to the stdout to use shell redirections > , >> ,
or ||.
-t: With the t option only the commented text is extracted.
Without the t option the entire line or block is copied.
The t option permit to generate directly exploitable and publishable
documents.
Remarks:
Ce programme copie les commentaires des lignes contenant le caractère #
suivi par un des caractères 'Codes' entrés en paramètre. Si le caractère
'#' est précédé de \ ou si il est intégré dans une chaîne, alors il n'est
pas considéré comme début de commentaire.
CONFORMING TO:
POSIX, ANSI C, BSD, ISO/IEC 9899:2011; gcc, MS-Vc10; UTF-8.
PORTABILITY,
LINUX-Debian-systems, LINUX-Red-Hat, UNIX, gcc.
Microsoft Visual studio under Windows : x86(Win32) x64(Win32 and WIN64)
RETURN VALUE:
Nothing.
COPYRIGHT:
© EELL, Éditeurs Européens de Logiciels Libres, EUPL 2007.
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 œuvre 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.
La Licence est totalement compatible avec la licence GNU.
AUTHORS:
© Contact: http://edeulo.free.fr/contacts/formmail.php
Designer: intial JP Louyot (JPL)
Updates : JPL and Clara Jimenez
Translations: Alizée, Clara, Luca, JPL, JPT, Martine
RESSOURCES:
gtkmm with mkdw future widowed version.
NOTES:
Update May 2013
BUGS:
See bugs reports http://edeulo.free.fr/phpBB3
SEE ALSO MANUAL:
Man(3) attached in English.
Command line : man 3 shell_
*/
/*H
// File: shell.c (Comments for UTF-8 text editor)
void shell_ (FILE * pfdoc, FILE * pnfile);
*/
#include "version.h"
#include "shell.h"
void shell_ (FILE * pfdoc, FILE * pnfile)
//O FILE * pfdoc: pointer of the target stream opened by the calling function
//O FILE * pnfile: pointer of the source stream opened by the calling function
{ /*S shell */
extern unsigned char n,s,t;
extern char codes[];
unsigned int i,tab;
unsigned int num;
long ll,nl,lc;
register int c1;
int c2;
num = 0;
c1 = c2 = STX; /* Start Text */
/*O tant que pas fin de fichier source */
while ( c1 != EOF && c2 != EOF )
{ /*S tq !EOF */
/*O si début de texte faire c1=LF */
if (c1==STX) c1='\n';
/*O sinon prendre pour c1 le char suivant */
else c1=getc(pnfile);
if (c1==EOF) break;
/*O si le char est NL repérer la position qui suit 'NL' dans nl */
if(c1=='\n')
{ /*S*/
num++;
nl=ftell(pnfile);
tab=0;
} /*S*/
else
{ /*S !NL */
/*O si le char est '\t' incrémenter tab */
if (c1=='\t')tab++;
/*O sinon si le char est '\"' */
else if (c1=='\"')
/*O alors aller jusqu'au prochain '\"' */
{ /*S string */
/*O tant que le caractère suivant n'est pas " */
while ((c1=getc(pnfile))!='\"')
{ /*S*/
/*O si le char est EOF quitter la boucle */
if (c1==EOF)break;
} /*S*/
} /*S string */
/*O sinon si le char est bakslatch: */
else if (c1=='\\')
/*O alors: */
{ /*S*/
/*O si le char suivant est # : */
if((c1=getc(pnfile))=='#')
/*O alors simuler un espace */
c1=' ';
/*O sinon revenir en arrière */
else
{ /*S*/
ungetc(c1,pnfile);
c1='\\';
} /*S*/
} /*S*/
/*O si le char est '#' */
if (c1=='#')
/*O alors: */
{ /*S char = # */
/*O si codes[0]=0 (all chars) ou si suivi par c2 (char code utilisateur) */
c2=getc(pnfile);
if ( codes[0] == 0 ||
c2 == codes[0] ||
c2 == codes[1] ||
c2 == codes[2] ||
c2 == codes[3] ||
c2 == codes[4]
)
/*O alors: */
{ /*S comment*/
/*O repérer la position commentaire */
//w ungetc(c2,pnfile);
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 se positionner en dédut de ligne */
fseek(pnfile,nl,0);
/*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
/*O si pas option t */
if(!t)
{ /*S*/
/*O copier toute la ligne tq pas LF, dans le fichier doc */
while ( (c1=getc(pnfile)) != '\n' && c1 !=EOF)
{ /*S*/
putc(c1,pfdoc);
if(s)putch(c1);
} /*S*/
if (c1==EOF) break;
} /*S*/
/*O sinon: */
if(t) /*P option t */
{ /*S t */
/*O copier le début de ligne avec des tabulations et des espaces */
for(lc=nl;lc<ll;lc++)
{ /*S first */
c1=getc(pnfile);
if (c1==EOF) break;
//if(t)
{ /*S t */
if (c1=='\t')
{
putc('\t',pfdoc); // tab to target
if(s)putch('\t'); // tab to stdout
}
else
{
putc(' ',pfdoc); // blank to target
if(s)putch(' '); // blank to stdout
}
} /*S t */
} /*S first */
/*O copier la suite du commentaire jusqu'à la nouvelle ligne */
while ( (c1=getc(pnfile)) != '\n' && c1!=EOF )
{ /*S*/
/*O copier le commentaire ( y compris '\r' sous DOS ) */
{
putc(c1,pfdoc);
if(s)putch(c1);
}
} /*S*/
if(c1==EOF) break;
} /*S*/
putc( c1, pfdoc); // c1=NL
if(s) putch( c1 ); // copier NL */
ungetc(c1,pnfile); // revenir sur NL
} /*S comment */
/*O sinon: */
else
{
ungetc(c2,pnfile);
}
} /*S char = # */
} /*S cas lignes */
} /*S !NL */
} /*S tq !EOF */
Fichier de commande des tests
MAKE_Tests_U, CLEAN_Tests_U
- MAKE_Tests_U
#!/bin/bash
#O ../../mkd tests under Linux.
#O Epreuve de vérification de la fonction cpp_() avec ../../mkd
#O Copy Test_cpp_U.cc in target created file
cat MAKE_Tests_cpp_U > Tests_cpp_U.tstshell
#O Test options -nstv with source "MAKE_Tests_cpp_U" and target "*.tstshell"
#O - and screen redirection to tstshell.screen
#O 1: Test de l'option -s append target
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "1: Test de l'option -s append target" >> Tests_cpp_U.tstshell
../../mkd -savS O MAKE_Tests_cpp_U *.tstshell > tstshell.screen
#O 1: Test option -t
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "1: Test option -t" >> Tests_cpp_U.tstshell
../../mkd -tavS O MAKE_Tests_cpp_U *.tstshell # >> tstshell.screen
#O 1: Test option -n, with append files target and screen
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "1: Test option -n, with append files target and screen" >> Tests_cpp_U.tstshell
../../mkd -navS O MAKE_Tests_cpp_U *.tstshell # >> tstshell.screen
#O 2: Test options -ns, with append files target and screen
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "2: Test options -ns, with append files target and screen" >> Tests_cpp_U.tstshell
../../mkd -nsavS O MAKE_Tests_cpp_U *.tstshell >> tstshell.screen
#O 2: Test options -nt, with append files target and screen
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "2: Test options -nt, with append files target and screen" >> Tests_cpp_U.tstshell
../../mkd -ntavS O MAKE_Tests_cpp_U *.tstshell >> tstshell.screen
#O 2: Test options -nst, with append files target and screen
echo "------------------------------------------------------------------" >> Tests_cpp_U.tstshell
echo "2: Test options -nst, with append files target and screen" >> Tests_cpp_U.tstshell
../../mkd -nstavS O MAKE_Tests_cpp_U *.tstshell >> tstshell.screen
#O 5: Independant test with -nstv "Test_cpp_U.cc" and target "*.tstshelllastline"
../../mkd -nstvwS T MAKE_Tests_cpp_U tstshelllastline > tstshelllastline.screen
#O 5: Independant test with -nstv "Test_cpp_U.c2" and target file "*.tstshelllastline"
../../mkd -nsvaS '**' MAKE_Tests_cpp_U tstshelllastline >> tstshelllastline.screen
#O Break with gedit "Tests_cpp_U.tstshell", "tstshell.screen"
gedit Tests_cpp_U.tstshell tstshell.screen tstshelllastline tstshelllastline.screen
#T test tab and lastline
- CLEAN_Tests_U
#!/bin/dash
#O File Tests_Clean
#O Force delete files created with mkd "tests" under Linux.
rm -f Tests_cpp_U.tstshell
rm -f tstshell.screen
rm -f tstshelllastline
rm -f tstshelllastline.screen
rm -f *.doc
Analyse des tests Konsole
Analysis 2013-05-09
Fichier Analysis texte UTF-8
Analyse du : 9 mai 2013 par Clara pour le retour à la conception détaillée.
-------------------------------------------------------------------------------
Résultats du test unitaire de la fonction shell_() du fichier shell.c intégrée
à la commande mkd 2013 alpha 05
.
Ce test est effectué avec la version mkd 2013 alpha pour évaluer les
modifications à effectuer dans la version alpha 2013.
.
D'après les directives et les fichiers d'analyse Tests_cpp_U.tstshell,
tstshell.screen, tstshelllastline et tstshelllastline.screen
.
Directives de tests unitaires version alpha 2013:
-------------------------------------------------
1: Vérifiez les options n, s et t séparément:
- les essais séparés fonctionnent correctement et sont conformes
.
2: Vérifiez que la numérotation des lignes est correcte dans tous les cas de
décodage des lignes. n, ns. nt, nst.
- Les essais réalisés ont été conformes
.
3: Vérifiez que le texte reste à la bonne place dans tous les cas de décodage:
toute la ligne (dans la cas de la directive de compilation FULL_LINE), ou
texte seul.
- Le résultat est conforme (Sans de numérotation des lignes)
.
4: -- Vérifiez que les tabulations sont bien prises en charge dans tous les
cas d'extraction des lignes.
-- Vérifiez de même pour les espaces.
- Les résultas sont conformes. Il est à noter que les tabulations créent un
décalage du texte avec l'option -n numéroation
.
5: La fonction doit être éprouvée de telle sorte qu'un commentaire qui se
termine par le caractère de fin de fichier soit entièrement copié dans le
fichier cible.
Le caractère de fin de fichier décodé avant le(les) caractère(s) de fin de
commentaire doit être remplacé par un caractère de fin de ligne 0xOA.
- Le fichier tstshelllastline commentaire ligne; fait apparaître
une fin de fichier conforme.
.
6: Le caractère de fin de fichier (EOF) NE DOIT JAMAIS APPARAÎTRE DANS LE
TEXTE DU FICHIER CIBLE.
Ceci provoquait un bug dans la version Alpha de l'application fenêtrée
mkdcppw à l'étape du test d'intégration.
- La réponse est incluse dans les tests 5:
- Nous avons constaté que EOF est précédé du caractère OxOA (New Line)
- Tous les caractères sont recopiés octets par octets. La commande mkd
ignore le format du texte recopié. Il n'en est pas de même pour mkdcppw
qui ne reconnaît que les caractères UTF-8 nécessaires à l'impression.
.
7: La fin de fichier a été testée avec les codes '**' et le caractère 0xOA
précède bien la fin du fichier sans retour à la ligne.
Le caractère # à l'itérieur d'une chaîne de caractères n'est pas interprété
comme un début de commentaire conformémént aux directives.
De même,\#T n'est pas interprété par mkd comme étant un commentaire shell.
Fichier source des tests
MAKE_Tests_cpp_U
#!/bin/bash
#O ../../mkd tests under Linux.
#O Epreuve de vérification de la fonction cpp_() avec ../../mkd
#O Copy Test_cpp_U.cc in target created file
cat Test_cpp_U.cc > Test_cpp_U.tstcpp
#O Test options -nstv with source "Test_cpp_U.cc" and target "*.tstcpp"
#O - and screen redirection to tstcpp.screen
#O 1: Test de l'option -s append target
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "1: Test de l'option -s append target" >> Test_cpp_U.tstcpp
../../mkd -savC T Test_cpp_U.cc *.tstcpp > tstcpp.screen
#O 1: Test option -t
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "1: Test option -t" >> Test_cpp_U.tstcpp
../../mkd -tavC T Test_cpp_U.cc *.tstcpp # >> tstcpp.screen
#O 1: Test option -n, with append files target and screen
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "1: Test option -n, with append files target and screen" >> Test_cpp_U.tstcpp
../../mkd -navC T Test_cpp_U.cc *.tstcpp # >> tstcpp.screen
#O 2: Test options -ns, with append files target and screen
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "2: Test options -ns, with append files target and screen" >> Test_cpp_U.tstcpp
../../mkd -nsavC T Test_cpp_U.cc *.tstcpp >> tstcpp.screen
#O 2: Test options -nt, with append files target and screen
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "2: Test options -nt, with append files target and screen" >> Test_cpp_U.tstcpp
../../mkd -ntavC T Test_cpp_U.cc *.tstcpp >> tstcpp.screen
#O 2: Test options -nst, with append files target and screen
echo "------------------------------------------------------------------" >> Test_cpp_U.tstcpp
echo "2: Test options -nst, with append files target and screen" >> Test_cpp_U.tstcpp
../../mkd -nstavC T Test_cpp_U.cc *.tstcpp >> tstcpp.screen
#O 5: Independant test with -nstv "Test_cpp_U.cc" and target "*.tstcpplastline1"
../../mkd -nstvwC S Test_cpp_U.cc *.tstcpplastline1 > tstcpplastline.screen1
#O 5: Independant test with -nstv "Test_cpp_U.c2" and target file "*.tstcpplastline2"
../../mkd -nstvwC T Test_cpp_U.c2 *.tstcpplastblock > tstcpplastblock.screen2 #w bug ?
#O 5: Independant test with -nstv "Test_cpp_U.c3" and target file "*.tstcpplastline2"
../../mkd -nstvaC T Test_cpp_U.c3 *.tstcpplastblock >> tstcpplastblock.screen2 #w bug ?
#O 5: Independant test with -nstv "Test_cpp_U.c4" and target file "*.tstcpplastline2"
../../mkd -nstvaC T Test_cpp_U.c4 *.tstcpplastblock >> tstcpplastblock.screen2 #w bug ?
#O Break with gedit "Test_cpp_U.tstcpp", "tstcpp.screen"
gedit Test_cpp_U.tstcpp tstcpp.screen Test_cpp_U.tstcpplastline1 tstcpplastline.screen1 Test_cpp_U.tstcpplastblock tstcpplastblock.screen2
"#T chaîne " #T "#T" n'est pas reconnu comme un commentaire
\#T n'est pas interprété comme étant un commentaire par mkd
#TTest 2 tabs and lastline without NL

