Projet mkd/shell.c
De Wiki EELL.
(Différences entre les versions)
JPL (discuter | contributions) m (!) |
JPL (discuter | contributions) m |
||
| Ligne 1 : | Ligne 1 : | ||
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | <small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | ||
| + | : shell.inc.c : Ce fichier est à revoir, il n'est pas indépendant. | ||
| + | <pre> | ||
| + | /*E �C�*/ | ||
| + | /** ######################################### | ||
| + | # SHELL # | ||
| + | ######################################### */ | ||
| + | /* maj: 09/06/89 */ | ||
| + | /*P maj R3.11 3/1/91 par JPL */ | ||
| + | /** (fonction de mkdoc3.c) | ||
| + | Ce programme copie les commentaires des lignes contenant le caractere # | ||
| + | suivi par un des caracteres codes entres en parametre. Si le caractere | ||
| + | '#' est precede de \ ou si il est integre dans une chaine, alors il n'est | ||
| + | pas considere comme debut de commentaire. | ||
| + | */ | ||
| + | void shell_(FILE * pfdoc, FILE * pnfile) | ||
| + | // FILE *pfdoc, *pnfile; | ||
| + | { /*S shell */ | ||
| + | extern unsigned char s,t; | ||
| + | extern char codes[]; | ||
| + | unsigned int i,tab; | ||
| + | unsigned int num; | ||
| + | long ll,nl; | ||
| + | register int c1; | ||
| + | int c2; | ||
| + | |||
| + | num = 0; | ||
| + | c1 = c2 = STX; /* Start Text */ | ||
| + | |||
| + | /*O tant que pas fin de fichier source */ | ||
| + | while ( c1 != EOF && c2 != 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*/ | ||
| + | num++; | ||
| + | nl=ftell(pnfile); | ||
| + | tab=0; | ||
| + | } /*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 aller jusqu'au prochain '\"' */ | ||
| + | { /*S string */ | ||
| + | /*O tant que le caractere suivant n'est pas " */ | ||
| + | while ((c1=getc(pnfile))!='\"') | ||
| + | { /*S*/ | ||
| + | /*O si le char est EOF envoyer messg erreur et quitter la boucle */ | ||
| + | if (c1==EOF) | ||
| + | { /*S*/ | ||
| + | printf("\nmismatch string error in %s\n",pnfile); | ||
| + | break; | ||
| + | } /*S*/ | ||
| + | } /*S*/ | ||
| + | } /*S string */ | ||
| + | /*O sinon si le char est bakslatch: */ | ||
| + | else if (c1=='\\') | ||
| + | /*O alors: */ | ||
| + | { /*S*/ | ||
| + | /*O si le char suivant est # : */ | ||
| + | if((c1=getc(pnfile))=='#') | ||
| + | /*O alors simuler un espace */ | ||
| + | c1=' '; | ||
| + | /*O sinon revenir en arriere */ | ||
| + | else | ||
| + | { /*S*/ | ||
| + | ungetc(c1,pnfile); | ||
| + | c1='\\'; | ||
| + | } /*S*/ | ||
| + | } /*S*/ | ||
| + | /*O si le char est '#' */ | ||
| + | if (c1=='#') | ||
| + | /*O alors: */ | ||
| + | { /*S char = # */ | ||
| + | /*O si codes[0]=0 (all chars) ou si suivi par c2 (char code utilisateur) */ | ||
| + | c2=getc(pnfile); | ||
| + | if ( codes[0] == 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 */ | ||
| + | ungetc(c2,pnfile); | ||
| + | ll=ftell(pnfile); | ||
| + | /*O si option n ins‚rerle 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 LF, dans le fichier doc */ | ||
| + | while ( (c1=getc(pnfile)) != '\n') | ||
| + | { /*S*/ | ||
| + | putc(c1,pfdoc); | ||
| + | if(s)putch(c1); | ||
| + | } /*S*/ | ||
| + | } /*S*/ | ||
| + | /*O sinon: */ | ||
| + | else /*P option t */ | ||
| + | { /*S*/ | ||
| + | /*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*/ | ||
| + | |||
| + | /*O tant que pas LF */ | ||
| + | while ( (c1=getc(pnfile)) != '\n' ) | ||
| + | { /*S*/ | ||
| + | /*O copier le commentaire ( y compris '\r' sous DOS ) */ | ||
| + | putc(c1,pfdoc); | ||
| + | if(s)putch(c1); | ||
| + | } /*S*/ | ||
| + | } /*S*/ | ||
| + | putc( c1, pfdoc); if(s) putch( c1 ); /*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 */ | ||
| + | </pre> | ||
[[Catégorie:Générateurs de documentation]] | [[Catégorie:Générateurs de documentation]] | ||
Version du 19 décembre 2010 à 14:57
Retour aux fichiers en développement →
- shell.inc.c : Ce fichier est à revoir, il n'est pas indépendant.
/*E �C�*/
/** #########################################
# SHELL #
######################################### */
/* maj: 09/06/89 */
/*P maj R3.11 3/1/91 par JPL */
/** (fonction de mkdoc3.c)
Ce programme copie les commentaires des lignes contenant le caractere #
suivi par un des caracteres codes entres en parametre. Si le caractere
'#' est precede de \ ou si il est integre dans une chaine, alors il n'est
pas considere comme debut de commentaire.
*/
void shell_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
{ /*S shell */
extern unsigned char s,t;
extern char codes[];
unsigned int i,tab;
unsigned int num;
long ll,nl;
register int c1;
int c2;
num = 0;
c1 = c2 = STX; /* Start Text */
/*O tant que pas fin de fichier source */
while ( c1 != EOF && c2 != 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*/
num++;
nl=ftell(pnfile);
tab=0;
} /*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 aller jusqu'au prochain '\"' */
{ /*S string */
/*O tant que le caractere suivant n'est pas " */
while ((c1=getc(pnfile))!='\"')
{ /*S*/
/*O si le char est EOF envoyer messg erreur et quitter la boucle */
if (c1==EOF)
{ /*S*/
printf("\nmismatch string error in %s\n",pnfile);
break;
} /*S*/
} /*S*/
} /*S string */
/*O sinon si le char est bakslatch: */
else if (c1=='\\')
/*O alors: */
{ /*S*/
/*O si le char suivant est # : */
if((c1=getc(pnfile))=='#')
/*O alors simuler un espace */
c1=' ';
/*O sinon revenir en arriere */
else
{ /*S*/
ungetc(c1,pnfile);
c1='\\';
} /*S*/
} /*S*/
/*O si le char est '#' */
if (c1=='#')
/*O alors: */
{ /*S char = # */
/*O si codes[0]=0 (all chars) ou si suivi par c2 (char code utilisateur) */
c2=getc(pnfile);
if ( codes[0] == 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 */
ungetc(c2,pnfile);
ll=ftell(pnfile);
/*O si option n ins‚rerle 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 LF, dans le fichier doc */
while ( (c1=getc(pnfile)) != '\n')
{ /*S*/
putc(c1,pfdoc);
if(s)putch(c1);
} /*S*/
} /*S*/
/*O sinon: */
else /*P option t */
{ /*S*/
/*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*/
/*O tant que pas LF */
while ( (c1=getc(pnfile)) != '\n' )
{ /*S*/
/*O copier le commentaire ( y compris '\r' sous DOS ) */
putc(c1,pfdoc);
if(s)putch(c1);
} /*S*/
} /*S*/
putc( c1, pfdoc); if(s) putch( c1 ); /*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 */

