Projet mkd/c.c

De Wiki EELL.

Retour aux fichiers en développement →

c.inc.c: Lentête est absente ! à revoir !
/*E */
/** #########################################
    #                  C_                   #
    ######################################### */

/* maj: R3.0  09/06/89 */
/*P maj R3.11 09/01/91 */

void c_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
     { /*S C_ */
     extern unsigned char l,p;
     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 pointe */
           else c1=getc(pnfile);
/*O       si le char est NL reperer la position qui suit NL, dans nl */
           if(c1=='\n')
           { /*S*/
             nl=ftell(pnfile);
             tab=0;
             num++;
           } /*S*/
           else
           { /*S !NL */
/*O          si le char est '\t' incrementer tab */
              if (c1=='\t')tab++;
/*O          sinon si le char est '/' */
              else if(c1=='/')
/*O          alors: */
              { /*S char = '/' */
              c2=getc(pnfile);
              c3=getc(pnfile);
/*O             si suivi par c2 = '*' et si options[0]=0 ou si suivi par char code utilisateur */
                 if(c2=='*'&&(!codes[0]||
                              c3 == codes[0] ||
                              c3 == codes[1] ||
                              c3 == codes[2] ||
                              c3 == codes[3] ||
                              c3 == codes[4]
                             )
                   )
/*O          alors: */
                 { /*S traiter le commentaire C */
/*O             reperer la position commentaire */
                 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 des tab autant qu'il y en a dans le source */
                       for(i=0;i<tab;i++)
                       { /*S*/
                       putc('\t',pfdoc);
                       if(s)putch('\t');
                       } /*S*/

/*O                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 * suivi de /, copier le commentaire */
                    while ( !(c1=='*' && c2=='/') )
                    { /*Sw*/
                    if( (c1=getc(pnfile)) != '*')
                       { /*S*/
/*www                  if(c1=='\n') fprintf(pfdoc, "%s", NL );*/ /*P CR/LF sous DOS */
/*www                  else */
                       putc(c1,pfdoc);
                       if(s)putch(c1);
/*O                   si option n et char=NL ins‚rer le num‚ro de ligne */
                       if( n && c1=='\n' )
                          { /*S*/
                          num++;
                          fprintf( pfdoc,"%5d ", num );
                          if(s) printf("%5d ", num );
                          } /*S*/
                       } /*S*/
                    else /*P (c1='*' voir c2) */
                       { /*S*/
                       if((c2=getc(pnfile))=='/')
                          { /*S*/
                          ungetc(c2,pnfile);
                          ungetc(c1,pnfile); /* pour la recopie fin de ligne */
                          } /*S*/
                       else /*P c1 = toujours '*' */
                          { /*S fausse alerte */
                          ungetc(c2,pnfile);
                          putc(c1,pfdoc);
                          if(s)putch(c1);
                          } /*S fausse alerte */
                       } /*S*/
                    } /*Sw*/


#ifdef FULL_LINE     /*O Opt. compil. *** FULL_LINE *** */
/*O                si pas option t */
                    if(!t)
                    { /*S*/
/*O                   copier les chars jusqu'en fin de ligne  y compris '\r' sous DOS */
                       while ( (c1=getc(pnfile)) != '\n' )
                       { /*S*/
                       putc(c1,pfdoc);
                       if(s)putch(c1);
                       } /*S*/
                    } /*S*/
/*O                sinon (option t) */
                    else
#endif               /*O Opt. compil. 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*/
/*O                puis envoyer les NL sous forme \n */
/*www                    fprintf(pfdoc, "%s", NL );*/
/*www                    if(s) puts("");*/
                    putc(c1,pfdoc);
                    if(s)putch(c1);
                    ungetc(c1,pnfile);                   /*O revenir sur NL */
                 } /*S traiter le commentaire C */

/*O             sinon: */
                 else
                 { /*S pas le cas */
                 ungetc(c3,pnfile);
                 ungetc(c2,pnfile);
                 } /*S pas le cas */
              } /*S endif char = '/' */
           } /*S endif!NL */
        } /*S end tq !EOF */
     } /*S C_ */
Outils personnels