Projet mkd/pascal.c

De Wiki EELL.

(Différences entre les versions)
m (!)
m
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>
 +
: pascal.inc.c : Ce fichier est à revoir, il n'est pas indépendant
 +
<pre>
 +
/*E �C�*/
 +
/** #########################################
 +
    #                PASCAL                #
 +
    ######################################### */
 +
/*  maj R3.0  09/06/89 */
 +
/*P maj R3.1  30/12/90 par JPL */
 +
/*P maj R3.11 09/01/91 par JPL */
 +
void pascal_(FILE * pfdoc, FILE * pnfile)
 +
// FILE *pfdoc, *pnfile;
 +
    { /*S pascal */
 +
    extern unsigned char l,n,p,s,t; /*P rappels */
 +
    extern char codes[];
 +
    unsigned int i, tab;
 +
    unsigned 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 : */
 +
          if(c1=='\n')
 +
          { /*S*/
 +
/*O          incr‚menter le num‚ro de ligne */
 +
              num++;
 +
/*O          reperer la position suivant NL dans nl et mettre nb tabulations … 0 */
 +
              nl=ftell(pnfile);
 +
              tab=0;
 +
          } /*S*/
 +
 +
/*O------ decodage Pascal ---------------------------------------------------*/
 +
/*O          si le char est '{' ou si le char est '(' suivi de '*' */
 +
              if( (c1=='{') || (c1=='(' && (c2=getc(pnfile))=='*') )
 +
/*O          alors: */
 +
              { /*S char = d‚but commentaire */
 +
              c3=getc(pnfile);
 +
/*O            si codes[0]=0 ou si d‚but de commentaire est suivi par c3 char code utilisateur */
 +
                if(!codes[0]||
 +
                    c3 == codes[0] ||
 +
                    c3 == codes[1] ||
 +
                    c3 == codes[2] ||
 +
                    c3 == codes[3] ||
 +
                    c3 == codes[4]
 +
                  )
 +
/*O          alors: */
 +
                { /*S traiter le commentaire */
 +
/*O            reperer la position commentaire dans la ligne */
 +
                if(!codes[0]) ungetc(c3,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 autant de tab que dans le source */
 +
                    for(i=0;i<tab;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-tab);i>0;i--)
 +
                      { /*S*/
 +
                      putc(' ',pfdoc);
 +
                      if(s)putch(' ');
 +
                      } /*S*/
 +
                    } /*St*/
 +
 +
 +
/*O                puis tq ne rencontre pas le char '}' ou '*' suivi de ')', copier le commentaire */
 +
                    while ( !(
 +
                                            (c1=getc(pnfile)) == '}' ||
 +
                              ( c1=='*' && (c2=getc(pnfile)) == ')' )
 +
                            )  )
 +
                    { /*S commentaire seul */
 +
                      if (c1=='*') ungetc(c2,pnfile);
 +
                      putc(c1,pfdoc);
 +
                      if(s)putch(c1);
 +
/*O                  si option n et NL ajouter le num‚ro de ligne */
 +
                      if(n && c1=='\n')
 +
                      { /*S*/
 +
                      num++;
 +
                      fprintf(pfdoc,"%5d ",num);
 +
                      if(s)  printf("%5d ",num);
 +
                      } /*S*/
 +
                    } /*S commentaire seul */
 +
 +
 +
#ifdef FULL_LINE    /*O *** FULL_LINE *** */
 +
/*O                si pas option t */
 +
                    if(!t)
 +
                    { /*S*/
 +
/*O                  copier les chars y compris code fin de comm. jusqu'en fin de ligne */
 +
                      if(c1=='*') ungetc(c2,pnfile);
 +
                      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 'retour chariot' */
 +
                      while ( (c1=getc(pnfile)) != '\n' )
 +
                          if( c1=='\r' )
 +
                          { /*S*/
 +
                            putc( c1, pfdoc );
 +
                            if(s) putch( c1 );
 +
                          } /*S*/
 +
                    } /*S*/
 +
                    putc(c1,pfdoc);if(s)puts("");  /*O copier NL (Cr/Lf ‚cran)*/
 +
                    ungetc(c1,pnfile);              /*O revenir sur NL */
 +
                } /*S traiter le commentaire */
 +
 +
/*O            sinon: */
 +
                else
 +
                { /*S pas le cas commentaire */
 +
                ungetc(c3,pnfile);
 +
                if (c1=='(') ungetc( c2, pnfile );
 +
                } /*S pas le cas commentaire */
 +
              } /*S char = d‚but commentaire */
 +
/*O          sinon: si char='\t' incrementer tab */
 +
              else if(c1=='\t')tab++;
 +
        } /*S tq !EOF */
 +
    } /*S pascal */
 +
</pre>
[[Catégorie:Générateurs de documentation]]
[[Catégorie:Générateurs de documentation]]

Version du 19 décembre 2010 à 14:55

Retour aux fichiers en développement →

pascal.inc.c : Ce fichier est à revoir, il n'est pas indépendant
/*E �C�*/
/** #########################################
    #                PASCAL                 #
    ######################################### */
/*  maj R3.0  09/06/89 */
/*P maj R3.1  30/12/90 par JPL */
/*P maj R3.11 09/01/91 par JPL */

void pascal_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
     { /*S pascal */
    extern unsigned char l,n,p,s,t; /*P rappels */
    extern char codes[];
    unsigned int i, tab;
    unsigned 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 : */
           if(c1=='\n')
           { /*S*/
/*O          incr‚menter le num‚ro de ligne */
              num++;
/*O          reperer la position suivant NL dans nl et mettre nb tabulations … 0 */
              nl=ftell(pnfile);
              tab=0;
           } /*S*/

/*O------ decodage Pascal ---------------------------------------------------*/
/*O          si le char est '{' ou si le char est '(' suivi de '*' */
              if( (c1=='{') || (c1=='(' && (c2=getc(pnfile))=='*') )
/*O          alors: */
              { /*S char = d‚but commentaire */
              c3=getc(pnfile);
/*O             si codes[0]=0 ou si d‚but de commentaire est suivi par c3 char code utilisateur */
                 if(!codes[0]||
                    c3 == codes[0] ||
                    c3 == codes[1] ||
                    c3 == codes[2] ||
                    c3 == codes[3] ||
                    c3 == codes[4]
                   )
/*O          alors: */
                 { /*S traiter le commentaire */
/*O             reperer la position commentaire dans la ligne */
                 if(!codes[0]) ungetc(c3,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 autant de tab que dans le source */
                    for(i=0;i<tab;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-tab);i>0;i--)
                       { /*S*/
                       putc(' ',pfdoc);
                       if(s)putch(' ');
                       } /*S*/
                    } /*St*/


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


#ifdef FULL_LINE     /*O *** FULL_LINE *** */
/*O                si pas option t */
                    if(!t)
                    { /*S*/
/*O                   copier les chars y compris code fin de comm. jusqu'en fin de ligne */
                       if(c1=='*') ungetc(c2,pnfile);
                       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 'retour chariot' */
                       while ( (c1=getc(pnfile)) != '\n' )
                          if( c1=='\r' )
                          { /*S*/
                             putc( c1, pfdoc );
                             if(s) putch( c1 );
                          } /*S*/
                    } /*S*/
                    putc(c1,pfdoc);if(s)puts("");   /*O copier NL (Cr/Lf ‚cran)*/
                    ungetc(c1,pnfile);               /*O revenir sur NL */
                 } /*S traiter le commentaire */

/*O             sinon: */
                 else
                 { /*S pas le cas commentaire */
                 ungetc(c3,pnfile);
                 if (c1=='(') ungetc( c2, pnfile );
                 } /*S pas le cas commentaire */
              } /*S char = d‚but commentaire */
/*O          sinon: si char='\t' incrementer tab */
              else if(c1=='\t')tab++;
        } /*S tq !EOF */
     } /*S pascal */
Outils personnels