Projet mkd/special.c

De Wiki EELL.

Version du 19 décembre 2010 à 15:00 par JPL (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Retour aux fichiers en développement → Fichier special.inc.c : Ce fichier n'est pas indépendant il est nécessaire de le revoir.

/** #########################################
    #            SPE.  SHELL                #
    ######################################### */
/* maj: 23/3/89 */
/**
   Ce programme copie les commentaires des lignes contenant le caractere # et
   les lignes qui suivent le caractere '\'.
*/

void shell_(FILE * pfdoc, FILE * pnfile)
// FILE *pfdoc, *pnfile;
     { /*S shell */
    extern unsigned char l,p;
    extern char codes[];
    unsigned int i;
    long ll,nl;
    register char c1;
    char c2,c3;
    c1 = c2 = c3 = STX; /* Start Text */

/*O    tant que pas fin de fichier source */
        while (!( c1 == EOF || c2 == EOF || c3 == 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 suivant NL dans nl */
           if(c1=='\n')nl=ftell(pnfile);
           else
           { /*S !NL */
/*O          si le char est '#' */
              if (c1=='#')
/*O          alors: */
              { /*S char = # */
/*O             si options[0]=0 ou si suivi par c2 = char code utilisateur */
                 c2=getc(pnfile);
                 if (!codes[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 */
                    if(!codes[0])ungetc(c2,pnfile);
                    ll=ftell(pnfile);
/*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')
                       {
                       putc(c1,pfdoc);
                       if(s)putch(c1);
                       }
                    } /*S*/
/*O                sinon: */
                    else
                    { /*S*/
/*O                   copier des blancs jusqu'a la position commentaire */
                       for(i=(int)(ll-nl);i>0;i--)
                       { /*S*/
                       putc(' ',pfdoc);
                       if(s)putch(' ');
                       } /*S*/

/*O                   puis copier le commentaire tq pas fin de commentaire  */
                       while (c1!='\n')
                       { /*S*/
/*O                      copier le commentaire tq pas NL ou pas char '\' */
                          while ( (c1=getc(pnfile)) != '\n' && c1!='\\' )
                          { /*S*/
                          putc(c1,pfdoc);
                          if(s)putch(c1);
                          } /*S*/
/*O                      si le char est '\' */
                          if (c1== '\\')
/*O                      alors: */
                          {

/*O                         copier jusqu'a NL et masquer NL */
                             while ( c1 != '\n')
                             { /*S*/
                             putc(c1,pfdoc);
                             if(s)putch(c1);
                             c1=getc(pnfile);
                             } /*S*/
                             putc(c1,pfdoc);if(s)putch(c1);
                             c1=0; /* masquage */
                          }
                       } /*S*/
                    } /*S*/
                    putc('\n',pfdoc);if(s)putch('\n');   /*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