Projet mkd/shell.c

De Wiki EELL.

(Différences entre les versions)
m (!)
m
Ligne 1 : Ligne 1 :
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</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 */
Outils personnels