Projet mkd/special.c
De Wiki EELL.
Version du 19 décembre 2010 à 15:00 par JPL (discuter | contributions)
Retour aux fichiers en développement → Fichier special.inc.c : Ce fichier n'est pas indépendant il est nécessaire de le revoir.
/** #########################################
# SPE. SHELL #
######################################### */
/* maj: 23/3/89 */
/**
Ce programme copie les commentaires des lignes contenant le caractere # et
les lignes qui suivent le caractere '\'.
*/
void shell_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
{ /*S shell */
extern unsigned char l,p;
extern char codes[];
unsigned int i;
long ll,nl;
register char c1;
char c2,c3;
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 suivant NL dans nl */
if(c1=='\n')nl=ftell(pnfile);
else
{ /*S !NL */
/*O si le char est '#' */
if (c1=='#')
/*O alors: */
{ /*S char = # */
/*O si options[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 comment*/
/*O reperer la position commentaire */
if(!codes[0])ungetc(c2,pnfile);
ll=ftell(pnfile);
/*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 LF, dans le fichier doc */
while ( (c1=getc(pnfile)) != '\n')
{
putc(c1,pfdoc);
if(s)putch(c1);
}
} /*S*/
/*O sinon: */
else
{ /*S*/
/*O copier des blancs jusqu'a la position commentaire */
for(i=(int)(ll-nl);i>0;i--)
{ /*S*/
putc(' ',pfdoc);
if(s)putch(' ');
} /*S*/
/*O puis copier le commentaire tq pas fin de commentaire */
while (c1!='\n')
{ /*S*/
/*O copier le commentaire tq pas NL ou pas char '\' */
while ( (c1=getc(pnfile)) != '\n' && c1!='\\' )
{ /*S*/
putc(c1,pfdoc);
if(s)putch(c1);
} /*S*/
/*O si le char est '\' */
if (c1== '\\')
/*O alors: */
{
/*O copier jusqu'a NL et masquer NL */
while ( c1 != '\n')
{ /*S*/
putc(c1,pfdoc);
if(s)putch(c1);
c1=getc(pnfile);
} /*S*/
putc(c1,pfdoc);if(s)putch(c1);
c1=0; /* masquage */
}
} /*S*/
} /*S*/
putc('\n',pfdoc);if(s)putch('\n'); /*O copier NL */
ungetc(c1,pnfile); /*O revenir sur NL */
} /*S comment */
/*O sinon: */
else
{
ungetc(c2,pnfile);
}
} /*S char = # */
} /*S cas lignes */
} /*S !NL */
} /*S tq !EOF */

