Projet mkd/fortran.c

De Wiki EELL.

(Différences entre les versions)
m
m (Nouvelle version)
Ligne 1 : Ligne 1 :
<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>
:fortran.inc.c à revoir, il n'est pas indépendant !
:fortran.inc.c à revoir, il n'est pas indépendant !
 +
{{menu déroulant début}}
<pre>
<pre>
-
/*E �C�*/
+
/*P
 +
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
 +
            the file in windowed version of mkd with gtkmm
 +
FUNCTION : fortran_()
 +
 +
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: ../../1991 by JPL mkdoc 3.12 for PC and UNIX
 +
Date: 17/04/2013 by Clara; Mise à jour vers UTF-8 et correction de fin de
 +
                    fichier pour version 2013 + introduction de la nouvelle
 +
                    entête mkd* + numérotation des lignes.
 +
Date: 21/04/2013 by JPL Nettoyage du code après les testsb unitaires.
 +
 
 +
*/
 +
// Date: ../../.... by ... purpose of the modification ....
 +
 
 +
/*T
 +
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
 +
            the file in windowed version of mkd with gtkmm
 +
FUNCTION : fortran_()
 +
 +
RECOMMANDED TESTS:
 +
  Cette fonction doit décoder les commentaires style Fortran 77.
 +
  Pour le fortran 90 et ultérieurs Voir NOTES et option -l dans version.h
 +
 
 +
  Dès la version 2013 le caractère de décodage se place en 3 ème colonne
 +
  Comme il est d'usage, ceci contrairement aux versions précédentes où
 +
  le caractère de décodage se plaçait uniquement en 2 ème colonnes.
 +
  Colonne |1|2|3|4|5|6|7|8|9|A|B|C|....To 72
 +
          |C| |O| |C|o|m|m|e|n|t| |....| | | depuis version 2013
 +
          |C|O| |C|o|m|m|e|n|t| | |....| | | toutes versions
 +
          |C| |C|o|m|m|e|n|t| | | |....| | | toutes versions avec Codes '**'
 +
  Notez que le 'Code' peut être placé en 2ème ou 3ème colonne.
 +
 
 +
TETS UNITAIRES:
 +
  Veiller à ce que les commentaires restent à la bonne place quelle que soient
 +
  les colonnes utilisées pour le décodage (2ème ou 3éme colonne) augmenté du
 +
  numéro de ligne.
 +
  Vérifier dans cette nouvelle version, que le numéro de ligne s'écrit
 +
  correctement, sur 5 colonnes.
 +
  Veiller à ce que le fichier cible ne contienne jamais le caractère de fin de
 +
  fichier EOF.
 +
 
 +
  3 cas peuvent se présenter:
 +
  Cas 1 : Codes est '**' tous les caractères doivent être copiés
 +
  Cas 2 : colonne 2 identifie le commentaire de la ligne à copier
 +
  cas 3 : Colonne 2 est un espace et colonne 3 identifie la ligne de commentaire
 +
          à copier
 +
  Vérifiez tous les cas avec les options n,s,t
 +
 
 +
  Testez de la même façon le fortran 90 avec l'option de compilation CD3 = '!'
 +
 
 +
*/
 +
 
 +
// Description de la fonction: (Utile pour le manuel man 3)
 +
/*D
 +
NAME:
 +
  Function: fortran_().
 +
  Files: fortran.c for Kosole or fortran.cc or fortran.inc.cc for included
 +
  file in windowed version with gtkmm
 +
 
 +
SYNOPSIS:
 +
  In UNIX / LINUX environment:
 +
  #include "/usr/include/mkd/version.h" // IMPORTANT: Compilation directives
 +
  #include "/usr/include/mkd/fortran.h" // or mkd.h
 +
  In local environment:
 +
  #include "version.h"
 +
  void fortran_(FILE * pfdoc, FILE * pnfile);
 +
 
 +
DESCRIPTION:
 +
  Fortran 77: (ASCII)
 +
  -------------------
 +
  Originally Fortran programs were written in a fixed column format for the
 +
  cards.
 +
  A letter "C" in column 1 caused the entire card to be treated as a comment
 +
  and ignored by the compiler.
 +
  Usage:
 +
  The comment character begin with the C or c or * in first colomn frequently
 +
  followed by a space and shall not exceed the 72nd colomn for fortran 77.
 +
  The mkd 'Code' character de must by placed in the 2nd or in 3rd colomn.
 +
 
 +
  The golbal variables are 'Codes' and 'Options'.
 +
  The 'Codes': table of 5 characters:
 +
      extern char codes[];
 +
      They must be défined in the calling function:
 +
      char codes[5] = {0,0,0,0,0};
 +
  The 'Options': l,n,s,t.
 +
      see NOTES for inline ! comment
 +
      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 on 5 colomns. This allows to
 +
      easily reach the commented line. (Warning with the tabs ...)
 +
  s: Add the comment to the screen to use shell redirections > , >> , or ||.
 +
  t: With the t option only the commented text is copied.
 +
      Without the t option the entire line or block is copied.
 +
      The t option permit to generate directly exploitable and publishable
 +
      documents.
 +
 
 +
RETURN VALUE:
 +
  Nothing
 +
 
 +
CONFORMING TO: or STANDARDS:
 +
  POSIX, ANSI C, BSD, ISO/IEC 9899:2011; gcc, MS-Vc10; UTF-8.
 +
 
 +
PORTABILITY:
 +
  LINUX-Debian-systems, LINUX-Red-Hat, Windows NT, etc.
 +
 
 +
COPYRIGHT:
 +
  © Contact: http://edeulo.free.fr/contacts/formmail.php
 +
  © EELL, Éditeurs Européens de Logiciels Libres, 2007
 +
  Association à but non lucratif selon l'Article 11 de la convention européenne
 +
  des droits de l'homme.
 +
 
 +
AUTHORS:
 +
  Designer: intial JP Louyot (JPL)
 +
  Updates : JPL and Clara Jimenez
 +
  Traducteurs: Clara
 +
 
 +
RESSOURCES:
 +
  gtkmm with mkdw future widowed version.
 +
 
 +
NOTES:
 +
  Update April 2013 the Coded comment begin also in 3rd colomn
 +
 
 +
BUGS:
 +
  See bugs reports http://edeulo.free.fr/phpBB3
 +
 
 +
SEE ALSO:
 +
  Fortran 90:
 +
  -----------
 +
  Character ! is the inline comment starting with this character to NewLine.
 +
  See -l compilation option #define CD3 '!' in version.h
 +
 
 +
  Fortran 2003:
 +
  -------------
 +
  The interface with the C languages are insured with the external module
 +
  ISO_C_BINDING to facilitate access at the C libraries.
 +
 
 +
  mkd for fortran 90 with the -l option: Decode The inline comment '!' if the
 +
  option CD3 are defined with the char '!' in version.h.
 +
  Unix / Linux Man(3) attached in English. Command line : man 3 fortran_
 +
 +
*/
 +
 
 +
/*H 
 +
// File: fortran.c (Comments for UTF-8 text editor)
 +
void fortran_ (FILE * pfdoc, FILE * pnfile);
 +
*/
 +
 
/** #########################################
/** #########################################
     #                FORTRAN                #
     #                FORTRAN                #
     ######################################### */
     ######################################### */
-
/*  maj: 23/3/89 */
+
 
-
/*P maj R3.11 3/1/91 */
+
#ifndef GTKMM
 +
  // If GTKMM is not defined then it is a Konsole version
 +
  // when GTKMM is defined the file is included to the compilation
 +
  // *pfdoc and *pnfile are open by the calling function
 +
#include "version.h"
 +
#include "fortran.h"
void fortran_(FILE * pfdoc, FILE * pnfile)
void fortran_(FILE * pfdoc, FILE * pnfile)
-
// FILE *pfdoc, *pnfile;
+
    { /*S fortran */
-
    { /*S fortran */
+
        extern unsigned char n,s,t;
-
    extern unsigned char l,p;
+
        extern char codes[];
-
    extern char codes[];
+
#else
-
     unsigned int num;
+
     { //S Function begin for gtkmm (with fortran.cc included file)
-
    register int c1;
+
#endif
-
    int c2,c3;
+
// #define TESTS
 +
#ifdef TESTS
 +
        int cas1 = 0; //T pour les tests
 +
        int cas2 = 0; //T pour les tests
 +
        int cas3 = 0; //T pour les tests
 +
#endif
 +
        int inbc = 0;      // nombre de caractères sur la pile
 +
        unsigned num = 0; // Numéro de ligne
 +
        unsigned i ;      // Compteur
 +
        int copyflag = 0;  // drapeau commentaire à copier
 +
        register int c0; // entier dans le registre du processeur
 +
        int c1,c2,c3;      // entiers en mémoire vive sur la pile
 +
/*O    initialisation des valeurs sur la pile à NULL */
 +
        c0 = c1 = c2 = c3 = 0;  
-
    num = 0;
+
/*O    tant que l'on n'est pas en fin de fichier source */
-
    c1 = c2 = c3 = STX; /* Start Text */
+
        while ( c0 != EOF && c1 != EOF && c2 != EOF && c3 != EOF )
 +
        { /*S tq !EOF */       
 +
/*O        si début de texte faire c0 = retour chariot */
 +
            if (!c0) c0='\n'; // ceci impose la première colonne
 +
/*O        sinon copier dans le registre c0 le caractère suivant */
 +
            else c0=getc(pnfile);
 +
            if (c0 == EOF) break;
-
/*O   tant que pas fin de fichier source */
+
/*O------- si le char est NL le caractère suivant est en 1ère colonne ------*/
-
        while ( c1 != EOF && c2 != EOF && c3 != EOF )
+
            if (c0=='\n') // précède la première colonne
-
        { /*S tq !EOF */
+
            { /*S colonne 1 */
-
/*O       si debut de texte faire c1=LF */
+
/*O           si suivi par c1 = 'C' ou 'c' ou '*' */
-
          if (c1==STX) c1='\n';
+
              /* et si codes[0]=0 ou si suivi par un espace et un des 5 char
-
/*O       sinon prendre pour c1 le char suivant */
+
              code d'utilisateur */
-
          else c1=getc(pnfile);
+
                num++;
 +
                copyflag = 0;
 +
                c1 = getc(pnfile);
 +
                if (c1 == EOF) break; // quitter si le caractère en 1 ère colonne est EOF
 +
                inbc = 1; // 1 caractère copié sur la pile (c1)
 +
                if (c1 == 'C' || c1 == 'c' || c1 == '*')
 +
                { /*O carte de commentaire */
 +
/*O                si il n'y a pas de 'Code' à décrypter copier tous les commentaires */
 +
                    if ( !codes[0] )
 +
                    { /* Cas 1 copier tous les commentaires ('Code' NULL) */
 +
#ifdef TESTS
 +
    cas1++;
 +
#endif
 +
                        copyflag = 1;
 +
                        if (n) fprintf( pfdoc,"%5d ", num );
 +
/*O                   copier le début de ligne 1 ère colonne si t est invalide */
 +
                        if (!t) putc (c1,pfdoc); // colonne 1
 +
                        else putc (' ',pfdoc); // colonne 2
 +
/*O                    si option s copier de même à la sortie standard */
 +
                        if (s && n) printf("%5d ", num );
 +
                        if (!t) putch(c1);
 +
                        else putch(' '); // colonne 2
 +
                    } /* Cas 1 copier tous les commentaires ('Code' NULL) */
-
/*O--------- si le char est NL ---------------------------------------------*/
+
/*O               sinon, identifier les codes en 2ème ou 3ème colonne: */
-
              if (c1=='\n')
+
                    else
-
              { /*S colonne 1 */
+
                    { /*S commentaire ok cas 2 ou 3 (avec 'Code')*/
-
              num++;
+
                        c2 = getc(pnfile);
-
/*O          si suivi par c2 = 'C' ou 'c' ou '*'
+
                        if (c2 == EOF) break;
-
                et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */
+
                        inbc=2; // 2 caractères copiés sur la pile (c1 + c2)
-
              c2 = getc(pnfile);
+
/*O                   si colonne 2 n'est pas un espace et qu'il y a des 'Codes', identifier */
-
              c3 = getc(pnfile);
+
                        if (c2 != ' ')  
-
              if( (c2 == 'C'||
+
                        { /*S cas 2 si colonne 2 n'est pas un espace */
-
                   c2 == 'c'||
+
#ifdef TESTS
-
                  c2 == '*'
+
    cas2++;
-
                  )
+
#endif
-
                  &&
+
-
                  (!codes[0]||
+
-
                  c3 == codes[0] ||
+
-
                  c3 == codes[1] ||
+
-
                  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: */
+
                            if (
-
                { /*S*/
+
                                c2 == codes[0] ||
-
/*O            si option n ins‚rer le num‚ro de ligne */
+
                                c2 == codes[1] ||
-
                if(n)
+
                                c2 == codes[2] ||
-
                    { /*S*/
+
                                c2 == codes[3] ||
-
                    fprintf( pfdoc, "%5d ", num);
+
                                c2 == codes[4]
-
                    if(s) printf( "%5d ", num);
+
                              )
-
                    } /*S*/
+
                            copyflag = 1; // copyflag vrai si le code est identifié
-
/*O            si pas option t */
+
-
                if(!t)
+
-
                    { /*S*/
+
-
/*O                copier le debut de ligne */
+
-
                    putc (c2,pfdoc); putc(c3,pfdoc);
+
-
                    if(s)
+
-
                      { /*S si opt s */
+
-
                      putch(c2);putch(c3);
+
-
                      } /*S si opt s */
+
-
                    } /*S*/
+
-
                  else if(!codes[0])ungetc(c3,pnfile);
+
-
/*O            tant que pas fin de ligne */
+
                        } /*S cas 2 si colonne 2 n'est pas un espace */
-
                while ( (c1 = getc(pnfile)) != '\n')
+
/*O                   sinon si la 2ème colonne est un espace identifier la 3 ème colonne */
-
                    { /*S w copy line */
+
                        else if (c2 == ' ')
-
/*O               copier les chars de la ligne */
+
                        { /*S cas 3 colonne 2 est un espace */
-
                    putc (c1,pfdoc);if(s)putch(c1);
+
#ifdef TESTS
-
                    } /*S w copy line */
+
    cas3++;
-
/*O            copier le dernier caractere */
+
#endif
-
                putc (c1,pfdoc);
+
-
                if(s) putch('\n');
+
-
/*O            revenir sur LF du fichier source */
+
-
                ungetc(c1,pnfile);
+
-
                } /*S*/
+
-
/*O          sinon restituer les deux derniers caracteres */
+
-
              else
+
-
                { /*S sinon */
+
-
                ungetc(c3,pnfile);
+
-
                ungetc(c2,pnfile);
+
-
                } /*S sinon */
+
-
              } /*S colonne 1 */
+
 +
                            c3 = getc(pnfile);
 +
                            if (c3 == EOF) break;
 +
                            inbc = 3; // 3 caractères copiés sur la pile (c0 + c1 + c2)
 +
                            if (
 +
                                c3 == codes[0] ||
 +
                                c3 == codes[1] ||
 +
                                c3 == codes[2] ||
 +
                                c3 == codes[3] ||
 +
                                c3 == codes[4]
 +
                              )
 +
                            copyflag = 1; // copyflag vrai si colonne 3 identifiée 'Code'
 +
                        } /*S cas 3 colonne 2 est un espace */
 +
                    } /*S commentaire ok cas 2 ou 3 (avec 'Code')*/
 +
 +
/*O                si le texte est à copier dans le fichier cible: */
 +
                    if (copyflag) // donc pas de EOF dans c0 c1 c2 c3 et 'Code' existe
 +
/*O                alors copier les caractères dans le fichier doc, et si opt s copier à
 +
                  la sortie standard: */
 +
                    { /*S copier */
 +
/*O                    si pas option t et 'Code' présent */
 +
                        if(!t && inbc > 1)
 +
                        { /*S copier le début de la ligne */
 +
/*O                        si n vrai copier le numéro de ligne sur 5 chiffres
 +
                          décimaux */
 +
                            if (n) fprintf( pfdoc,"%5d ", num );
 +
/*O                        copier le début de ligne */
 +
                            putc (c1,pfdoc); // colonne 1
 +
                            if (inbc > 1 ) putc(c2,pfdoc);  // Colonne 2
 +
                            if (inbc == 3) putc(c3,pfdoc);  // 3ème colonne
 +
/*O                        si opt s copier aussi à la sortie standard */
 +
                            if(s)
 +
                            { /*S si opt s copier aussi à la sortie standard */
 +
                                if (n) printf("%5d ", num );
 +
                                putch(c1);
 +
                                if (inbc > 1 ) putch(c2);
 +
                                if (inbc == 3) putch(c3);
 +
                            } /*S si opt s */
 +
                        } /*S copier le début de la ligne */
 +
 +
/*O                    sinon, (option t) et 'Code présent */
 +
                        else if (t && inbc > 1) //w (!codes[0]) // sinon si pas de 'Code'
 +
                        { /*S espaces en début de ligne */
 +
/*w                      si n est vrai, copier le numéro de ligne dans le fichier
 +
                          cible et à la sortie standard */
 +
                          if (n) fprintf( pfdoc,"%5d ", num ); // target file
 +
                          if(s) printf("%5d ", num );          // stdout
 +
/*O                      remplacer les premières colonne  par des espaces */
 +
                          for (i=inbc ; i>0 ; i--)
 +
                          { /*S espaces */
 +
                              putc(' ',pfdoc);
 +
                              putch(' ');
 +
                          } /*S espaces */
 +
                        } /*S espaces en début de ligne */
 +
 +
/*O                    Dans tous les cas de commentaires la suite du commentaire est à copier */
 +
/*O                    tant que pas fin de ligne et pas EOF (On ne soucie pas du
 +
                      nombre de 72 colonnes) */
 +
                        while ( ( c0=getc(pnfile) ) != '\n' && c0 != EOF )
 +
                        { /*S while copy line */
 +
/*O                        copier les chars de la ligne */
 +
                            putc (c0,pfdoc);
 +
                            if(s)putch(c0);
 +
                        } /*S while copy line */
 +
 +
/*O                    si on est arrivé en fin de fichier avant NL */
 +
                        if ( c0 == EOF )
 +
                        { /* cas EOF */
 +
/*O                        //w copier NL dans le fichier cible et à la sortie standard */
 +
                          //w pas obligatoire car ajoute une ligne vide
 +
                            //w putc ('\n',pfdoc); //w pas obligatoire
 +
                            //w if(s) putch('\n'); //w pas obligatoire
 +
/*O                        interrompre la boucle */
 +
                            break;
 +
                        } /* cas EOF */                 
 +
/*O                    copier le dernier caractère (non EOF, donc NL) */
 +
                        putc (c0,pfdoc);
 +
                        if(s) putch('\n');
 +
/*O                    revenir sur NL du fichier source  pour continuer la boucle en colonne 1 */
 +
                        ungetc(c0,pnfile);
 +
                    } /*S copier */
 +
                } /*O carte de commentaire */
 +
 +
/*O            sinon ne pas copier dans le fichier doc et revenir sur les derniers
 +
              caractères */
 +
                else
 +
                { /*S sinon, pas copier */
 +
                    if (inbc-- == 3) ungetc(c3,pnfile); // 3 caractères copiés
 +
                    if (inbc-- == 2) ungetc(c2,pnfile); // 2 caractères copiés
 +
                    if (inbc-- == 1) ungetc(c1,pnfile); // C en 1ère colonne
 +
                    ungetc(c1,pnfile); // cas NL en 1ère colonne
 +
                } /*S sinon, pas copier */
 +
            } /*S colonne 1 */
 +
            inbc = 0 ; //w pas nécessaire si remis à 0 à la fin des blocs
         } /*S tq !EOF */
         } /*S tq !EOF */
-
    } /*S fortran */
+
#ifdef TESTS
 +
        fprintf( pfdoc, "\nCas 1 tous les commentaires: %5d ", cas1 );
 +
        fprintf( pfdoc, "\nCas 2 colonne 2 sans espace: %5d ", cas2 );
 +
        fprintf( pfdoc, "\nCas 3 colonne 2 avec espace: %5d \n", cas3 );
 +
#endif
 +
        return;
 +
    } /*S fortran */
 +
 
</pre>
</pre>
[[Catégorie:Générateurs de documentation]]
[[Catégorie:Générateurs de documentation]]

Version du 22 avril 2013 à 09:00

Retour aux fichiers en développement →

fortran.inc.c à revoir, il n'est pas indépendant !

Modèle:Menu déroulant début

/*P
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
            the file in windowed version of mkd with gtkmm
FUNCTION : fortran_()
 
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: ../../1991 by JPL mkdoc 3.12 for PC and UNIX
Date: 17/04/2013 by Clara; Mise à jour vers UTF-8 et correction de fin de 
                    fichier pour version 2013 + introduction de la nouvelle
                    entête mkd* + numérotation des lignes.
Date: 21/04/2013 by JPL Nettoyage du code après les testsb unitaires.

*/
// Date: ../../.... by ... purpose of the modification ....

/*T
FILE NAMES: fortran.c for konsole, or fortran.cc or fortran.inc.cc to include
            the file in windowed version of mkd with gtkmm
FUNCTION : fortran_()
 
RECOMMANDED TESTS:
  Cette fonction doit décoder les commentaires style Fortran 77. 
  Pour le fortran 90 et ultérieurs Voir NOTES et option -l dans version.h

  Dès la version 2013 le caractère de décodage se place en 3 ème colonne
  Comme il est d'usage, ceci contrairement aux versions précédentes où
  le caractère de décodage se plaçait uniquement en 2 ème colonnes.
  Colonne |1|2|3|4|5|6|7|8|9|A|B|C|....To 72
          |C| |O| |C|o|m|m|e|n|t| |....| | | depuis version 2013
          |C|O| |C|o|m|m|e|n|t| | |....| | | toutes versions
          |C| |C|o|m|m|e|n|t| | | |....| | | toutes versions avec Codes '**'
  Notez que le 'Code' peut être placé en 2ème ou 3ème colonne.

TETS UNITAIRES:
  Veiller à ce que les commentaires restent à la bonne place quelle que soient
  les colonnes utilisées pour le décodage (2ème ou 3éme colonne) augmenté du 
  numéro de ligne.
  Vérifier dans cette nouvelle version, que le numéro de ligne s'écrit 
  correctement, sur 5 colonnes.
  Veiller à ce que le fichier cible ne contienne jamais le caractère de fin de
  fichier EOF.
  
  3 cas peuvent se présenter:
  Cas 1 : Codes est '**' tous les caractères doivent être copiés
  Cas 2 : colonne 2 identifie le commentaire de la ligne à copier
  cas 3 : Colonne 2 est un espace et colonne 3 identifie la ligne de commentaire
          à copier
  Vérifiez tous les cas avec les options n,s,t

  Testez de la même façon le fortran 90 avec l'option de compilation CD3 = '!'

*/

// Description de la fonction: (Utile pour le manuel man 3)
/*D
 NAME:
  Function: fortran_().
  Files: fortran.c for Kosole or fortran.cc or fortran.inc.cc for included
  file in windowed version with gtkmm

 SYNOPSIS:
  In UNIX / LINUX environment:
  #include "/usr/include/mkd/version.h" // IMPORTANT: Compilation directives
  #include "/usr/include/mkd/fortran.h" // or mkd.h
  In local environment:
  #include "version.h"
  void fortran_(FILE * pfdoc, FILE * pnfile);

 DESCRIPTION:
  Fortran 77: (ASCII)
  -------------------
  Originally Fortran programs were written in a fixed column format for the 
  cards. 
  A letter "C" in column 1 caused the entire card to be treated as a comment
  and ignored by the compiler.
  Usage:
  The comment character begin with the C or c or * in first colomn frequently
  followed by a space and shall not exceed the 72nd colomn for fortran 77.
  The mkd 'Code' character de must by placed in the 2nd or in 3rd colomn.
  
  The golbal variables are 'Codes' and 'Options'.
  The 'Codes': table of 5 characters:
      extern char codes[]; 
      They must be défined in the calling function:
      char codes[5] = {0,0,0,0,0};
  The 'Options': l,n,s,t. 
      see NOTES for inline ! comment
      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 on 5 colomns. This allows to 
      easily reach the commented line. (Warning with the tabs ...)
   s: Add the comment to the screen to use shell redirections > , >> , or ||.
   t: With the t option only the commented text is copied.
      Without the t option the entire line or block is copied.
      The t option permit to generate directly exploitable and publishable
      documents. 

 RETURN VALUE:
  Nothing

 CONFORMING TO: or STANDARDS: 
  POSIX, ANSI C, BSD, ISO/IEC 9899:2011; gcc, MS-Vc10; UTF-8.

 PORTABILITY:
  LINUX-Debian-systems, LINUX-Red-Hat, Windows NT, etc.

 COPYRIGHT:
  © Contact: http://edeulo.free.fr/contacts/formmail.php
  © EELL, Éditeurs Européens de Logiciels Libres, 2007
  Association à but non lucratif selon l'Article 11 de la convention européenne 
  des droits de l'homme.

 AUTHORS:
  Designer: intial JP Louyot (JPL)
  Updates : JPL and Clara Jimenez
  Traducteurs: Clara

 RESSOURCES:
  gtkmm with mkdw future widowed version.

 NOTES:
  Update April 2013 the Coded comment begin also in 3rd colomn

 BUGS:
  See bugs reports http://edeulo.free.fr/phpBB3

 SEE ALSO:
  Fortran 90:
  -----------
  Character ! is the inline comment starting with this character to NewLine.
  See -l compilation option #define CD3 '!' in version.h

  Fortran 2003:
  -------------
  The interface with the C languages are insured with the external module
  ISO_C_BINDING to facilitate access at the C libraries.

  mkd for fortran 90 with the -l option: Decode The inline comment '!' if the
  option CD3 are defined with the char '!' in version.h.
  Unix / Linux Man(3) attached in English. Command line : man 3 fortran_
 
*/

/*H  
	// File: fortran.c (Comments for UTF-8 text editor)
	void fortran_ (FILE * pfdoc, FILE * pnfile);
*/

/** #########################################
    #                FORTRAN                #
    ######################################### */

#ifndef GTKMM 
  // If GTKMM is not defined then it is a Konsole version
  // when GTKMM is defined the file is included to the compilation
  // *pfdoc and *pnfile are open by the calling function
#include "version.h"
#include "fortran.h"

void fortran_(FILE * pfdoc, FILE * pnfile)
    { /*S fortran */
        extern unsigned char n,s,t;
        extern char codes[];
#else
    { //S Function begin for gtkmm (with fortran.cc included file)
#endif
// #define TESTS
#ifdef TESTS
        int cas1 = 0; //T pour les tests
        int cas2 = 0; //T pour les tests
        int cas3 = 0; //T pour les tests
#endif
        int inbc = 0;      // nombre de caractères sur la pile
        unsigned num = 0; // Numéro de ligne
        unsigned i ;      // Compteur
        int copyflag = 0;  // drapeau commentaire à copier
        register int c0;  // entier dans le registre du processeur
        int c1,c2,c3;      // entiers en mémoire vive sur la pile
/*O    initialisation des valeurs sur la pile à NULL */
        c0 = c1 = c2 = c3 = 0; 

/*O    tant que l'on n'est pas en fin de fichier source */
        while ( c0 != EOF && c1 != EOF && c2 != EOF && c3 != EOF )
        { /*S tq !EOF */        
/*O        si début de texte faire c0 = retour chariot */
            if (!c0) c0='\n'; // ceci impose la première colonne
/*O        sinon copier dans le registre c0 le caractère suivant */
            else c0=getc(pnfile);
            if (c0 == EOF) break;

/*O------- si le char est NL le caractère suivant est en 1ère colonne ------*/
            if (c0=='\n') // précède la première colonne
            { /*S colonne 1 */
/*O            si suivi par c1 = 'C' ou 'c' ou '*' */
              /* et si codes[0]=0 ou si suivi par un espace et un des 5 char 
               code d'utilisateur */
                num++;
                copyflag = 0;
                c1 = getc(pnfile);
                if (c1 == EOF) break; // quitter si le caractère en 1 ère colonne est EOF 
                inbc = 1; // 1 caractère copié sur la pile (c1)
                if (c1 == 'C' || c1 == 'c' || c1 == '*')
                { /*O carte de commentaire */
/*O                si il n'y a pas de 'Code' à décrypter copier tous les commentaires */
                    if ( !codes[0] )
                    { /* Cas 1 copier tous les commentaires ('Code' NULL) */
#ifdef TESTS
    cas1++;
#endif
                        copyflag = 1;
                        if (n) fprintf( pfdoc,"%5d ", num );
/*O                    copier le début de ligne 1 ère colonne si t est invalide */
                        if (!t) putc (c1,pfdoc); // colonne 1
                        else putc (' ',pfdoc); // colonne 2
/*O                    si option s copier de même à la sortie standard */
                        if (s && n) printf("%5d ", num );
                        if (!t) putch(c1);
                        else putch(' '); // colonne 2
                    } /* Cas 1 copier tous les commentaires ('Code' NULL) */

/*O                sinon, identifier les codes en 2ème ou 3ème colonne: */
                    else
                    { /*S commentaire ok cas 2 ou 3 (avec 'Code')*/
                        c2 = getc(pnfile);
                        if (c2 == EOF) break;
                        inbc=2; // 2 caractères copiés sur la pile (c1 + c2)
/*O                    si colonne 2 n'est pas un espace et qu'il y a des 'Codes', identifier */
                        if (c2 != ' ') 
                        { /*S cas 2 si colonne 2 n'est pas un espace */
#ifdef TESTS
    cas2++;
#endif

                            if (
                                c2 == codes[0] ||
                                c2 == codes[1] ||
                                c2 == codes[2] ||
                                c2 == codes[3] ||
                                c2 == codes[4]
                               )
                            copyflag = 1; // copyflag vrai si le code est identifié

                        } /*S cas 2 si colonne 2 n'est pas un espace */
/*O                    sinon si la 2ème colonne est un espace identifier la 3 ème colonne */
                        else if (c2 == ' ')
                        { /*S cas 3 colonne 2 est un espace */
#ifdef TESTS
    cas3++;
#endif

                            c3 = getc(pnfile);
                            if (c3 == EOF) break;
                            inbc = 3; // 3 caractères copiés sur la pile (c0 + c1 + c2)
                            if (
                                c3 == codes[0] ||
                                c3 == codes[1] ||
                                c3 == codes[2] ||
                                c3 == codes[3] ||
                                c3 == codes[4]
                               )
                            copyflag = 1; // copyflag vrai si colonne 3 identifiée 'Code'
                        } /*S cas 3 colonne 2 est un espace */
                    } /*S commentaire ok cas 2 ou 3 (avec 'Code')*/

/*O                si le texte est à copier dans le fichier cible: */
                    if (copyflag) // donc pas de EOF dans c0 c1 c2 c3 et 'Code' existe
/*O                alors copier les caractères dans le fichier doc, et si opt s copier à 
                   la sortie standard: */
                    { /*S copier */
/*O                    si pas option t et 'Code' présent */
                        if(!t && inbc > 1)
                        { /*S copier le début de la ligne */
/*O                        si n vrai copier le numéro de ligne sur 5 chiffres 
                           décimaux */
                            if (n) fprintf( pfdoc,"%5d ", num );
/*O                        copier le début de ligne */
                            putc (c1,pfdoc); // colonne 1
                            if (inbc > 1 ) putc(c2,pfdoc);   // Colonne 2 
                            if (inbc == 3) putc(c3,pfdoc);   // 3ème colonne
/*O                        si opt s copier aussi à la sortie standard */
                            if(s)
                            { /*S si opt s copier aussi à la sortie standard */
                                if (n) printf("%5d ", num );
                                putch(c1);
                                if (inbc > 1 ) putch(c2);
                                if (inbc == 3) putch(c3);
                            } /*S si opt s */
                        } /*S copier le début de la ligne */

/*O                    sinon, (option t) et 'Code présent */
                        else if (t && inbc > 1) //w (!codes[0]) // sinon si pas de 'Code'
                        { /*S espaces en début de ligne */
/*w                       si n est vrai, copier le numéro de ligne dans le fichier
                          cible et à la sortie standard */
                           if (n) fprintf( pfdoc,"%5d ", num ); // target file
                           if(s) printf("%5d ", num );          // stdout
/*O                       remplacer les premières colonne  par des espaces */
                           for (i=inbc ; i>0 ; i--) 
                           { /*S espaces */
                               putc(' ',pfdoc);
                               putch(' ');
                           } /*S espaces */
                        } /*S espaces en début de ligne */

/*O                    Dans tous les cas de commentaires la suite du commentaire est à copier */
/*O                    tant que pas fin de ligne et pas EOF (On ne soucie pas du
                       nombre de 72 colonnes) */
                        while ( ( c0=getc(pnfile) ) != '\n' && c0 != EOF )
                        { /*S while copy line */
/*O                        copier les chars de la ligne */
                            putc (c0,pfdoc);
                            if(s)putch(c0);
                        } /*S while copy line */

/*O                    si on est arrivé en fin de fichier avant NL */
                        if ( c0 == EOF )
                        { /* cas EOF */
/*O                        //w copier NL dans le fichier cible et à la sortie standard */
                           //w pas obligatoire car ajoute une ligne vide
                            //w putc ('\n',pfdoc); //w pas obligatoire
                            //w if(s) putch('\n'); //w pas obligatoire
/*O                        interrompre la boucle */
                            break;
                        } /* cas EOF */                   
/*O                    copier le dernier caractère (non EOF, donc NL) */
                        putc (c0,pfdoc);
                        if(s) putch('\n');
/*O                    revenir sur NL du fichier source  pour continuer la boucle en colonne 1 */
                        ungetc(c0,pnfile);
                    } /*S copier */
                } /*O carte de commentaire */

/*O            sinon ne pas copier dans le fichier doc et revenir sur les derniers
               caractères */
                else
                { /*S sinon, pas copier */
                    if (inbc-- == 3) ungetc(c3,pnfile); // 3 caractères copiés
                    if (inbc-- == 2) ungetc(c2,pnfile); // 2 caractères copiés
                    if (inbc-- == 1) ungetc(c1,pnfile); // C en 1ère colonne
                    ungetc(c1,pnfile); // cas NL en 1ère colonne
                } /*S sinon, pas copier */
            } /*S colonne 1 */
            inbc = 0 ; //w pas nécessaire si remis à 0 à la fin des blocs
        } /*S tq !EOF */
#ifdef TESTS
        fprintf( pfdoc, "\nCas 1 tous les commentaires: %5d ", cas1 );
        fprintf( pfdoc, "\nCas 2 colonne 2 sans espace: %5d ", cas2 );
        fprintf( pfdoc, "\nCas 3 colonne 2 avec espace: %5d \n", cas3 );
#endif
        return;
    } /*S fortran */

Outils personnels