Projet mkd/c.c
De Wiki EELL.
Version du 19 décembre 2010 à 14:16 par JPL (discuter | contributions)
- Lentête est absente !
/*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_ */

