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 */