Projet mkd/shell.c

De Wiki EELL.

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