Jeste jednou vlnkovani.

Kybic Jan student 4_95_96 k335 xkybic at sun.felk.cvut.cz
Wed Oct 25 11:31:55 CET 1995


Dobry den,
	  tak jsem zase jednou delal zbytecnou praci. Potreboval jsem
program pro doplnovani vlnek (~) za predlozky pro Unix a mel jsem za to,
ze existuje jen onen Pascalsky program Stepana Kasala.
Nez bych se v nem snazil vyznat, radeji jsem poslechl jeho ve zdrojaku
uvedene rady a napsal ho sam znovu v C. Az po odladeni jsem bohuzel
zjistil, ze jiz stejny - a evidentne schopnejsi - program napsal jiz pan
Olsak ve WEBu. Jo, jo priste se radsi zeptam, nez zacnu neco psat.
Nicmene, kdyz uz jsem tomu tu hodinku venoval, je mi lito muj zdrojak
jen tak smazat, a tak vam ho posilam, kdybyste se snad chteli podivat,
jak to delam ja. Jinak ho smazte. (Zkousel jsem anonymous ftp na
ftp.muni.cz, ale nepousti me to tam, nevim proc.)
Hezky den a jeste jednou se omlouvam za svou neinformovanost.

P.S: Muj program umi napriklad udelat vlnku i po S ve :
        S % komentar
        sebou
coz vlna ani vlnka neumi! (Ale zase ignoruje matematiku i verbatim mode)

-------------------------------------------------------------------------

        /\___/\                   Jan Kybic <kybic at earn.cvut.cz>
        | o o |
       __\_^_/__
      (__/   \__)                 http://cs.felk.cvut.cz/~xkybic/
       _|  .  |_
   ___(__\___/__)____  ... A happy Linux user.

-------------------------------------------------------------------------

/* Program vln - (c) Jan Kybic, 25.10.1995             */
/* Tento program doplnuje znaky ~ za predlozky v TeXtu */
/* Jako argument je mu mozne dat seznam predlozek,     */
/* jinak pouzije "KkSsZzVvUu".                         */
/* Retezce  <WS><predlozka><WS>*   (WS= ' ',CR,LF,TAB) */
/*  prepisuje na <WS><predlozka>~                      */
/* Je-li predlozka jako posledni nikoli WS znak na     */
/* radku, je presunuta na radek dalsi.                 */
/* Pouzijte jako filtr. Mel by fungovat jak v UNIXu,   */
/*  tak v MS-DOSu a snad i jinde.                      */
/*						       */
/* Programy s obdobnou funkci napsali prede mnou jiz   */
/*  Oldrich Ulrych a Stepan Kasal.                     */
/* Tento program je velmi novy => asi neni bez chyb    */
/* Pripominky posilejte na adresu <kybic at earn.cvut.cz> */
/* Tento program je public-domain, delejte si s nim    */
/*  co uznate za vhodne.                               */

#include <stdio.h>

char *predlozky="KkZzSsVvUu" ;    /* default seznam predlozek       */
unsigned char flags[256] ;        /* flags[c]!=0 <=> c je predlozka */


void init(char *s)                /* inicializujeme pole flags */
{ int i ;
  for(i=0;i<256;i++) flags[i]=0 ;
  for(;*s;s++) flags[*s]=1 ;
}

/* Dale definujeme buffer - frontu. Do ni si budeme ukladat znaky,
   kdyz jeste nevime, jestli bude nutne zalomit radku, nebo ne */

#define BUFSIZE 2000
char buf[BUFSIZE],*bufh,*buft ;

#define ULOZ    /* timhle makrem ukladame do bufferu obsah c */ \
 if (bufh>=buf+BUFSIZE)                                         \
   { puts("!!! vln - Buffer overflow. Sorry.") ; return(1) ; }  \
 *bufh++=c ;    /* ulozime */                                   \

#define VYSYP   /* a timhle makrem vytiskneme vse z bufferu */  \
 while(buft<bufh) putchar(*buft++) ; /* vytiskneme zbytek */    \
 bufh=buft=buf ;    /* buffer je ted prazdny */                 \



int gett()   /* tato funkce vrati dalsi znak ze vstupu   */
	     /* je-li to komentar, preskoci ho kopirujic */
{ int c ;
  do {
  if ((c=getchar())!='%') return(c) ;
  putchar(c) ; /* je to komentar */
  while ((c=getchar())!='\n' && c!=EOF) putchar(c) ;
    /* komentar kopirujeme beze zmeny na vystup */
  if (c==EOF) return(EOF) ;
  putchar(c) ; /* tiskneme i to \n */
     } while(1) ; /* a znovu */
  return(1) ;  /* jen aby si prekladac nestezoval */
}


int main(int argc,char *argv[])
{ int stav,c ;
  int radka ; /* prislo NL po predlozce */

 init(argc<2 ? predlozky : argv[1]) ; /* neni-li argument, pouzij default */

 bufh=buft=buf ; /* inicializace ukazatelu do bufferu */
 stav=0 ; /* implementujeme tu jednoduchy stavovy automat */
 radka=0 ;

 while ((c=gett())!=EOF)
  switch(stav)
   { case 0: /* pocatecni stav */
             if (isspace(c)) stav=1 ;
             tisk: putchar(c) ;
             break ;

     case 1: /* zde prekracujeme mezery pred potencialni predlozkou */
             if (flags[c])           /* prisla predlozka */
               { stav=2 ;
                 ULOZ
                 break ;
               }
             if (!isspace(c))  stav=0 ;  /* prisel nepredlozkovy znak */
             /* prisla-li mezera, zustavame ve stavu 1 */
             goto tisk ;

     case 2: /* prisla predlozka */
             if (!isspace(c))    /* uz druhe pismeno */
                { stav=0 ;
                  putchar(*(bufh=buf)) ; /* vytiskni uschovanou predlozku */
                  goto tisk ; /* vytiskni i druhe pismeno */ }
             /* prisla mezera */
             stav=4 ;
             /* tady schvalne chybi break */

     case 4: /* vime, ze prisla predlozka a alespon jedna mezera */
             if (!isspace(c)) /* dalsi slovo */
               { stav=0 ;
                 if (radka) puts("") ; /* prejdeme na novou radku */
                 putchar(*buft++) ; /* tisk predlozky */
                 putchar('~') ;     /* vsuneme tildu */
		 bufh=buft=buf ;    /* vymazeme buffer */
                 goto tisk ;        /* tiskneme i posledni znak */
               }

             if (c=='\n')           /* predlozka byla posledni na radce */
               if (++radka>1)
                { /* Uz druha nova radka */
                  VYSYP           /* vytiskni vse, tak jak to bylo */
                  putchar('\n') ; /* tohle NL jsme vypustili */
                  stav=0 ;        /* jdi do pocatecniho stavu */
                  radka=0 ;
                  goto tisk ;     /* vytiskni i posledni znak */
                }
                else break ; /* Tohle NL vypustime */

             /* prisla mezera */
             ULOZ
             break ;
   } /* end od switch */
  return 0 ;
}





More information about the csTeX mailing list