Projet mkd/shell.c
De Wiki EELL.
Version du 19 décembre 2010 à 14:57 par JPL (discuter | contributions)
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 */