Projet mkd/tri.c

De Wiki EELL.

(Différences entre les versions)
m
m (Fichiers de la fonction tri() : Mise à jour)
 
(9 versions intermédiaires masquées)
Ligne 1 : Ligne 1 :
-
{{Modèle:Pas fini/autre}}
+
<!-- {{Modèle:Pas fini/autre}} -->
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
-
: tri.inc.c : Ce fichier n'est pas indépendant, il est à revoir !
 
-
<pre>
 
-
/*E �C�*/
 
-
/** #########################################
 
-
    #                  TRI                  #
 
-
    ######################################### */
 
-
/* maj 09/06/89 */
 
-
/*P maj R3.11 09/01/91 par JPL */
 
-
/**
+
== Fichiers de la fonction tri() ==
-
Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
+
 
-
metres CD1 CD2 CD3 CD4 CD5 compiles.
+
<pre style = "color:blue">
-
avec l'option l (copie de ligne):
+
  Remarks: (1991)
-
CD1 et CD2 sont des caracteres debut de commentaires a placer en debut de
+
  Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
-
ligne comme en FORTRAN: c ou C ou * .
+
  mètres CD1 CD2 CD3 CD4 CD5 compiles.
-
CD3 est un caractere debut de commentaire que l'on peut placer en tout point
+
  avec l'option l (copie de ligne):
-
d'une ligne comme ; en assembleur, # en shell ou % en postcript.
+
  CD1 et CD2 sont des caractères début de commentaires a placer en début de
-
Cette fonction permet des tris differents de SHELL_.C vu qu'elle ignore si
+
  ligne comme en FORTRAN: c ou C ou * .
-
# est dans une chaine ou si elle est precedee du char \ .
+
  CD3 est un caractère début de commentaire que l'on peut placer en tout point
-
avec l'option p (copie de page ):
+
  d'une ligne comme ; en assembleur, # en shell ou % en PostScript.
-
CD4 est le caractere de debut du commentaire et CD5 est la fin du commentaire
+
  Cette fonction permet des tris différents de SHELL_.C vu qu'elle ignore si
-
comme en PASCAL : CD4={ et CD5=} . CD4=CD5=" peut a la rigueur permettre
+
  # est dans une chaîne ou si elle est précédée du char \ .
-
d'extraire des chaines de caracteres afin d'editer un dictionnaire syntaxique
+
  avec l'option p (copie de page ):
-
toutefois " etant a la fois debut et fin de caractere le resultat n'est pas
+
  CD4 est le caractère de début du commentaire et CD5 est la fin du commentaire
-
assure.
+
  comme en PASCAL : CD4={ et CD5=} . CD4=CD5=" peut a la rigueur permettre
 +
  d'extraire des chaînes de caractères afin d’éditer un dictionnaire syntaxique
 +
  toutefois " étant a la fois début et fin de caractère le résultat n'est pas
 +
  assuré.
 +
</pre>
 +
 
 +
{{Boîte déroulante/début|titre=tri.h, tri.c, tri.cc, tri.inc.c ; Updated 2013-05-11}}
 +
* Header tri.h
 +
<pre style="color:orange">
 +
   
 +
// File: tri.c
 +
void tri_ (FILE * pfdoc, FILE * pnfile);
 +
 
 +
</pre>
 +
 
 +
* File tri.c
 +
<pre style="color:red">
 +
/*P
 +
FILE NAME: tri.c for konsole tri.cc for individual compilation in
 +
  c++ or tri.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 Update mkdoc 3.09
 +
Date: 09/01/1991 by JPL mkdoc 3.11 for PC and UNIX
 +
Date: 10/05/2013 by GC Update for mkd 2013
 +
 
*/
*/
 +
// Date: ../../.... by ... purpose of the modification ....
 +
 +
/*T
 +
FILE NAME: tri.c for konsole tri.cc for individual compilation in
 +
  c++ or tri.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 tri_
 +
-----------------------------------------------------------------------------
 +
FILE NAME: tri.c for konsole tri.cc for individual compilation in
 +
  c++ or tri.inc.cc to include file in sources files with gtkmm
 +
 +
FUNTION NAME:
 +
  tri_
 +
 +
SYNOPSIS, SYNTAX:
 +
  #include "/usr/include/mkd/version.h" // IMPORTANT: Compilation directives
 +
  #include "/usr/include/mkd/tri.h"    // or mkd.h
 +
  int tri_(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 tri_ 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: (1991)
 +
  Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
 +
  mètres CD1 CD2 CD3 CD4 CD5 compiles.
 +
  avec l'option l (copie de ligne):
 +
  CD1 et CD2 sont des caractères début de commentaires a placer en début de
 +
  ligne comme en FORTRAN: c ou C ou * .
 +
  CD3 est un caractère début de commentaire que l'on peut placer en tout point
 +
  d'une ligne comme ; en assembleur, # en shell ou % en PostScript.
 +
  Cette fonction permet des tris différents de SHELL_.C vu qu'elle ignore si
 +
  # est dans une chaîne ou si elle est précédée du char \ .
 +
  avec l'option p (copie de page ):
 +
  CD4 est le caractère de début du commentaire et CD5 est la fin du commentaire
 +
  comme en PASCAL : CD4={ et CD5=} . CD4=CD5=" peut a la rigueur permettre
 +
  d'extraire des chaînes de caractères afin d’éditer un dictionnaire syntaxique
 +
  toutefois " étant a la fois début et fin de caractère le résultat n'est pas
 +
  assuré.
 +
 +
   
 +
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 April 2013
 +
 +
BUGS:
 +
  See bugs reports http://edeulo.free.fr/phpBB3
 +
 +
SEE ALSO MANUAL:
 +
  Man(3) attached in English.
 +
  Command line : man 3 tri_
 +
 +
*/
 +
 +
/*H 
 +
// File: tri.c
 +
void tri_ (FILE * pfdoc, FILE * pnfile);
 +
*/
 +
</pre>
 +
<pre style="color:blue">
 +
#include "version.h"
 +
#include "tri.h"
void tri_(FILE * pfdoc, FILE * pnfile)
void tri_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
// FILE *pfdoc, *pnfile;
     { /*S tri */
     { /*S tri */
-
    extern unsigned char l,p,s,t;
+
        extern unsigned char l,p,n,s,t;
-
    extern char codes[];
+
        extern char codes[];
-
    unsigned int i,tabl,tabp;
+
        unsigned int i,tabl,tabp;
-
    unsigned int num;
+
        unsigned int num;
-
    long ll,nl;
+
        long lc,ll,nl;
-
    register int c1;
+
        register int c1;
-
    int c2,c3;
+
        int c2,c3;
-
    num = 0;
+
        num = 0;
-
    c1 = c2 = c3 = STX; /* Start Text */
+
        c1 = c2 = c3 = STX; /* Start Text */
/*O    tant que pas fin de fichier source */
/*O    tant que pas fin de fichier source */
         while ( c1 != EOF && c2 != EOF && c3 != EOF )
         while ( c1 != EOF && c2 != EOF && c3 != EOF )
         { /*S tq !EOF */
         { /*S tq !EOF */
-
/*O      si debut de texte faire c1=LF */
+
/*O      si début de texte faire c1=LF */
           if (c1==STX) c1='\n';
           if (c1==STX) c1='\n';
-
/*O      sinon prendre pour c1 le char suivant */
+
/*O      sinon prendre pour c1 le caractère suivant */
           else c1=getc(pnfile);
           else c1=getc(pnfile);
/*O      si le char est NL reperer la position suivant NL dans nl */
/*O      si le char est NL reperer la position suivant NL dans nl */
Ligne 61 : Ligne 243 :
           { /*S cas lignes */
           { /*S cas lignes */
-
/*O--------- si le char est NL ---------------------------------------------*/
+
/*O--------- si le caractère est NL -----------------------------------------*/
 +
 
               if (c1=='\n')
               if (c1=='\n')
               { /*S colonne 1 */
               { /*S colonne 1 */
-
/*O         si suivi par c2 = CD1 ou CD2 ou CD3
+
/*O             suivi par c2 = CD1 ou CD2 ou CD3
-
                 et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */
+
                 et si codes[0]=0 ou si suivi par un des 5 codes d'extraction */
-
              c2 = getc(pnfile);
+
                c2 = getc(pnfile);
-
              c3 = getc(pnfile);
+
                if (c2==EOF) {ungetc(c2,pnfile);break;}
-
              if( (c2 == CD1 ||
+
                c3 = getc(pnfile);
-
                  c2 == CD2 ||
+
                if (c3==EOF) {ungetc(c3,pnfile);break;}
-
                  c2 == CD3
+
                if( (c2 == CD1 ||
-
                  )
+
                      c2 == CD2 ||
-
                  &&
+
                      c2 == CD3
-
                  (!codes[0]||
+
                    )
-
                  c3 == codes[0] ||
+
                    &&
-
                  c3 == codes[1] ||
+
                    (!codes[0]||
-
                  c3 == codes[2] ||
+
                      c3 == codes[0] ||
-
                  c3 == codes[3] ||
+
                      c3 == codes[1] ||
-
                  c3 == codes[4]
+
                      c3 == codes[2] ||
-
                  )
+
                      c3 == codes[3] ||
-
                )
+
                      c3 == codes[4]
-
 
+
                    )
-
/*O         alors copier les caracteres dans le fichier doc, et si opt s a l'ecran: */
+
                  )
-
                 { /*S*/
+
/*O             alors copier les caractères dans le fichier cible,
-
/*O             si option n ins‚rer le num‚ro de ligne  */
+
                  et si option s vraie copier à la sortie standard. */
-
                if(n)
+
                 { /*S copier la ligne */
-
                { /*S*/
+
/* O               si il n'y a pas de code revenir un caractère en arrière */
-
                    fprintf( pfdoc ,"%5d ", num );
+
//                   if (!codes[0]) ungetc(c3,pnfile);
-
                    if(s) printf( "%5d ", num );
+
/*O               si option n insérer le numéro de ligne  */
-
                } /*S*/
+
                    if(n)
-
/*O             si pas option t */
+
-
                if(!t)
+
                     { /*S*/
                     { /*S*/
-
/*O                copier le debut de ligne */
+
                      fprintf( pfdoc ,"%5d ", num );
-
                    putc (c2,pfdoc); putc(c3,pfdoc);
+
                      if(s) printf( "%5d ", num );
-
                    if(s)
+
                    } /*S*/
 +
/*O                si pas option t */
 +
                    if(!t)
 +
                    { /*S !t */
 +
/*O                  copier le début de ligne */
 +
                      putc (c2,pfdoc); // c1 = LF
 +
                      putc(c3,pfdoc);
 +
                      if(s)
                       { /*S si opt s */
                       { /*S si opt s */
-
                      putch(c2);putch(c3);
+
                          putch(c2);putch(c3);
                       } /*S si opt s */
                       } /*S si opt s */
-
                     } /*S*/
+
                     } /*S !t */
-
                  else if(!codes[0])ungetc(c3,pnfile);
+
/*O                sinon, option t vraie */                   
 +
                    else
 +
                    { /*S t */
 +
/*O                  remplacer le début de ligne  par des espaces */
 +
                      putc(' ',pfdoc); // remplace c2
 +
                      if(s)putch(' ');
 +
/*O                  si il n'y a pas de code revenir un caractère en arrière */
 +
                      if (!codes[0]) ungetc(c3,pnfile);
 +
/*O                  si non écrire un blanc à la place de c3 sans revenir */
 +
                      else
 +
                      { /*S cas c3 */
 +
                          putc(' ',pfdoc);
 +
                          if(s)putch(' ');
 +
                      } /*S cas c3 */                 
 +
                    } /*S t */
-
/*O             tant que pas fin de ligne */
+
/*O               tant que pas fin de ligne et pas EOF, copier la suite */
-
                while ( (c1 = getc(pnfile)) != '\n')
+
                    while ( (c1 = getc(pnfile)) != '\n' && c1 != EOF)
                     { /*S w copy line */
                     { /*S w copy line */
-
/*O               copier les chars de la ligne */
+
/*O                   copier la fin de la ligne */
-
                    putc (c1,pfdoc);if(s)putch(c1);
+
                      putc (c1,pfdoc);if(s)putch(c1);
                     } /*S w copy line */
                     } /*S w copy line */
-
/*O             copier le dernier caractere */
+
/*O               si le dernier caractère est EOF, quitter la boucle */
-
                putc (c1,pfdoc);
+
                    if(c1==EOF) break;
-
                if(s) putch('\n');
+
/*O                sinon, copier le LF (dernier caractère) */
-
/*O             revenir sur LF du fichier source */
+
                    putc (c1,pfdoc);
-
                ungetc(c1,pnfile);
+
                    if(s) putch('\n');
 +
/*O               revenir sur LF du fichier source */
 +
                    ungetc(c1,pnfile);
                 } /*S*/
                 } /*S*/
-
/*O         sinon restituer les deux derniers caracteres */
+
/*O             sinon retour des deux caractères c3 et c2 */
-
              else
+
                else
-
                 { /*S sinon */
+
                 { /*S sinon pas à extraire */
-
                ungetc(c3,pnfile);
+
                    ungetc(c3,pnfile);
-
                ungetc(c2,pnfile);
+
                    ungetc(c2,pnfile);
-
                 } /*S sinon */
+
                 } /*S sinon pas à extraire */
               } /*S colonne 1 */
               } /*S colonne 1 */
-
/*O          sinon: */
+
/*O          sinon: traiter le commentaire dans la ligne */
               else
               else
-
               { /*S else */
+
               { /*S else pas colonne 1 */
/*O---------    si c1 = 'CD3' (&  option ligne) --------------------------*/
/*O---------    si c1 = 'CD3' (&  option ligne) --------------------------*/
                 if (c1==CD3)
                 if (c1==CD3)
Ligne 131 : Ligne 335 :
/*O                si codes[0]=0 ou si suivi par c2 = char code utilisateur */
/*O                si codes[0]=0 ou si suivi par c2 = char code utilisateur */
                     c2=getc(pnfile);
                     c2=getc(pnfile);
 +
                    if (c2==EOF) {ungetc(c2,pnfile);break;}
                     if(!codes[0]||
                     if(!codes[0]||
                       c2 == codes[0] ||
                       c2 == codes[0] ||
Ligne 138 : Ligne 343 :
                       c2 == codes[4]
                       c2 == codes[4]
                       )
                       )
-
/*O                alors: */
+
/*O                alors: extraire le commentaire */
                     { /*S commentaire */
                     { /*S commentaire */
-
/*O                  reperer la position commentaire */
+
/*O                  repérer la position commentaire */
                       if(!codes[0])ungetc(c2,pnfile);
                       if(!codes[0])ungetc(c2,pnfile);
                       ll=ftell(pnfile);
                       ll=ftell(pnfile);
-
/*O                  si option n ins‚rer le num‚ro de ligne */
+
/*O                  si option n insérer le numéro de ligne */
-
                       if(n)
+
                       if(n) // depuis le dernier LF on n'a encore rien copié
                       { /*S*/
                       { /*S*/
                           fprintf( pfdoc, "%5d ", num );
                           fprintf( pfdoc, "%5d ", num );
Ligne 152 : Ligne 357 :
                       if(!t)
                       if(!t)
                       { /*S*/
                       { /*S*/
-
/*O                      se positionner en dedut de ligne */
+
/*O                      se positionner en dédut de ligne */
                           fseek(pnfile,nl,0);
                           fseek(pnfile,nl,0);
                           /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
                           /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
-
/*O                      copier toute la ligne tq pas NL LF, dans le fichier doc */
+
/*O                      copier dans le fichier cible toute la ligne tq pas NL (LF) */
-
                           while ( (c1=getc(pnfile)) != '\n')
+
                           while ( (c1=getc(pnfile)) != '\n' && c1 != EOF)
                           { /*S*/
                           { /*S*/
-
                          putc(c1,pfdoc);
+
                            putc(c1,pfdoc);
-
                          if(s)putch(c1);
+
                            if(s)putch(c1);
                           } /*S*/
                           } /*S*/
 +
                          if (c1==EOF) break;
                       } /*S*/
                       } /*S*/
/*O                  sinon: (option t) */
/*O                  sinon: (option t) */
                       else
                       else
                       { /*S*/
                       { /*S*/
-
/*O                      copier autant de tabulations qu'en source */
+
/*O                      se positionner en dédut de ligne */
-
                           for(i=0;i<tabl;i++)
+
                          fseek(pnfile,nl,0);
-
                           { /*S*/
+
/*O                      copier le début de ligne avec des tabulations et des espaces */
-
                          putc('\t',pfdoc);
+
                           for(lc=nl;lc<ll;lc++)
-
                          if(s)putch('\t');
+
                           { /*S first */
-
                          } /*S*/
+
                            c1=getc(pnfile);
-
/*O                      puis copier des blancs jsqu'position commentaire */
+
                            if (c1==EOF) break;
-
                          for(i=(int)(ll-nl-tabl);i>0;i--)
+
                            if (c1=='\t')
-
                          { /*S*/
+
                            {
-
                          putc(' ',pfdoc);
+
                                putc('\t',pfdoc); // tab to target
-
                          if(s)putch(' ');
+
                                if(s)putch('\t');     // tab to stdout
-
                           } /*S*/
+
                            }
 +
                            else
 +
                            {
 +
                                putc(' ',pfdoc); // blank to target
 +
                                if(s)putch(' ');     // blank to stdout
 +
                            }
 +
                           } /*S first */
-
/*O                      puis copier le commentaire tq pas NL */
+
/*O                      puis copier le commentaire tq pas NL et pas EOF */
-
                           while ( (c1=getc(pnfile)) != '\n')
+
                           while ( (c1=getc(pnfile)) != '\n' && c1!=EOF )
                           { /*S*/
                           { /*S*/
-
                          putc(c1,pfdoc);
+
                            putc(c1,pfdoc);
-
                          if(s)putch(c1);
+
                            if(s)putch(c1);
                           } /*S*/
                           } /*S*/
 +
                          if (c1==EOF) break;
                       } /*S*/
                       } /*S*/
                       putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
                       putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
Ligne 196 : Ligne 409 :
/*O            sinon si c1='\t' inc tabl */
/*O            sinon si c1='\t' inc tabl */
                 else if(c1=='\t')tabl++;
                 else if(c1=='\t')tabl++;
-
               } /*S else */
+
               } /*S else pas colonne 1 */
           } /*S cas lignes */
           } /*S cas lignes */
 +
/*O###### si option page ####################################################*/
/*O###### si option page ####################################################*/
 +
           if (p)
           if (p)
           { /*S cas page */
           { /*S cas page */
Ligne 204 : Ligne 419 :
               if(c1==CD4)
               if(c1==CD4)
               { /*S char = CD4 */
               { /*S char = CD4 */
-
              c2=getc(pnfile);
+
                c2=getc(pnfile);
-
/*O            si codes[0]=0 ou si c1 est suivi par c2 char code utilisateur */
+
/*O            si codes[0]=0 ou si c1 est suivi par c2 'Codes' */
                 if(!codes[0]||
                 if(!codes[0]||
                     c2 == codes[0] ||
                     c2 == codes[0] ||
Ligne 213 : Ligne 428 :
                     c2 == codes[4]
                     c2 == codes[4]
                   )
                   )
-
/*O         alors: */
+
/*O             alors: */
                 { /*S traiter le commentaire */
                 { /*S traiter le commentaire */
-
/*O             reperer la position commentaire */
+
/*O               repérer la position commentaire */
-
                if(!codes[0]) ungetc(c2,pnfile);
+
                    if(!codes[0]) ungetc(c2,pnfile);
-
                ll=ftell(pnfile);
+
                    ll=ftell(pnfile);
-
 
+
/*O               si option n insérer le numéro de ligne */
-
/*O             si option n ins‚rer le num‚ro de ligne */
+
                    if(n)
-
                if(n)
+
                     { /*S*/
                     { /*S*/
-
                    fprintf(pfdoc, "%5d ", num );
+
                      fprintf(pfdoc, "%5d ", num );
-
                    if(s) printf("%5d ", num );
+
                      if(s) printf("%5d ", num );
                     } /*S*/
                     } /*S*/
-
/*O             si pas option t */
+
/*O               si pas option t */
-
                if(!t)
+
                    if(!t)
                     { /*S!t*/
                     { /*S!t*/
-
/*O               se positionner en dedut de ligne */
+
/*O                   se positionner en dédut de ligne */
-
                    fseek(pnfile,nl,0);
+
                      fseek(pnfile,nl,0);
-
                    /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
+
                      /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
-
/*O               copier la ligne jusqu'au commentaire, dans le fichier doc */
+
/*O                   copier la ligne jusqu'au commentaire, dans le fichier cible */
-
                    for(i=(int)(ll-nl);i>0;--i)
+
                      for(i=(int)(ll-nl);i>0;--i)
                       { /*S*/
                       { /*S*/
-
                      c1=getc(pnfile);
+
                          c1=getc(pnfile);
-
                      putc(c1,pfdoc);
+
                          putc(c1,pfdoc);
-
                      if(s)putch(c1);
+
                          if(s)putch(c1);
                       } /*S*/
                       } /*S*/
                     } /*S!t*/
                     } /*S!t*/
-
/*O             sinon: (option t) */
+
/*O               sinon: (option t) */
-
                else
+
                    if(t)
-
                     { /*St*/
+
                     { /*S t */
-
/*O               copier les tabulations */
+
/*O                   se positionner en dédut de ligne */
-
                    for(i=0;i<tabp;i++)
+
                      fseek(pnfile,nl,0);
-
                       { /*S*/
+
/*O                  copier le début de ligne avec des tabulations et des espaces */
-
                      putc('\t',pfdoc);
+
                      for(lc=nl;lc<ll;lc++)
-
                      if(s)putch('\t');
+
                       { /*S first */
-
                      } /*S*/
+
                          c1=getc(pnfile);
-
/*O                puis copier des blancs jusqu'a la position commentaire */
+
                          if (c1==EOF) break;
-
                    for(i=(int)(ll-nl-tabp);i>0;i--)
+
                          if (c1=='\t')
-
                      { /*S*/
+
                          {
-
                      putc(' ',pfdoc);
+
                            putc('\t',pfdoc); // tab to target
-
                      if(s)putch(' ');
+
                            if(s)putch('\t');     // tab to stdout
-
                       } /*S*/
+
                          }
-
                     } /*St*/
+
                          else
-
 
+
                          {
-
 
+
                            putc(' ',pfdoc); // blank to target
 +
                            if(s)putch(' ');     // blank to stdout
 +
                          }
 +
                       } /*S first */
 +
                     } /*S t */
/*O                puis tq ne rencontre pas le char CD5, copier le commentaire */
/*O                puis tq ne rencontre pas le char CD5, copier le commentaire */
-
                     while ( (c1=getc(pnfile)) != CD5 )
+
                     while ( (c1=getc(pnfile)) != CD5 && c1 != EOF)
                     { /*S*/
                     { /*S*/
-
                    putc(c1,pfdoc);
+
                      putc(c1,pfdoc);
-
                    if(s)putch(c1);
+
                      if(s)putch(c1);
-
/*O                  si option n et NL incr‚menter et ajouter le num‚ro de ligne */
+
/*O                  si option n et NL incrémenter et ajouter le numéro de ligne */
                       if(n && c1=='\n')
                       if(n && c1=='\n')
                       { /*S*/
                       { /*S*/
Ligne 270 : Ligne 488 :
                       } /*S*/
                       } /*S*/
                     } /*S*/
                     } /*S*/
-
 
+
                    if (c1==EOF) break;
#ifdef FULL_LINE    /*O *** FULL_LINE *** */
#ifdef FULL_LINE    /*O *** FULL_LINE *** */
Ligne 276 : Ligne 494 :
                     if(!t)
                     if(!t)
                     { /*S*/
                     { /*S*/
-
/*O                  copier les chars jusqu'en fin de ligne */
+
/*O                  copier les caractères jusqu'en fin de ligne */
                       ungetc(c1,pnfile);
                       ungetc(c1,pnfile);
-
                       while ( (c1=getc(pnfile)) != '\n' )
+
                       while ( (c1=getc(pnfile)) != '\n' && c1!=EOF)
                       { /*S*/
                       { /*S*/
-
                      putc(c1,pfdoc);
+
                          putc(c1,pfdoc);
-
                      if(s)putch(c1);
+
                          if(s)putch(c1);
                       } /*S*/
                       } /*S*/
                     } /*S*/
                     } /*S*/
Ligne 289 : Ligne 507 :
                     { /*S*/
                     { /*S*/
/*O                  aller au bout de la ligne sans copier sauf les '\r' */
/*O                  aller au bout de la ligne sans copier sauf les '\r' */
-
                       while ( (c1=getc(pnfile)) != '\n' )
+
                       while ( (c1=getc(pnfile)) != '\n' && c1!=EOF )
                           if (c1=='\r')
                           if (c1=='\r')
                           { /*S*/
                           { /*S*/
Ligne 296 : Ligne 514 :
                           } /*S*/
                           } /*S*/
                     } /*S*/
                     } /*S*/
 +
                    if(c1==EOF) break;
                     putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
                     putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
                     ungetc(c1,pnfile);                  /*O revenir sur NL */
                     ungetc(c1,pnfile);                  /*O revenir sur NL */
Ligne 303 : Ligne 522 :
                 else
                 else
                 { /*S pas le cas */
                 { /*S pas le cas */
-
                ungetc(c2,pnfile);
+
                    ungetc(c2,pnfile);
                 } /*S pas le cas*/
                 } /*S pas le cas*/
               } /*S char = CD4 */
               } /*S char = CD4 */
-
/*O          sinon si c1='\t' inc tabp */
+
/* O          sinon si c1='\t' inc tabp */
-
              else if(c1=='\t')tabp++;
+
//              else if(c1=='\t')tabp++;
           } /*S cas page */
           } /*S cas page */
         } /*S tq !EOF */
         } /*S tq !EOF */
     } /*S tri */
     } /*S tri */
</pre>
</pre>
 +
{{Boîte déroulante/fin}}
 +
 +
== Fichier de commande des tests  ==
 +
 +
; La fonction tri() a été éprouvée avec les options de compilation suivantes:
 +
 +
1 - Commande : <code> mkd \? | grep '-l' > ligne.txt</code>
 +
 +
<span style="color:blue">'''Fichier ligne.txt''', compilation avec CD1= '%', CD2= '<', CD3= '!' :</span>
 +
: <span style="color:orange">Ligne: -l et -p:  ligne;  (compil.: % ou < en première colonne ou ! dans la ligne)</span>
 +
 +
2 - Commande : <code> mkd \? | grep page > block.txt</code>
 +
 +
<span style="color:blue">'''Fichier block.txt''', compilation avec CD4= '\"', CD5= '\"' :</span>
 +
: <span style="color:orange">page:  (compil.: commence avec " et se termine avec ")</span>
 +
 +
{{Boîte déroulante/début|titre=MAKE_Tests_U, CLEAN_Tests_U ; Updated 2013-05-11}}
 +
*
 +
<pre style="color:blue">
 +
#!/bin/bash
 +
#O ../../mkd tests under Linux.
 +
#O Epreuve de vérification de la fonction tri_() avec ../../mkd
 +
#!/bin/dash
 +
../../mkd \? | grep -e '-l' > ligne.txt
 +
../../mkd \? | grep -e page > block.txt
 +
#
 +
echo "File stdout.doc for all tri() tests" > stdout.doc
 +
# PostSript commentaire en début de ligne (début avec CD1 ou CD2 fin avec NL)
 +
if cat ligne.txt | grep -e ' % '
 +
then
 +
../../mkd -svlw '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlan '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlant '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlant O sample2.ps >> stdout.doc;
 +
fi
 +
#
 +
# Tag '<' commentaire en début de ligne (début avec CD1 ou CD2 fin avec NL)
 +
if cat ligne.txt | grep -e ' < '
 +
then
 +
../../mkd -svlw '**' tags.html >> stdout.doc;
 +
../../mkd -svlan '**' tags.html >> stdout.doc;
 +
../../mkd -svlant '**' tags.html >> stdout.doc;
 +
../../mkd -svlant '!' tags.html >> stdout.doc;
 +
fi
 +
#
 +
# Fortran 90 commentaire dans la ligne (début avec CD3 fin avec NL)
 +
if cat ligne.txt | grep -e ' ! '
 +
then
 +
../../mkd -svlw '**' degrad.f >> stdout.doc;
 +
../../mkd -svlan '**' degrad.f >> stdout.doc;
 +
../../mkd -svlant '**' degrad.f >> stdout.doc;
 +
../../mkd -svlant S degrad.f >> stdout.doc;
 +
fi
 +
#
 +
# Texte avec chaînes de caractères sous forme de bloc début avec CD3 fin avec CD4
 +
if cat block.txt | grep -e ' " '
 +
then
 +
../../mkd -svpw '**' strings.txt >> stdout.doc;
 +
../../mkd -svpan '**' strings.txt >> stdout.doc;
 +
../../mkd -svpant '**' strings.txt >> stdout.doc;
 +
../../mkd -svpant '*' strings.txt >> stdout.doc;
 +
fi
 +
</pre>
 +
 +
* CLEAN_Tests_U
 +
<pre style="color:violet">
 +
#!/bin/dash
 +
#O File Tests_Clean
 +
#O Delete files created with Make_Tets_files under Linux.
 +
rm *.doc
 +
</pre>
 +
{{Boîte déroulante/fin}}
 +
 +
== Analyse des test Konsole ==
 +
 +
{{Boîte déroulante/début|titre=Analysis ; Updated 2013-05-11}}
 +
* Analysis
 +
<pre style="color:black>
 +
Fichier Analysis texte UTF-8
 +
Analyse du : 10 mai 2013 par Clara pour le retour à la conception détaillée.
 +
-------------------------------------------------------------------------------
 +
Résultats du test unitaire de la fonction tri_() du fichier tri.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.
 +
.
 +
Avec la commande : MAKE_Tests_U on obtient des résultatas conformes en fonction
 +
  des paramètres de compilation définis par CD1,CD2,CD3,CD4,CD5,dans version.h
 +
.
 +
Il est à noter que l'option -l permet de décoder les lignes commençant à la
 +
  fois par les caractères CD1, CD2 et contenant CD3.
 +
.
 +
Les tests ont été effectués selon les directives contenues dans le ficchier de
 +
  commandes:
 +
.
 +
#!/bin/bash
 +
#O ../../mkd tests under Linux.
 +
#O Epreuve de vérification de la fonction tri_() avec ../../mkd
 +
#!/bin/dash
 +
../../mkd \? | grep -e '-l' > ligne.txt
 +
../../mkd \? | grep -e page > block.txt
 +
#
 +
echo "File stdout.doc for all tri() tests" > stdout.doc
 +
# PostSript commentaire en début de ligne (début avec CD1 ou CD2 fin avec NL)
 +
if cat ligne.txt | grep -e ' % '
 +
then
 +
../../mkd -svlw '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlan '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlant '**' sample2.ps >> stdout.doc;
 +
../../mkd -svlant O sample2.ps >> stdout.doc;
 +
fi
 +
#
 +
# Tag '<' commentaire en début de ligne (début avec CD1 ou CD2 fin avec NL)
 +
if cat ligne.txt | grep -e ' < '
 +
then
 +
../../mkd -svlw '**' tags.html >> stdout.doc;
 +
../../mkd -svlan '**' tags.html >> stdout.doc;
 +
../../mkd -svlant '**' tags.html >> stdout.doc;
 +
../../mkd -svlant '!' tags.html >> stdout.doc;
 +
fi
 +
#
 +
# Fortran 90 commentaire dans la ligne (début avec CD3 fin avec NL)
 +
if cat ligne.txt | grep -e ' ! '
 +
then
 +
../../mkd -svlw '**' degrad.f >> stdout.doc;
 +
../../mkd -svlan '**' degrad.f >> stdout.doc;
 +
../../mkd -svlant '**' degrad.f >> stdout.doc;
 +
../../mkd -svlant S degrad.f >> stdout.doc;
 +
fi
 +
#
 +
# Texte avec chaînes de caractères sous forme de bloc début avec CD3 fin avec CD4
 +
if cat block.txt | grep -e ' " '
 +
then
 +
../../mkd -svpw '**' strings.txt >> stdout.doc;
 +
../../mkd -svpan '**' strings.txt >> stdout.doc;
 +
../../mkd -svpant '**' strings.txt >> stdout.doc;
 +
../../mkd -svpant '*' strings.txt >> stdout.doc;
 +
fi
 +
</pre>
 +
 +
{{Boîte déroulante/fin}}
 +
 +
== Fichiers sources des tests ==
 +
 +
{{Boîte déroulante/début|titre=degrad.f90, sample2.ps, strings.txt, tags.html ; Updated 2013-05-11}}
 +
* degrad.f (Fortran 90&+)
 +
<pre style="color:orange">
 +
      PROGRAM DEGRAD  !S Début de programme
 +
!                                                                     
 +
!S Imprime une table de conversion degrés -> radians                   
 +
!S =================================================                   
 +
!                                                                     
 +
!S Déclaration des variables                                           
 +
      INTEGER DEG
 +
      REAL RAD, COEFF
 +
!                                                                     
 +
!S En-tête de programme                                               
 +
      WRITE ( *, 10)
 +
  10 FORMAT      (' ',20('*') /                                        &
 +
    &            ' * Degres * Radians *' /                            &
 +
    &            ' ', 20('*') )                                     
 +
!                                                                     
 +
!S Corps de programme                                                 
 +
      COEFF = (2.0 * 3.1416) / 360.0
 +
      DO DEG = 0, 90
 +
        RAD = DEG * COEFF
 +
        WRITE ( *, 20) DEG, RAD
 +
  20 FORMAT        (' *  ',I4,'  * ',F7.5,' *')
 +
      END DO
 +
!                                                                     
 +
!S Fin du tableau                                                     
 +
      WRITE ( *, 30)
 +
  30 FORMAT      (' ',20('*') )
 +
!                                                                     
 +
!S Fin de programme                                                   
 +
      STOP
 +
      END PROGRAM DEGRAD
 +
CS Fin
 +
!S Fin
 +
</pre>
 +
 +
* sample2.ps (PostScript)
 +
<pre style="color:red">
 +
%O Cursor initialization %
 +
200 200 moveto
 +
%O Drawing the rectangle %
 +
400 300 lineto
 +
300 300 lineto
 +
200 200 lineto
 +
stroke
 +
</pre>
 +
 +
* strings.txt
 +
<pre style="color:blue">
 +
Fichier strings.txt ""
 +
"chaîne 1"
 +
"chaîne 2 précédée de 1 tab"
 +
    "* chaîne 2 précédée de 5 espaces"
 +
</pre>
 +
 +
* tags.html
 +
<pre style="color:violet">
 +
<!Doctype html public "-//w3c//dtd html 4.0 Transitional//en">
 +
<HTML>
 +
  <HEAD>
 +
      <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-8" />
 +
      <TITLE>Exercices avec mkd</TITLE>
 +
  </HEAD>
 +
  <BODY>
 +
  <i>Exercices avec la commande mkd.</i>
 +
<p>
 +
  <b><u>Fonction cpp_(); Fichier cpp.c</u></b>
 +
  <br>
 +
  <b>Documentation simplifiée.</b>
 +
  <br>
 +
  La fonction  doit décoder des commentaires, pré-codés avec un caractère ASCII qui suit le début de commentaire.
 +
  <br>
 +
  Exemple: //A ou /*A
 +
  <br>
 +
  ... et bla bla bla ...(raccourci pour les exercices)
 +
</p>
 +
 +
<p>
 +
  <b>Tests unitaires:</b>
 +
  <br>
 +
  Vérifiez les options n, s et t séparément:
 +
  <br>
 +
  Vérifiez que la numérotation des lignes est correcte dans tous les cas de décodage (lignes et blocs). n, ns. nt, nst.
 +
  <br>
 +
  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.
 +
  <br>
 +
  -- Vérifiez que les tabulations sont bien prises en charge dans tous les cas, décodage des lignes et des blocs.
 +
  <br>
 +
  -- Vérifiez de même pour les espaces.
 +
  <br>
 +
  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.
 +
  <br>
 +
  La fonction cpp_() 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.
 +
  <br>
 +
  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.
 +
  <br>
 +
  <br>
 +
  Le caractère de fin de fichier <b>(EOF) ne doit jamais apparaître dans le texte du fichier cible</b>.
 +
  <br>
 +
  <i>Ceci provoquait un bug dans la version Alpha de l'application fenêtrée mkdcppw; à l'étape du test d'intégration.</i>
 +
</p>
 +
<p>
 +
%! introduction d'une balise d'extraction ligne % compatible en 1ère colonne
 +
<br>
 +
introduction d'une balise d'exttraction ligne !! dans la ligne (inline)
 +
</p>
 +
<h2>Exemples de tags:</h2>
 +
<header>header</header><br>
 +
<abbr>abréviation</abbr><br>
 +
<acronym>acronyme</acronym><br>
 +
<cite>citation</cite><br>
 +
<code>code</code><br>
 +
<dfn>Définition de terme</dfn><br>
 +
<del>supprimé</del><br>
 +
<ins>inséré</ins><br>
 +
<kbd>clavier</kbd><br>
 +
<samp>échantillon</samp><br>
 +
<var>variable</var><br>
 +
<!-- commentaire --><br>
 +
<footer>footer</footer><br>
 +
  </BODY>
 +
</HTML>
 +
</pre>
 +
{{Boîte déroulante/fin}}
[[Catégorie:Générateurs de documentation]]
[[Catégorie:Générateurs de documentation]]

Version actuelle en date du 11 mai 2013 à 13:40

Retour aux fichiers en développement →

Sommaire

Fichiers de la fonction tri()

  Remarks: (1991)
  Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
  mètres CD1 CD2 CD3 CD4 CD5 compiles.
  avec l'option l (copie de ligne):
  CD1 et CD2 sont des caractères début de commentaires a placer en début de
  ligne comme en FORTRAN: c ou C ou * .
  CD3 est un caractère début de commentaire que l'on peut placer en tout point
  d'une ligne comme ; en assembleur, # en shell ou % en PostScript.
  Cette fonction permet des tris différents de SHELL_.C vu qu'elle ignore si
  # est dans une chaîne ou si elle est précédée du char \ .
  avec l'option p (copie de page ):
  CD4 est le caractère de début du commentaire et CD5 est la fin du commentaire
  comme en PASCAL : CD4={ et CD5=} . CD4=CD5=" peut a la rigueur permettre
  d'extraire des chaînes de caractères afin d’éditer un dictionnaire syntaxique
  toutefois " étant a la fois début et fin de caractère le résultat n'est pas
  assuré.

Fichier de commande des tests

La fonction tri() a été éprouvée avec les options de compilation suivantes

1 - Commande : mkd \? | grep '-l' > ligne.txt

Fichier ligne.txt, compilation avec CD1= '%', CD2= '<', CD3= '!' :

Ligne: -l et -p: ligne; (compil.: % ou < en première colonne ou ! dans la ligne)

2 - Commande : mkd \? | grep page > block.txt

Fichier block.txt, compilation avec CD4= '\"', CD5= '\"' :

page: (compil.: commence avec " et se termine avec ")

Analyse des test Konsole

Fichiers sources des tests

Outils personnels