Projet mkd/tri.c

De Wiki EELL.

(Différences entre les versions)
m (!!)
m
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 */
 +
 +
/**
 +
Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
 +
metres CD1 CD2 CD3 CD4 CD5 compiles.
 +
avec l'option l (copie de ligne):
 +
CD1 et CD2 sont des caracteres debut de commentaires a placer en debut de
 +
ligne comme en FORTRAN: c ou C ou * .
 +
CD3 est un caractere debut de commentaire que l'on peut placer en tout point
 +
d'une ligne comme ; en assembleur, # en shell ou % en postcript.
 +
Cette fonction permet des tris differents de SHELL_.C vu qu'elle ignore si
 +
# est dans une chaine ou si elle est precedee du char \ .
 +
avec l'option p (copie de page ):
 +
CD4 est le caractere de debut 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 chaines de caracteres afin d'editer un dictionnaire syntaxique
 +
toutefois " etant a la fois debut et fin de caractere le resultat n'est pas
 +
assure.
 +
*/
 +
 +
void tri_(FILE * pfdoc, FILE * pnfile)
 +
// FILE *pfdoc, *pnfile;
 +
    { /*S tri */
 +
    extern unsigned char l,p,s,t;
 +
    extern char codes[];
 +
    unsigned int i,tabl,tabp;
 +
    unsigned int num;
 +
    long ll,nl;
 +
    register int c1;
 +
    int c2,c3;
 +
 +
    num = 0;
 +
    c1 = c2 = c3 = STX; /* Start Text */
 +
 +
/*O    tant que pas fin de fichier source */
 +
        while ( c1 != EOF && c2 != EOF && c3 != EOF )
 +
        { /*S tq !EOF */
 +
/*O      si debut de texte faire c1=LF */
 +
          if (c1==STX) c1='\n';
 +
/*O      sinon prendre pour c1 le char suivant */
 +
          else c1=getc(pnfile);
 +
/*O      si le char est NL reperer la position suivant NL dans nl */
 +
          if(c1=='\n')
 +
          { /*S*/
 +
          num++;
 +
          nl=ftell(pnfile);
 +
          tabl=tabp=0;
 +
          } /*S*/
 +
 +
/*O###### si option ligne ###################################################*/
 +
          if  (l)
 +
          { /*S cas lignes */
 +
 +
/*O--------- si le char est NL ---------------------------------------------*/
 +
              if (c1=='\n')
 +
              { /*S colonne 1 */
 +
/*O          si suivi par c2 = CD1 ou CD2 ou CD3
 +
                et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */
 +
              c2 = getc(pnfile);
 +
              c3 = getc(pnfile);
 +
              if( (c2 == CD1 ||
 +
                  c2 == CD2 ||
 +
                  c2 == CD3
 +
                  )
 +
                  &&
 +
                  (!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: */
 +
                { /*S*/
 +
/*O            si option n ins‚rer le num‚ro de ligne  */
 +
                if(n)
 +
                { /*S*/
 +
                    fprintf( pfdoc ,"%5d ", num );
 +
                    if(s) printf( "%5d ", num );
 +
                } /*S*/
 +
/*O            si pas option t */
 +
                if(!t)
 +
                    { /*S*/
 +
/*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 */
 +
                while ( (c1 = getc(pnfile)) != '\n')
 +
                    { /*S w copy line */
 +
/*O                copier les chars de la ligne */
 +
                    putc (c1,pfdoc);if(s)putch(c1);
 +
                    } /*S w copy line */
 +
/*O            copier le dernier caractere */
 +
                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 */
 +
 +
 +
/*O          sinon: */
 +
              else
 +
              { /*S else */
 +
/*O---------    si c1 = 'CD3' (&  option ligne) --------------------------*/
 +
                if (c1==CD3)
 +
                { /*S char = CD3 */
 +
/*O                si codes[0]=0 ou si suivi par c2 = char code utilisateur */
 +
                    c2=getc(pnfile);
 +
                    if(!codes[0]||
 +
                      c2 == codes[0] ||
 +
                      c2 == codes[1] ||
 +
                      c2 == codes[2] ||
 +
                      c2 == codes[3] ||
 +
                      c2 == codes[4]
 +
                      )
 +
/*O                alors: */
 +
                    { /*S commentaire */
 +
/*O                  reperer la position commentaire */
 +
                      if(!codes[0])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                  si pas option t */
 +
                      if(!t)
 +
                      { /*S*/
 +
/*O                      se positionner en dedut de ligne */
 +
                          fseek(pnfile,nl,0);
 +
                          /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
 +
/*O                      copier toute la ligne tq pas NL LF, dans le fichier doc */
 +
                          while ( (c1=getc(pnfile)) != '\n')
 +
                          { /*S*/
 +
                          putc(c1,pfdoc);
 +
                          if(s)putch(c1);
 +
                          } /*S*/
 +
                      } /*S*/
 +
/*O                  sinon: (option t) */
 +
                      else
 +
                      { /*S*/
 +
/*O                      copier autant de tabulations qu'en source */
 +
                          for(i=0;i<tabl;i++)
 +
                          { /*S*/
 +
                          putc('\t',pfdoc);
 +
                          if(s)putch('\t');
 +
                          } /*S*/
 +
/*O                      puis copier des blancs jsqu'position commentaire */
 +
                          for(i=(int)(ll-nl-tabl);i>0;i--)
 +
                          { /*S*/
 +
                          putc(' ',pfdoc);
 +
                          if(s)putch(' ');
 +
                          } /*S*/
 +
 +
/*O                      puis copier le commentaire tq pas NL */
 +
                          while ( (c1=getc(pnfile)) != '\n')
 +
                          { /*S*/
 +
                          putc(c1,pfdoc);
 +
                          if(s)putch(c1);
 +
                          } /*S*/
 +
                      } /*S*/
 +
                      putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
 +
                      ungetc(c1,pnfile);                  /*O revenir sur NL */
 +
                    } /*S commentaire */
 +
/*O                sinon: */
 +
                    else
 +
                    { /*S*/
 +
                    ungetc(c2,pnfile);
 +
                    } /*S*/
 +
                } /*S char = CD3 */
 +
/*O            sinon si c1='\t' inc tabl */
 +
                else if(c1=='\t')tabl++;
 +
              } /*S else */
 +
          } /*S cas lignes */
 +
/*O###### si option page ####################################################*/
 +
          if (p)
 +
          { /*S cas page */
 +
/*O          si le char est identique a CD4 */
 +
              if(c1==CD4)
 +
              { /*S char = CD4 */
 +
              c2=getc(pnfile);
 +
/*O            si codes[0]=0 ou si c1 est suivi par c2 char code utilisateur */
 +
                if(!codes[0]||
 +
                    c2 == codes[0] ||
 +
                    c2 == codes[1] ||
 +
                    c2 == codes[2] ||
 +
                    c2 == codes[3] ||
 +
                    c2 == codes[4]
 +
                  )
 +
/*O          alors: */
 +
                { /*S traiter le commentaire */
 +
/*O            reperer la position commentaire */
 +
                if(!codes[0]) 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            si pas option t */
 +
                if(!t)
 +
                    { /*S!t*/
 +
/*O                se positionner en dedut de ligne */
 +
                    fseek(pnfile,nl,0);
 +
                    /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
 +
/*O                copier la ligne jusqu'au commentaire, dans le fichier doc */
 +
                    for(i=(int)(ll-nl);i>0;--i)
 +
                      { /*S*/
 +
                      c1=getc(pnfile);
 +
                      putc(c1,pfdoc);
 +
                      if(s)putch(c1);
 +
                      } /*S*/
 +
                    } /*S!t*/
 +
/*O            sinon: (option t) */
 +
                else
 +
                    { /*St*/
 +
/*O                copier les tabulations */
 +
                    for(i=0;i<tabp;i++)
 +
                      { /*S*/
 +
                      putc('\t',pfdoc);
 +
                      if(s)putch('\t');
 +
                      } /*S*/
 +
/*O                puis copier des blancs jusqu'a la position commentaire */
 +
                    for(i=(int)(ll-nl-tabp);i>0;i--)
 +
                      { /*S*/
 +
                      putc(' ',pfdoc);
 +
                      if(s)putch(' ');
 +
                      } /*S*/
 +
                    } /*St*/
 +
 +
 +
/*O                puis tq ne rencontre pas le char CD5, copier le commentaire */
 +
                    while ( (c1=getc(pnfile)) != CD5 )
 +
                    { /*S*/
 +
                    putc(c1,pfdoc);
 +
                    if(s)putch(c1);
 +
/*O                  si option n et NL incr‚menter et ajouter le num‚ro de ligne */
 +
                      if(n && c1=='\n')
 +
                      { /*S*/
 +
                          num++;
 +
                          fprintf(pfdoc, "%5d ", num );
 +
                          if(s) printf( "%5d ", num );
 +
                      } /*S*/
 +
                    } /*S*/
 +
 +
 +
#ifdef FULL_LINE    /*O *** FULL_LINE *** */
 +
/*O                si pas option t */
 +
                    if(!t)
 +
                    { /*S*/
 +
/*O                  copier les chars jusqu'en fin de ligne */
 +
                      ungetc(c1,pnfile);
 +
                      while ( (c1=getc(pnfile)) != '\n' )
 +
                      { /*S*/
 +
                      putc(c1,pfdoc);
 +
                      if(s)putch(c1);
 +
                      } /*S*/
 +
                    } /*S*/
 +
/*O                sinon (option t) */
 +
                    else
 +
#endif              /*O *** END FULL_LINE *** */
 +
                    { /*S*/
 +
/*O                  aller au bout de la ligne sans copier sauf les '\r' */
 +
                      while ( (c1=getc(pnfile)) != '\n' )
 +
                          if (c1=='\r')
 +
                          { /*S*/
 +
                            putc( c1, pfdoc );
 +
                            if(s) putch( c1);
 +
                          } /*S*/
 +
                    } /*S*/
 +
                    putc('\n',pfdoc);if(s)putch('\n');  /*O copier NL */
 +
                    ungetc(c1,pnfile);                  /*O revenir sur NL */
 +
                } /*S traiter le commentaire */
 +
 +
/*O            sinon: */
 +
                else
 +
                { /*S pas le cas */
 +
                ungetc(c2,pnfile);
 +
                } /*S pas le cas*/
 +
              } /*S char = CD4 */
 +
/*O          sinon si c1='\t' inc tabp */
 +
              else if(c1=='\t')tabp++;
 +
          } /*S cas page */
 +
        } /*S tq !EOF */
 +
    } /*S tri */
 +
</pre>
[[Catégorie:Générateurs de documentation]]
[[Catégorie:Générateurs de documentation]]

Version du 19 décembre 2010 à 15:23

Cette page n'est pas finie. Veuillez considérer le plan et le contenu comme incomplets et en préparation, temporaires et sujets à caution. Si vous souhaitez participer, il vous est recommandé de consulter sa page de discussion au préalable.

Retour aux fichiers en développement →

tri.inc.c : Ce fichier n'est pas indépendant, il est à revoir !
/*E �C�*/
/** #########################################
    #                  TRI                  #
    ######################################### */
/* maj 09/06/89 */
/*P maj R3.11 09/01/91 par JPL */

/**
Cette fonction de mkdoc permet le tri des commentaires en fonction des para-
metres CD1 CD2 CD3 CD4 CD5 compiles.
avec l'option l (copie de ligne):
CD1 et CD2 sont des caracteres debut de commentaires a placer en debut de
ligne comme en FORTRAN: c ou C ou * .
CD3 est un caractere debut de commentaire que l'on peut placer en tout point
d'une ligne comme ; en assembleur, # en shell ou % en postcript.
Cette fonction permet des tris differents de SHELL_.C vu qu'elle ignore si
# est dans une chaine ou si elle est precedee du char \ .
avec l'option p (copie de page ):
CD4 est le caractere de debut 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 chaines de caracteres afin d'editer un dictionnaire syntaxique
toutefois " etant a la fois debut et fin de caractere le resultat n'est pas
assure.
*/

void tri_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
     { /*S tri */
    extern unsigned char l,p,s,t;
    extern char codes[];
    unsigned int i,tabl,tabp;
    unsigned int num;
    long ll,nl;
    register int c1;
    int c2,c3;

    num = 0;
    c1 = c2 = c3 = STX; /* Start Text */

/*O    tant que pas fin de fichier source */
        while ( c1 != EOF && c2 != EOF && c3 != EOF )
        { /*S tq !EOF */
/*O       si debut de texte faire c1=LF */
           if (c1==STX) c1='\n';
/*O       sinon prendre pour c1 le char suivant */
           else c1=getc(pnfile);
/*O       si le char est NL reperer la position suivant NL dans nl */
           if(c1=='\n')
           { /*S*/
           num++;
           nl=ftell(pnfile);
           tabl=tabp=0;
           } /*S*/

/*O###### si option ligne ###################################################*/
           if  (l)
           { /*S cas lignes */

/*O--------- si le char est NL ---------------------------------------------*/
              if (c1=='\n')
              { /*S colonne 1 */
/*O          si suivi par c2 = CD1 ou CD2 ou CD3
                et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */
              c2 = getc(pnfile);
              c3 = getc(pnfile);
              if( (c2 == CD1 ||
                   c2 == CD2 ||
                   c2 == CD3
                  )
                  &&
                  (!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: */
                 { /*S*/
/*O             si option n ins‚rer le num‚ro de ligne  */
                 if(n)
                 { /*S*/
                    fprintf( pfdoc ,"%5d ", num );
                    if(s) printf( "%5d ", num );
                 } /*S*/
/*O             si pas option t */
                 if(!t)
                    { /*S*/
/*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 */
                 while ( (c1 = getc(pnfile)) != '\n')
                    { /*S w copy line */
/*O                copier les chars de la ligne */
                    putc (c1,pfdoc);if(s)putch(c1);
                    } /*S w copy line */
/*O             copier le dernier caractere */
                 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 */


/*O          sinon: */
              else
              { /*S else */
/*O---------    si c1 = 'CD3' (&  option ligne) --------------------------*/
                 if (c1==CD3)
                 { /*S char = CD3 */
/*O                si codes[0]=0 ou si suivi par c2 = char code utilisateur */
                    c2=getc(pnfile);
                    if(!codes[0]||
                       c2 == codes[0] ||
                       c2 == codes[1] ||
                       c2 == codes[2] ||
                       c2 == codes[3] ||
                       c2 == codes[4]
                       )
/*O                alors: */
                    { /*S commentaire */
/*O                   reperer la position commentaire */
                       if(!codes[0])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                   si pas option t */
                       if(!t)
                       { /*S*/
/*O                      se positionner en dedut de ligne */
                          fseek(pnfile,nl,0);
                          /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
/*O                      copier toute la ligne tq pas NL LF, dans le fichier doc */
                          while ( (c1=getc(pnfile)) != '\n')
                          { /*S*/
                          putc(c1,pfdoc);
                          if(s)putch(c1);
                          } /*S*/
                       } /*S*/
/*O                   sinon: (option t) */
                       else
                       { /*S*/
/*O                      copier autant de tabulations qu'en source */
                          for(i=0;i<tabl;i++)
                          { /*S*/
                          putc('\t',pfdoc);
                          if(s)putch('\t');
                          } /*S*/
/*O                      puis copier des blancs jsqu'position commentaire */
                          for(i=(int)(ll-nl-tabl);i>0;i--)
                          { /*S*/
                          putc(' ',pfdoc);
                          if(s)putch(' ');
                          } /*S*/

/*O                      puis copier le commentaire tq pas NL */
                          while ( (c1=getc(pnfile)) != '\n')
                          { /*S*/
                          putc(c1,pfdoc);
                          if(s)putch(c1);
                          } /*S*/
                       } /*S*/
                       putc('\n',pfdoc);if(s)putch('\n');   /*O copier NL */
                       ungetc(c1,pnfile);                   /*O revenir sur NL */
                    } /*S commentaire */
/*O                sinon: */
                    else
                    { /*S*/
                    ungetc(c2,pnfile);
                    } /*S*/
                 } /*S char = CD3 */
/*O             sinon si c1='\t' inc tabl */
                 else if(c1=='\t')tabl++;
              } /*S else */
           } /*S cas lignes */
/*O###### si option page ####################################################*/
           if (p)
           { /*S cas page */
/*O          si le char est identique a CD4 */
              if(c1==CD4)
              { /*S char = CD4 */
              c2=getc(pnfile);
/*O             si codes[0]=0 ou si c1 est suivi par c2 char code utilisateur */
                 if(!codes[0]||
                    c2 == codes[0] ||
                    c2 == codes[1] ||
                    c2 == codes[2] ||
                    c2 == codes[3] ||
                    c2 == codes[4]
                   )
/*O          alors: */
                 { /*S traiter le commentaire */
/*O             reperer la position commentaire */
                 if(!codes[0]) 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             si pas option t */
                 if(!t)
                    { /*S!t*/
/*O                se positionner en dedut de ligne */
                    fseek(pnfile,nl,0);
                    /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */
/*O                copier la ligne jusqu'au commentaire, dans le fichier doc */
                    for(i=(int)(ll-nl);i>0;--i)
                       { /*S*/
                       c1=getc(pnfile);
                       putc(c1,pfdoc);
                       if(s)putch(c1);
                       } /*S*/
                    } /*S!t*/
/*O             sinon: (option t) */
                 else
                    { /*St*/
/*O                copier les tabulations */
                    for(i=0;i<tabp;i++)
                       { /*S*/
                       putc('\t',pfdoc);
                       if(s)putch('\t');
                       } /*S*/
/*O                puis copier des blancs jusqu'a la position commentaire */
                    for(i=(int)(ll-nl-tabp);i>0;i--)
                       { /*S*/
                       putc(' ',pfdoc);
                       if(s)putch(' ');
                       } /*S*/
                    } /*St*/


/*O                puis tq ne rencontre pas le char CD5, copier le commentaire */
                    while ( (c1=getc(pnfile)) != CD5 )
                    { /*S*/
                    putc(c1,pfdoc);
                    if(s)putch(c1);
/*O                   si option n et NL incr‚menter et ajouter le num‚ro de ligne */
                       if(n && c1=='\n')
                       { /*S*/
                          num++;
                          fprintf(pfdoc, "%5d ", num );
                          if(s) printf( "%5d ", num );
                       } /*S*/
                    } /*S*/


#ifdef FULL_LINE     /*O *** FULL_LINE *** */
/*O                si pas option t */
                    if(!t)
                    { /*S*/
/*O                   copier les chars jusqu'en fin de ligne */
                       ungetc(c1,pnfile);
                       while ( (c1=getc(pnfile)) != '\n' )
                       { /*S*/
                       putc(c1,pfdoc);
                       if(s)putch(c1);
                       } /*S*/
                    } /*S*/
/*O                sinon (option t) */
                    else
#endif               /*O *** END FULL_LINE *** */
                    { /*S*/
/*O                   aller au bout de la ligne sans copier sauf les '\r' */
                       while ( (c1=getc(pnfile)) != '\n' )
                          if (c1=='\r')
                          { /*S*/
                             putc( c1, pfdoc );
                             if(s) putch( c1);
                          } /*S*/
                    } /*S*/
                    putc('\n',pfdoc);if(s)putch('\n');   /*O copier NL */
                    ungetc(c1,pnfile);                   /*O revenir sur NL */
                 } /*S traiter le commentaire */

/*O             sinon: */
                 else
                 { /*S pas le cas */
                 ungetc(c2,pnfile);
                 } /*S pas le cas*/
              } /*S char = CD4 */
/*O          sinon si c1='\t' inc tabp */
              else if(c1=='\t')tabp++;
           } /*S cas page */
        } /*S tq !EOF */
     } /*S tri */
Outils personnels