/* FILE: HION.C

   Note: The program is a value for hungarian speaking people only,
         so the rest of the comment is mainly in Hungarian. Sorry.
---------------------------------------------------------------------

FONTOS!! Mielo3tt elkezdene1d olvasni, vagy haszna1lni a programot
gyo3zo3dj meg ro1la, hogy a hion.hun magyar nyelvu3 TeX fa1jl is
megvan. Ez tartalmazza ugyanis a jogaidat e1s a garancia1kat a
programmal kapcsolatban. Ha ez a fa1jl nincs meg, vagy nem olvastad
el, akkor semmilyen jogod nincs a program haszna1lata1ra,
tova1bbada1sa1ra vagy aka1r a forra1sszo2veg elolvasa1sa1ra.

---------------------------------------------------------------------
HISTORY:

29.MAY 1991. elso3 kiada1s.
             V 1.0
05.JUN 1991. az elso3 kiada1sban volt egy eli1ra1s, eze1rt ne1ha
             Segmentation fault-tal meghalt. Javi1tva e1s az XMAIL-be
             elku2ldve a javi1tott va1ltozat.
             V 1.1
02.JUL 1991. a program lenyelte a bemeneti szo2veg utolso1 sora1t, ha az nem
             volt NL karakterrel leza1rva, e1s az utolso1 karakter olyan
             betu2 volt amelyet ko2vethetett volna e1kezet. Javi1tva.
             V 1.2
11.JUL 1991. az ibm_table ta1bla1zat egy bejegyze1ssel hoszabb lett, i1gy
             nulla tudja akkor is za1rni, ha te1nyleg mind a 128 karakterhez
             definia1lva van valamilyen a1talaki1ta1s. Az enum-ok a1ti1ra1sa
             #define-okra, i1gy me1g a lego2regebb K&R fordi1to1nak is le
             kell tudnia fordi1tani.
             Ko2zben nem lett kiadva a ko1d i1gy ez me1g mindi1g
	     V1.2
29.JUL 1991. A \(, \), \[ e1s \] szekvencia1k felismere1se LaTeX mo1dban.
             Az st va1ltozo1 bea1lli1ta1sa 1-re, amikor off nulla lesz a
             hion() fu2ggve1nyben. Ennek a hia1nya extra szo1ko2zo2ket
             okozott matematikai mo1d uta1n. Az internal fu2ggve1ny harmadik
             argumentuma1nak bevezete1se, valamint a hibasza1mokhoz makro1
             rendele1sek.
             V1.2
21.OCT 1991. Mivel hazako2lto2ztem Be1csbo3l a BME EET-re
             Buda1ra, eze1rt az eMail ci1mem is megva1ltozott.
	     V1.2
24.NOV 1991. Eddi1g a HION egy szo1 ve1ge1t u1gy tala1lta meg, ha valamilyen
	     olyan karaktert tala1lt, amelyik nem eleme a szo1nak. Mivel
	     azonban egy szo1t (TeX-ben) leza1rhat egy ko2vetkezo3 veze1rlo3
	     szo1, eze1rt az eddi1gi verzio1kban a \ nem za1rta le a szo1t.
	     Ennek az volt a ko2vetkezme1nye, hogy ha egy szo1t szo1ko2z
	     ne1lku2l ko2vetett egy veze1rlo3 szekvencia, akkor a szo1t nem
	     alaki1totta a1t a HiOn, e1s az e1kezetek megmaradtak eredeti
	     jelo3le1ssel, e1s az elva1laszta1s sem lett bejelo3lve. Az
	     inputon ve1gzett konverzio1 azonban ilyenkor is mu3ko2do2tt,
	     i1gy azuta1n a ve1gso3 szo2vegben az 123 jelo2le1ssel
	     alkalmazott e1kezetek jelentek meg. (Ez me1g rosszabb.)
	     A hiba leggyakrabban a \footnote veze1rlo3 szekvencia1kna1l
	     jelentkezett. Ez most ki lett javi1tva.
	     V1.3  (Non release.)
26.NOV 1991. Ha csak az elva1laszta1s volt kikapcsolva egy darab | jellel,
             akkor a tova1bbi | jeleket a program megette, so3t ke1pes volt
	     teljesen kikapcsolni, ha ke1t || jelet tala1lt. Ez a hiba lett
	     kijavi1tva azzal, hogy a | jelet csak akkor figyeli a program,
	     ha az elva1laszta1s be van kapcsolva, azaz hypon=1.
	     V1.3  (Non release.)
05.DEC 1991. V1.3 RELEASE
10.DEC 1991. A kva1zi igeko2to3k bevezete1se, mint pe1lda1ul a meggy, vagy
	     a leggy.
	     A texwords ta1bla1zat bevezete1se, valamint a protect opcio1.
	     Az igeko2to3k figyele1se alaphelyzetben bekapcsolva van.
	     V1.4  (Non release.)
30.JAN 1992. A CPU me1ro3 rutinok hozza1linkelheto3ek a hion-hoz, e1s
	     rengeteg apro1 gyors1ta1s be lett vezetve. Az index fu2ggve1ny
	     haszna1lata majdnem mindenhol ki lett ku2szo2bo2lve.
	     A hion.hun fordi1ta1sakor 15%-kal no3tt a sebesse1g.
	     V1.4  (Non release.)
28.APR 1992. A hion LaTeX mo1dban nem dolgozza fel a \documentstyle uta1ni
             re1szt, az \addcontentsline uta1n pedig nem va1laszt el.
             Ha valahol kontrol karakter szerepel egy szo1val egybei1rva,
             pe1lda1ul \%alma1s, akkor most ma1r az alma1s ku2lo2n szo1, es
             nem tekinti a hion a kontroll szekvencia re1sze1nek.
             Eddi1g a program rosszul va1lasztotta el az olyan szavakat,
             sztring, vagy sztracsatella, mert to2bb mint ke1t karakter
             ma1ssalhangzo1val kezdo3do2tt a szo1. Most csak akkor va1laszt
             el a hion, ha ma1r legala1bb egy maga1nhangzo1 volt a szo1
             eleje1n.
             V1.45 (NoN release)
29.APR 1992. A1ti1rtam a LaTeX szavak kezele1se1t, e1s most a slatex arraybo3l
             egy slatex fu2ggve1ny lett. Ez le1nyegesen gyorsabb kell, hogy
             legyen, mint az elo3zo3 megolda1s. Egyben e1szrevettem, hogy az
             elo3zo3 verzio1ban a slatex arrayben ha1rom kulcs\-szo1 el volt
             ge1pelve.
             V1.45 (NoN release)
07.MAY 1992. Most ma1r kezelve van a sa1g se1g is. Az IBMCODE makro1 ki lett
             irtva, mert lehet ugyan olyan ge1p, amine1l nem kell, de ott sem
             zavar.
11.MAY 1992. Javi1tottam az elo3re definia1lt makro1k sorrendje1n, e1s i1gy
             a HiOn lefordul MSC 5.1-el is. Ha haszna1lom a /Ox (full
             optimize) opcio1t, akkor gyorsabb, mint a TC va1ltozat.
15.MAY 1992. Az OBARS e1s az ONOHY opcio1k bevezete1se.
21.MAY 1992. Az opcio1k nem be e1s ki, hanem a1tkapcsolnak.
23.JUN 1992. Be lett vezetve a VERS_DATE az azonos verzio1k ko2zo2tti ku2-
             lo2nbse1gek nyilva1ntarta1sa1ra.
28.JUN 1992. Valamie1rt nem mu3ko2do2tt a nem \ kezdetu3 TeX kulcsszavak,
             mint a minus vagy scaled ve1delme. Ez ki lett javi1tva. A1t lett
             a1lli1tva a szo1tagola1s, e1s most az egybetu3s szo1tagok a szo1
             ko2zepe1n meg vannak engedve, hiszen ebbo3l nem lesznek
             egybetu3s szo1tagok a nyomtatott szo2vegben, mert ezek vagy a
             szo1 eleje1hez, vagy a szo1 ve1ge1hez lesznek hozza1csapva.
             Ugyancsak ma i1rtam a dct->dcb konverzio1t de me1g nem mu3ko2dik
             teljesen.
30.JUN 1992. Megi1rtam az o2sszetett szavak kezele1se1t. Sajnos me1g nincs
             szo1ta1ram, ami az o2sszetett szavakat tartalmazna1, e1s nem
             tudom, hogy mekkora memo1ria fog neki kelleni. Az biztos, hogy
             a szo1ta1r fele1pi1te1se1hez (dct->dcb) sokkal to2bb memo1ria
             kell, mint a haszna1lathoz.
             V1.7beta
13.JUL 1992. Ki lett javi1tva a ti\-ne1\-dz\-ser, e1s lecso2kkent a
             (dct->dcb) memo1ria szu2kse1glete, valamint a dcb me1rete.
             Ke1so3bb me1g tova1bbi cso2kkene1s va1rhato1.
             V1.7b
21.JUL 1992. A HION nem va1lasztotta el a mi1nusz szo1t, mert azonosnak
             vette a minus TeX kulcsszo1val. Most ma1r OK. Isme1t cso2kkent
             a (dct->dcb) memo1ria ige1ny. Kezd a dolog bitvada1szatta1
             va1lni.
22.JUL 1992. Isme1t cso2kkent a (dct->dcb) memo1ria ige1ny.
25.JUL 1992. El nem va1lasztott szavak uta1n \- jel, e1s az OHOGY opcio1.
26.JUL 1992. Egyszo1tagu1 TeX kulcsszavak, mint to, plus bekeru2ltek a
             ta1bla1zatba, hogy ne keru2ljo2n uta1nuk \-.
06.DEC 1992. Ne1ha1ny fu2ggve1ny ANSI mo1don volt javi1tva, e1s a SUN UNIX C
             fordi1to1ja kihalt rajta. Hia1ba, vannak me1g o3s o2reg
             fordi1to1k.
             Kocsis Tama1s javaslata1ra VMS e1s DOS alatt ha az aktua1lis
             direktoriban nem tala1lja a program a DCB fa1jlt, akkor elo3-
             szo2r abban a direktoriban keresi, ahol a ve1grehajthato1
             fa1jl van.
             Ha nincs megadva argumentum, akkor a program eddi1g meghi1vta
             a usage() fu2ggve1nyt, akkor is, ha a HION_OPT va1ltozo1ban
             voltak parame1terek. Most ma1r erre is odafigyel.
             hion_opt megszu3nt, e1s minden oprendszer alatt HION_OPT van.
25.DEC 1992. Ne1ha1ny apro1bb javi1ta1s az igeko2to3 automata1ban, e1s az
             opci1ok ko2zo2tt.
11.MAR 1993. A bemeno3 fa1jl neve1ben rosszul volt leva1gva a kiterjeszte1s.
             Ha aka1r VMS, UNIX vagy MSDOS alatt a PATH taralmazott . karaktert,
             akkor azt tala1lta meg, mint kiterjeszte1s elo3tti karaktert, e1s
             ezek uta1n az automatikusan genera1lt kimeneti fa1jlt nem lehetett
             megnyitni. Pl a hion -l [.hion]hion parancs hata1sa egy
             hibau2zenet volt, miszerint nem lehet a [.tex fa1jlt megnyitni.
14.DEC 1993. Egy enyhe betegse1g uta1ni la1badoza1s sora1n megne1ztem, hogy
             mie1rt nem haszna1lhato1 a 'hion -f' parancs. Egy helyen || volt
             && helyett. Az exitonfail va1ltozo1val akkor sem a1ll le a
             program, ha nincs ele1g memo1ria a szo1ta1r beolvasa1sa1ra,
             hanem dolgozik szo1ta1r ne1lku2l. V2.1
08.JAN 1994. # opcio1, amelyik nem indi1tja el a fordi1ta1st, ha a tex fa1jl
             u1jabb, mint a hun fa1jl.
22.JAN 1994. A VMS szeru3 opcio1k bevezete1se. Tesztelve me1g nincs.
29.JAN 1994. A flott-ot ma1r nem pro1ba1lja elva1lasztani. Egy re1gi hiba is
             ki lett javi1tva. Sajnos nem megy a /DISCRETIONARY=TOTAL.
01.FEB 1994. Minima1lis mo1dosi1ta1sok, hogy VMS alatt is fusson a rendszer. A
             legto2bb proble1ma azzal volt, hogy a rendszergazda rettento3
             alacsonyra a1lli1totta a page file quota-mat e1s lea1llt a C
             fordi1to1.
10.APR 1994. a hfprintf fu2ggve1ny bevezete1se, amellyel a program e1kezeteket
             produka1l a ke1pernyo3n is.
12.APR 1994. Hiba1s volt a matex va1ltozo1 bea1lli1ta1sa ISO karakterek esete1n.
18.NOV 2003. Ne1ha1ny opcio1 ki lett csere1lve, hogy Visual C++ e1s Borland C++
             is tudja fordi1tani a forra1st. Ezt a forra1st viszont ma1r
             valo1szi1nu3leg nem fordi1tja a re1gi TURBOC.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>

/* Ezeket a makro1kat a1ltala1ban a fordi1to1k definia1lja1k. */
#ifdef MSDOS
#define MSC
#endif

#ifdef __TURBOC__
/* It is not likely that someone is trying to compile HiON with an old compiler
#include <alloc.h>
#define TURBOCPTR (void far *)
*/
#define TURBOCPTR
#else
#define TURBOCPTR
#endif

#ifdef MSC
#include <malloc.h>
#endif

typedef unsigned char byte;

/* Ha CPUTIMEMEASURE definia1lva van, akkor egy olyan programcsomagot lehet
 * a hion-hoz hozza1linkelni, ami me1ri a futa1si ido3t. Ez segi1tett abban,
 * hogy kikeressem, hogy mit lehet, e1s e1rdemes gyorsi1tani a programon.
 *
 * Ugyanakkor ha hozza1linkelem, a CPU ido3 me1ro3 rutinokat, akkor a program
 * me1rhetetlenu2l lelassul.
 *
 * A megfelelo3 rutinokat meg lehet szerezni a hion szerzo3je1to3l, de a
 * hionnak nem re1sze.
 * */
/* #define CPUTIMEMEASURE */
#ifdef CPUTIMEMEASURE
/* Ahhoz, hogy a CPU ido3t fu2ggve1nyenke1nt me1rni lehessen meg kell, hogy
 * legyen a cputime.h, cputime.c cputimei.h e1s cpuhdcod.c fa1jlok.
 */
#include "cputime.h"
#else
/* Ha nem ne1zzu2k a futa1si ido3t, akkor mindent u1gy definia1lunk, hogy ne
 * legyen semmilyen ku2lo2nleges hata1sa. */
#define FunctionStart(x)
#define Return(x) return(x)
#define RETURN return
#define EndFunction
#define ReportCpuUsage()
#endif

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif


#ifdef _cplusplus /* Turbo C++ definia1lja ezt a szimbo1lumot. */
#define CPP       /* Egyenlo3re nincs haszna1lva.              */
#endif

#ifdef __MSDOS__
#ifndef MSDOS
#define MSDOS
#endif
#endif

/* A program nem tartalmaz olyan ko1dot, amely fu2gg a UNIX rendszer
   ti1pusa1to1l, teha1t nem kell ku2lo2n megku2lo2nbo2ztetni a SYSV e1s a
   BSD rendszereket. */
/* Viszont ne1melyik UNIX rendszer (AIX -- IBM RS6000, HP-UX 7xx), nem
   definia1lja a UNIX szimbo1lunot, i1gy erro3l ku2lo2n kell gondoskodni. */
#ifdef unix
#ifndef UNIX
#define UNIX
#endif
#endif

#ifdef vms
#ifndef VMS
#define VMS
#endif
#endif

#ifdef vax
#ifndef VAX
#define VAX
#endif
#endif

#ifndef VMS
#include <fcntl.h>
#include <sys/stat.h>
#endif

/* Definia1ljuk a rendszer neve1t. */
#ifdef UNIX
#define SYSTEM "UNIX"
#endif

#ifdef VMS
#define SYSTEM "VMS"
#endif

#ifdef MSDOS
#define SYSTEM "MS-DOS"
#endif

#ifndef SYSTEM

#ifdef _AIX
#define SYSTEM "AIX"
#endif

#ifdef hpux
#define SYSTEM "HP-UX"
#endif

#endif /* SYSTEM */

#ifdef _AIX
#define UNIX
#endif

#ifdef hpux
#define UNIX
#endif

#ifdef apollo
#define APOLLO
#endif

/* Az UNIX rendszerek ko2nyvta1ra1ban to2bbnyire szerepel az index
   fu2ggve1ny. */
#ifdef APOLLO
#define F_INDEX_DEFINED
#endif

#ifdef _AIX
#define F_INDEX_DEFINED
#endif

#ifdef hpux
#define F_INDEX_DEFINED
#endif

/* Soos Peter ajanlasa alapjan */
#ifdef linux
#define F_INDEX_DEFINED
#endif

/* Az MSDOS ge1pek ko2nyvta1ra1ban szerepel az strlwr fu2ggve1ny. */
#ifdef MSDOS
#define F_STRLWR_DEFINED
#endif

#ifdef MSDOS
#define BRITE "wb" /* Bina1ris i1ra1s. */
#define BREAD "rb"
#endif

/* Ne1ha1ny memo1ria modellben a Microsoft C nem bi1rko1zott meg
 * egyes sorokkal. */
#ifdef __TURBOC__
#if defined(__LARGE__)||defined(__HUGE__)
#define FAR far
#define HUGE huge
#endif
#endif

#ifdef MSC
#define FAR far
#define HUGE huge
#endif


#ifndef HUGE
#define HUGE
#endif
#ifndef FAR
#define FAR
#endif

#ifdef MSDOS
#define MALLOC 1
#endif
#ifdef VMS
#define MALLOC 1
#endif
#ifdef UNIX
#define MALLOC 1
#endif

/* VMS alatt ezeket a bizarr kiege1szi1te1seket kell a fopenbe rakni,
   hogy a kimenet szabva1ny text forma1tum legyen. Ene1lku2l is mu3ko2dne
   a dolog, de az ED kiaba1lna, hogy
        Input file does not have standard text file format
   Igy viszont to2ke1letes a dolog, ahogy a hion is to2ke1letes :-) */
#ifdef VMS
#define WRITE "w","rat=cr","rfm=var"
#endif

#ifndef BRITE
#define BRITE "w"
#endif

#ifndef WRITE
#define WRITE "w"
#endif

#ifndef BREAD
#define BREAD "r"
#endif

#ifdef VMS              /* Ez kell a VMS-nek a getenv fu2ggve1nyhez. */
#include unixlib        /* Ne keresd a fa1jlokat,                    */
#include unixio         /* majd o3 megtala1lja a                     */
#include file           /* saja1t ko2nyvta1ra1ban.                   */
#include stat
#endif

/* Haszna1lhatjuk a pascal ti1pus mo1dosi1ta1st, mert a fu2ggve1nyek
 * nem haszna1lnak va1ltozo1 sza1mu1 argumentumot, e1s i1gy a hi1vott
 * gondoskodhat a stack kitiszti1ta1sa1ro1l. A1lli1to1lag, az ilyen
 * fajta hi1va1s gyorsabb. E1n nem vettem e1szre. Egy biztos: nem lasabb.
 */
#ifdef MSDOS
#define _ pascal
#else
#define _
#endif

/* It is not likely that someone is trying to compile HiON with an old compiler
#ifdef __TURBOC__
#define malloc farmalloc
#define free farfree
#endif
*/

#ifndef MALLOC
char *malloc();
#endif

/* Ezek a pragma1k kikapcsolja1k azt a rengeteg sok warningot. */
#ifdef __TURBOC__
#pragma warn -rch
#pragma warn -pro
#pragma warn -pia
#pragma warn -rvl
#endif

/* Globa1lis konstansok. */
#define ever (;;)     /* Ve1gtelen ciklushoz for ever.           */
#define NL '\n'       /* Ujsor karakter.                         */
#define NUL ((char)0) /* A nulla karakter.                       */

/* Ko2rnyezeti va1ltozo1. */
#define HION_OPT_ENVIRONMENT "HION_OPT"

#define FNL 200  /* Maxima1lis fa1jl ne1v hossz.                 */
#define SRL 200  /* Maxima1lis sor hossz a bemeneten.            */
/* A fa1jlok default kiterjeszte1sei. */
#define OUT_EXT  ".tex"
#define INP_EXT  ".txt"
#define INP4_EXT ".hun"
#define DIN_EXT  ".dct"
#define DOU_EXT  ".dcb"

/* Ha az aktua1lis direktoriban nem tala1lja a ReadStateMachine
 * az elva1laszta1si kive1tel fa1jlt, akkor megpro1ba1lja
 * a default direktorikban megnyitni.
 */
char *DefDicDir[]={
#ifdef UNIX
#ifdef HION_DICC_DIR
  HION_DICC_DIR,
#else
  "~/", "/usr/dict/", "/usr/user/dict/", "/usr/bin/",
#endif
#endif
#ifdef MSDOS

#endif
#ifdef VMS
  "HION$DIRECTORY:",
#endif
  NULL
  };


/* A dicc funkcio1 fix fa1jlnevekkel dolgozik. */
#define DICC_INP "hion.dct"
#define DICC_OUT "hion.dcb"

long LineNumber; /* Az aktua1lis sor sorsza1ma.                             */
long LineOffNumber; /* A legutolso1 kikapcsola1s sorsza1ma.                 */

/* Ezt a ke1t makro1t akkor haszna1lja a hion amikor valamilyen
   hibau2zenetet i1r ki. */
#define ReportLineNumber (hfprintf(stderr,"Forra1s sor=%ld\n",LineNumber))
#define ReportfoneNumber (fprintf(fo,"Forra1s sor=%ld\n",LineNumber))
#define ReportOffLineNumber (hfprintf(stderr,"Forra1s sor=%ld\n",LineOffNumber))

/* Az e1kezetes karakterek u1gy lettek implementa1lva, hogy a beolvaso1
   rutin egy also1 szintje1n a hosszu1 o betu3bo3l o1-et csina1lt, a veszo3s
   e betu3bo3l ke1tkarakteres e1 szekvencia1t stb.

   Ha viszont ma1r tudta a program kezelni az IBM karaktereit, akkor a
   telhetetlen felhaszna1lo1k nem ele1gedtek meg ennyivel, e1s azt
   ko2vetelte1k hogy az o1 e1s az e1 meg a ta1rsaik megmaradjanak e1-nek,
   e1s ne legyen belo3lu2k \'o meg \'e. Emiatt azuta1n bevezettem a 0
   opcio1t, aminek a haszna1lata1val ha a bemeneten hosszu1 o1 jo2n, akkor
   egy o karakter e1s egy VESSZO3 jo2n, ami nem '1', hanem (char)256, ami
   biztos, hogy nem szerepel a bemeneti fa1jlban, mindaddi1g, ami1g az ba1jt
   szerveze1su3. A ma1sik ke1t konstans is hasonlo1 ce1lt szolga1l. */

#define VESSZO3	 256
#define UMLAUT   512
#define HUMLAUT  768

/* A HION opcio1i (3.0 verzio1to1l kezdve) a VMS opcio1kra hasonli1tanak,
 * e1s / vagy - jel vezeti be o3ket. Ugyanakkor UNIX alatt / jellel
 * kezdo3dhet egy fa1jl neve is, eze1rt ott a / jel nem megengedett opcio1
 * karakter.
 */
#ifndef UNIX
#define OPTCHAR1 ('/')
#define OPTCHAR2 ('-')
#else
#define OPTCHAR1 ('-')
#define OPTCHAR2 ('-')
#endif

/* Ez a fu2ggve1ny me1g MS-DOS alatt sem PASCAL ti1pusu1, mivel va1ltozo1
   sza1mu1 argumentuma van.
*/

int hfprintf(FILE *fp, char *format, ...);

/* Ke1t olyan fu2ggve1ny, amelyik ne1ha1ny ge1pen definia1lva van, de a
   ge1pek to2bbse1gen nem.
*/
#ifndef F_INDEX_DEFINED
char * _ index(s,c)char *s,c;{

	FunctionStart("index");
	while( *s && c != *s )s++;
	Return(*s != c ? NULL : s);
	}
#endif
#ifndef F_STRLWR_DEFINED
void strlwr(s)char *s;{

	FunctionStart("strlwr");
	while( *s ){
		if( isupper(*s) ) *s=tolower(*s);
		s++;
	        }
	RETURN;
	}
#endif
/* It is not likely that someone is trying to compile HiON with an old compiler
#ifdef __TURBOC__
long Marade1k;
#endif
*/
long AllocatedMemory=0l;
static byte exitonfail=1;
static /* Hogy a nem case sensitive linkerek ne akadjanak ki. */
char HUGE * _ Malloc(j)long j;{
  char HUGE *p;
#ifdef MSC
  size_t sze;
#endif

#ifdef MSC
  j = (j/2) + (j&1); /* j/2 felso3 ege1szre1sz. */
  sze = 2;
  while( j >= 0x10000L ){
    j = (j/2) + (j&1);
    sze *= 2;
    }
  p =(char HUGE *)halloc(j,sze);
#define free hfree
#else
  p = malloc(j);
#endif
  if( p == NULL ){
    hfprintf(stderr,"Nincs ele1g memo1ria.\n");
    hfprintf(stderr,"Lefoglalt memo1ria=%ld byte.\n",AllocatedMemory);
    hfprintf(stderr,"A legutolso1 ke1rt me1ret=%ld byte.\n",j);
    ReportLineNumber;
    if( exitonfail )
      exit(1);
    else return NULL;
    }
  AllocatedMemory += j;
  return p;
  }

/* A programban haszna1lt fu2ggve1nyek deklara1cio1i.
 *
 * Ezekre igaza1n csak MSDOS alatt van szu2kse1g, mert ott a fu2ggve1nyek
 * pascal ti1pusu1ak. Ma1shol vagy elo3bb vannak definia1lva, mint ahogy
 * haszna1ljuk o3ket, vagy pedig int tipusu1ak, ami az alape1rtelmeze1s.
 */
void  _ prep_chttable();
int   _ getinteger();
void  _ prepare_table();
int   _ load_charset();
int   _ get_character();
int   _ tex_ligature();
void  _ tex_discretion();
void  _ tex_code();
int * _ PrEfIx();
int   _ igeko2to3();
int   _ slatex();
void  _ send_character();
char  _ ConvertExtChar();
int   _ getline();
long  _ WriteStateMachine();
void  _ ReadStateMachine();
void  _ CheckCWord();
int   _ SplitCWord();
int     hion();
int     dicc();
int     numoff();
int     huoff();
int     huon();
int     xuywer();
int   _ report_stat();
int   _ usage();
int   _ help();
int   _ internal();
int   _ kora1bbi();
int   _ sstreq();
int   _ scanopt();
int     PutLogo();
/* int    hfprintf(); Ez ma1r kora1bban szerepelt.*/

/* Itt vannak o2sszegyu3jtve a hibau2zenetek. */
#define MSG_NOTHINGTODO "Nem kell u1jrafordi1tani.\n"
#define MSG_ISTOSTTIME "Szabva1ny ki-, bemenetre nincs ido3poont.\n"
#define MSG_1_DEFD "Csak egy kive1telszo1ta1rat tudok kezelni.\n"
#define MSG_DCBREADING "A ta1bla1zat olvasa1sa folyamatban...\n"
#define MSG_BAD_LONG "Felesleges szo1.\n"
#define MSG_FINITO "Ta1bla1zat fele1pi1tve. I1ra1s elo3ke1szi1te1s...\n"
#define MSG_WRITE "Ta1bla1zat kii1ra1sa...\n"
#define MSG_WINITO "Ta1bla1zat kii1rva.\n"
#define MSG_DOUB_HYP "Ke1t - jel egyma1s mellett.\n"
#define MSG_DCT_OK "Kive1telszo1ta1r beolvasva.\n"
#define MSG_DCFCORR "Hiba1s DCB fa1jl.\n"
#define MSG_MINVER "A minima1lisan V%d.%d hion kell ehhez a szo1ta1rhoz.\n"
#define MSG_HVDF "A szo1ta1r magasabb verzio1ju1 hion-nal ke1szu2lt.\n"
#define MSG_FILETL "A szo1ta1r fa1jl tu1l hosszu1, %c%ld ba1jt.\n"
#define MSG_TOO_MANY_FN "Tu1l sok fa1jl ne1v a parancssorban.\n"
#define MSG_USAGE "Haszna1lat: %s bemeno3_fa1jl_neve [kimeno3_fa1jl_neve]\n"
#define MSG_INV_OPT "%s hiba1s opcio1.\n"
#define MSG_NO_INP "Nincs bemeno3 fa1jl.\n"
#define MSG_NO_OUT "Nincs kimeno3 fa1jl ne1v.\n"
#define MSG_TOOMHY "Tu1l sok elva1laszta1s van egy szo1ban.\n"
#define MSG_UNABLE_TO_OPEN "Nem tudom megnyitni a %s fa1jlt\n"
#define MSG_UN_W "Nem lehet i1rni a %s fa1jlt.\n"
#define MSG_BD_CH "Ilyen e1kezet nincs a magyarban: %c%c\n"
#define MSG_INVDCHAR "Nem betu3 karakter a szo1ta1rban %d.\n"
#define MSG_BAD_C "Hiba1s karakter ko1d %d!\n"
#define MSG_EOM "Nincs ele1g memo1ria.\n"
#define MSG_FILEVSH "Szo1ta1r fa1jl rendki1vu2l ro2vid.\n"
#define MSG_FILESH "Szo1ta1r fa1jl tu1l ro2vid.\n"
#define MSG_DICCNR "A szo1ta1r nem lett beolvasva.\n"
#define MSG_WREP "Szo1isme1tle1s van a szo1ta1rban.\n"
#define MSG_WPRE "Ez a szo1 prefixke1nt kora1bban szerepel.\n"
#define MSG_NOELV "El nem va1lsztott szo1 a szo1ta1rban.\n"
#define MSG_LOGO "%s konverzio1s program V%d.%d %s %s TeX preprocesszor.\n"
#define MSG_WHAT_TO_DO "Nem tudom mit kell csina1lnom.\n"
#define MSG_CONV "%s konverta1la1sa %s-be\n"
#define MSG_IO_SAME "A bemeno3 e1s kimeno3 fa1jl ugyan az!\n"
#define MSG_LILONG "Bemeno3 fa1jlban egy sor hoszabb mint %d karakter.\n"
#define MSG_SSZS "Szo1 eleje1n hosszu1 o2sszetett karakter van: %c.\n"
#define MSG_NONA "Nem ASCII karakter van a fa1jlban %d.\n"
#define MSG_CHARSET "Karakter defini1cio1s file %s nem nyi1lik.\n"
#define MSG_NOREC "Rekurzi1v karakter defini1cio1 nem megengedett.\n"
#define MSG_HION_LATEX \
"A hion.hun fa1jl latex forma1tum. A %cLATEX opcio1 szu2kse1ges.\n",OPTCHAR1
#define MSG_EOF_MATH "EOF matematikai mo1dban.\n"
#define MSG_EOF_OFF "EOF kikapcsolt a1llapotban (lehet, hogy hiba).\n"
#define MSG_COMPAT "A %c e1s %c opcio1k egyu2tt nem szerepelhetnek.\n"
#define MSG_TRICKY "Tru2kko2s ko1d ta1bla %c.\n"
#define MSG_B_M "BRACKET opcio1 hata1stalan!\n"

/* A ve1grehajthato1 fa1jlok (UNIX-na1l, VMS-ne1l linkek)
 * lehetse1ges nevei. */
#define HION   "hion"
#define HUON   "huon"
#define HUOFF  "huoff"
#define NUMOFF "numoff"
#define DICC   "dicc"

/* A meghi1vando1 fu2ggve1nyek sorsza1mai. */
#define FXUYWER  0
#define FHUON    1
#define FHUOFF   2
#define FNUMOFF  3
#define FHION    4
#define FDICC    5

int ibm_charset;
#define GeTc get_character()

/* Ez a ta1bla tartalmazza az IBM-PC kiterjesztett karakter ke1szlete1nek
betu2it. cd a ko1d, amit a getchar() visszaad, char a konverta1lt elso3
karakter, post a konverta1lt ma1sodik karakter. Ezt a ta1bla1zatot a
get_character() rutin haszna1lja.
Ha valamilyen olyan karakter jo2n,
amelyik definia1lva van a ta1bla1zatban, akkor nem a karaktert adja vissza,
hanem a ke1t ba1jtos ko1dja1t. Ha valamelyik karaktert sima egyba1jtos
ko1dra akarjuk kicsere1lni, akkor a post e1rte1ket egyszeru3en nulla1ra
a1lli1tjuk. (Ez, pillanatnyilag nincs kihaszna1lva.) A ta1bla ve1ge1t az
jelzi, hgy cd e1rte1ke nulla. (Sebesse1gi okokbo1l csak a 127-ne1l nagyobb
ko1du1 karakterek csere1lheto3ek ki.) Olyan karakterek is definia1lva vanak
a ta1bla1zatban, mint y2. Ezeket a magasabb szinteken levo3 rutinok nem
tudja1k haszna1lni, de itt aze1rt definia1lva vannak. */
/* Ha a1t akarod i1rni a ta1bla1zatot, akkor:

   1.) Ne i1rd a1t, hanem haszna1lj egy ku2lso3 fa1jlt.
   2.) Ha me1gis, akkor ne csak a ta1bla1zat ve1ge1re szu1rd be
       az u1j karaktereket, hanem gyo3zo3dj meg ro1la, hogy azok
       a ta1bla1zatban kora1bban nem szerepelnek.
   3.) Leheto3leg legyen a ta1bla1zat a ``cd'' mezo3 szerint
       no2vekvo3 sorrendben.
*/
static struct {
	int cd,chr,post;
	} *input_table,
        cp852[]={
/**/
        { 129 , 'u' , UMLAUT  },
 	{ 130 , 'e' , VESSZO3 },
        { 131 , 'a' , VESSZO3 },
        { 132 , 'a' , VESSZO3 },
        { 133 , 'a' , VESSZO3 },
        { 134 , 'a' , VESSZO3 },
/**/
        { 136 , 'e' , VESSZO3 },
        { 137 , 'e' , VESSZO3 },
        { 138 , 'O' , HUMLAUT },
        { 139 , 'o' , HUMLAUT },
        { 140 , 'I' , VESSZO3 },
 	{ 141 , 'I' , VESSZO3 },
        { 142 , 'A' , VESSZO3 },
        { 143 , 'A' , VESSZO3 },
 	{ 144 , 'E' , VESSZO3 },
/**/
        { 146 , 'I' , VESSZO3 },
        { 147 , 'o' , HUMLAUT },
 	{ 148 , 'o' , UMLAUT },
 	{ 149 , 'O' , VESSZO3 },
  	{ 150 , 'u' , HUMLAUT },
  	{ 151 , 'U' , VESSZO3 },
 	{ 152 , 'U' , HUMLAUT },
 	{ 153 , 'O' , UMLAUT },
 	{ 154 , 'U' , UMLAUT },
/**/
/**/
/**/
/**/
/**/
 	{ 160 , 'a' , VESSZO3 },
 	{ 161 , 'i' , VESSZO3 },
 	{ 162 , 'o' , VESSZO3 },
 	{ 163 , 'u' , VESSZO3 },
/**/
/**/
/**/
/*** Innento3l a DEC International Charcter set ko1djai jo2nnek. ***/
        { 167 , 'O' , HUMLAUT },
        { 181 , 'A' , VESSZO3 },
        { 186 , 'O' , HUMLAUT },
        { 197 , 'A' , VESSZO3 },
        { 201 , 'E' , VESSZO3 },
        { 214 , 'O' , UMLAUT  },
        { 220 , 'U' , UMLAUT  },
	{ 224 , 'O' , VESSZO3 },
	{ 225 , 'a' , VESSZO3 },
        { 233 , 'U' , VESSZO3 },
        { 235 , 'U' , HUMLAUT },
        { 236 , 'I' , VESSZO3 },
        { 237 , 'i' , VESSZO3 },
        { 242 , 'O' , VESSZO3 },
        { 243 , 'o' , VESSZO3 },
        { 244 , 'o' , HUMLAUT },
        { 245 , 'o' , HUMLAUT },
        { 246 , 'o' , UMLAUT  },
        { 249 , 'U' , VESSZO3 },
        { 250 , 'u' , VESSZO3 },
        { 251 , 'u' , HUMLAUT },
        { 252 , 'u' , UMLAUT  },
        { 253 , 'U' , HUMLAUT },
	{  0  ,  0  ,  0  }
/**/
        },
	ibm_table[129]={
/**/
        { 129 , 'u' , UMLAUT  },
 	{ 130 , 'e' , VESSZO3 },
        { 131 , 'a' , VESSZO3 },
        { 132 , 'a' , VESSZO3 },
        { 133 , 'a' , VESSZO3 },
        { 134 , 'a' , VESSZO3 },
/**/
        { 136 , 'e' , VESSZO3 },
        { 137 , 'e' , VESSZO3 },
        { 138 , 'e' , VESSZO3 },
        { 139 , 'I' , VESSZO3 },
        { 140 , 'I' , VESSZO3 },
 	{ 141 , 'I' , VESSZO3 },
        { 142 , 'A' , VESSZO3 },
        { 143 , 'A' , VESSZO3 },
 	{ 144 , 'E' , VESSZO3 },
/**/
        { 146 , 'I' , VESSZO3 },
        { 147 , 'o' , HUMLAUT },
 	{ 148 , 'o' , UMLAUT },
 	{ 149 , 'O' , VESSZO3 },
  	{ 150 , 'u' , HUMLAUT },
  	{ 151 , 'U' , VESSZO3 },
 	{ 152 , 'U' , HUMLAUT },
 	{ 153 , 'O' , UMLAUT },
 	{ 154 , 'U' , UMLAUT },
/**/
/**/
/**/
/**/
/**/
 	{ 160 , 'a' , VESSZO3 },
 	{ 161 , 'i' , VESSZO3 },
 	{ 162 , 'o' , VESSZO3 },
 	{ 163 , 'u' , VESSZO3 },
/**/
/**/
/**/
/*** Innento3l a DEC International Charcter set ko1djai jo2nnek. ***/
        { 167 , 'O' , HUMLAUT },
        { 181 , 'A' , VESSZO3 },
        { 186 , 'O' , HUMLAUT },
        { 197 , 'A' , VESSZO3 },
        { 201 , 'E' , VESSZO3 },
        { 214 , 'O' , UMLAUT  },
        { 220 , 'U' , UMLAUT  },
        { 224 , 'O' , VESSZO3 },
        { 225 , 'a' , VESSZO3 },
        { 233 , 'e' , VESSZO3 },
        { 235 , 'U' , HUMLAUT },
        { 236 , 'I' , VESSZO3 },
        { 237 , 'i' , VESSZO3 },
        { 242 , 'O' , VESSZO3 },
        { 243 , 'o' , VESSZO3 },
        { 244 , 'o' , HUMLAUT },
        { 245 , 'o' , HUMLAUT },
        { 246 , 'o' , UMLAUT  },
        { 249 , 'U' , VESSZO3 },
        { 250 , 'u' , VESSZO3 },
        { 251 , 'u' , HUMLAUT },
        { 252 , 'u' , UMLAUT  },
        { 253 , 'U' , HUMLAUT },
	{  0  ,  0  ,  0  }
/**/
	}; /* Az array to2bbi re1sze nulla K&R szerint, i1gy tulajdonke1ppen
	      ez az utolso1 sor is felesleges. */
char sibmt[128]; /* Ez egy kereso3 ta1bla1zat, amit a prepare_table to2lt
		  * ki, e1s meggyors1tja a kerese1st az ibm_table
		  * ta1bla1zatban. */

/* Verzio1 sza1m. */
#define HI_VERS  4
#define LO_VERS  1
/* Da1tum. */
#define VERS_DATE "17/11/03"
/* Ugyanez numerikusan. */
#define VERS_D 17
#define VERS_M 11
#define VERS_Y 03
/* Az a minima1lis HION verzio1, amelyik ma1r olvasni tudja az ezen
 * verzio1 a1ltal genera1lt bina1ris szo1ta1r fa1jlt. */
#define MI_VERS  1
#define MO_VERS  7

/* Internal error hiba ko1dok. */

	/*
	BADHOF	nemle1tezo3 a1llapotba jutott a huoff automata.
	VMSPAT	argv[0], ami VMS alatt a program neve e1s mindi1g
		tartalmazza az o2ve1nyt nem tartalmaz ] karaktert, e1s
		eze1rt a program nem tudja leva1gni az o2sve1nyt a
		ne1v elo3l.
	VMSEXT	argv[0], ami VMS alatt a program neve e1s mindi1g
		tartalmazza a kiterjeszte1st (EXE) nem tartalmaz pontot, e1s
		eze1rt a program nem tudja leva1gni a kiterjeszte1st a
		ne1v mo2gu2l.
	BADISC  olyan o2sszetett hosszu1 betu3t akar elva1lasztani a program,
		amelyik a magyarban nem le1tezik. (tex_discretion)
	BADTXC	olyan o2sszetett betu3t akar kii1rni a program, amelyik a
		magyar nyelveben nem le1tezik. (tex_code)
	BADTXK	a betu3 nem is egyszeru3, nem is o2sszetett, nem is
		e1kezetes. (tex_code)
	BADEK1
	BADEK2
	BADEK3	a send_character fu2ggve1ny olyan ko1dok kapott, amelyik egy
		e1kezetes betu2 ko1dja kellene, hogy legyen, de az adott
		betu3 a magyar nyelvben nem haszna1lhato1 az adott
		e1kezettel. (Ez belso3 hiba, mert pl. az e3 nem alakul a1t
		belso3 ko1dda, hanem megmarad ke1t betu2nek.)
	BADUPC	a send_character fu2ggve1ny olyan ko1dot kapott, amelyik egy
		o2sszetett betu2 ko1dja kellene, hogy legyen, de az adott
		betu2 nem le1tezik a magyar nyelvben.
	WEIRDE	csu1nya belso3 hiba. Az utolso1 E betu2 aze1rt kell, hogy
		kijo2jjo2n a hat betu2.
	BAD_IK	olyan igeko2to3re lett meghi1vva az igeko2to3 atomata,
		amelyik nem le1tezik.
	BADOF4
	BADOF5	a hion fu2ggve1nyben ki lett kapcsolva az elva1laszta1s e1s
		az e1kezetek a1ti1ra1sa a \( illetve \[ jelek hata1sa1ra,
		pedig a LaTeX opcio1 nem is lett haszna1lva.
        SMSRLP  a SplitCWord jobban le akarja hu1zni a szo1t mint amennyi
                hely van, ez pedig egy kicsit vad, mert igen sok hely van.
        TCWOR   Tu1lzottan o2sszetett szo1, azaz to2bb mint MAX_PREHYP
                elva1laszta1si hely van megadva. Ennek azonban ma1r ki kell
                deru2lnie a szo1ta1r fele1pi1te1sekor. Lehet, hogy a
                szo1ta1r fa1jl se1ru2lt meg.
        FLDPT   Egy szo1ta1rbeli pointer a szo1ta1ron ki1vu2lre mutat. Valo1-
                szi1nu3leg megse1ru2lt a szo1ta1r.
        CWNNL   CompWor e1rte1ke nem NULL a kezdet kezdete1n. Zu3ro2s...
        FSMBE   Az automata1ban maradt egy olyan e1l, amelyik nem mutat
                sehova. Zu3ro2s...
        TMTRA   Tu1l sok a1tmenet akar keletkezni egy a1llapotbo1l. Ez aze1rt
                e1rdekes, mert csak betu3ket engedu2nk meg, kis e1s nagybetu3
                ugyanaz, e1s 256 a1tmenet lehet.
	*/
#define IERR_BADHOF  0
#define IERR_VMSPAT  1
#define IERR_VMSEXT  2
#define IERR_BADISC  3
#define IERR_BADTXC  4
#define IERR_BADTXK  5
#define IERR_BADEK1  6
#define IERR_BADEK2  7
#define IERR_BADEK3  8
#define IERR_BADUPC  9
#define IERR_WEIRDE 10
#define IERR_BAD_IK 11
#define IERR_BADOF4 12
#define IERR_BADOF5 13

#define IERR_MSDEXT IERR_VMSEXT

/* Flagek minden egyes karakterhez.                                         */
struct {
        byte flag;
        char elso3;    /* Dupla ma1ssalhangzo1k elso3 betu3je.              */
        char ma1sodik; /* Dupla ma1ssalhangzo1k ma1sodik betu3je.           */
       } chartype[256];

#define CHT_MAGA1NHANGZO1 16 /* Nulla1s bit 1 minden maga1nhangzo1ra.       */
#define CHT_DUPLA         32 /* Egyes bit jelzi, hogy dupla ma1ssalhangzo1. */
#define CHT_MA1SSAL       64 /* Ha1rmas bit jelo2li a ma1ssalhangzo1t.      */
#define CHT_MASK          15

/* .................... GLOBA1LIS VA1LTOZO1K .............................. */

char oastr[100]; /* Option Argument STRing.                                 */
int  oasym;      /* Option Argument SYMbol.                                 */
char *oanext;    /* Option Argument Next (a ko2vetkezo2 opcio1.             */
char *oathis;
FILE *fp,*fo;  /* fp a bemeno3 fa1jl, fo a kimeno3 fa1jl pointer.           */

byte HUGE *CompWor=NULL; /* Az o2sszetett szavak szo1ta1ra.                 */

/* Opcio1 kapcsolo1 flagek.                                                 */
int _charset;  /* Karakter ke1szlet, amelyet a ke1pernyo3n haszna1lunk.     */
int warnings;  /* Figyelmezteto3 u2zenetek bekapcsola1sa e1s kikapcsola1sa. */
int mintag;    /* Egy szo1tag minima1lis hossza.                            */
int extroff;   /* Bonyolult szo1tagola1s kikapcsola1sa.                     */
int vesszo3,
    umlaut,
    humlaut;   /* A vesszo3t, ke1t pontot,
				e1s a dupla vesszo3t jelzo3 karakterek.     */
int hypon;     /* Elva1laszta1s bekapcsola1sa.                              */
int latex;     /* Opcio1val bekapcsolhato1 latex szekvencia1k elleno3rze1se.*/
int megmeg;    /* Opcio1val bekapcsolhato1 igeko2to3k figyele1se.           */
int sa1gse1g;  /* Opcio1val kapcsolhato1 sa1g se1g postfixek figyele1se.    */
int matex;     /* Opcio1val kapcsolhato1 a matex kimenet.                   */
int onlysz_sz; /* Opcio1val kapcsolhato1, hogy csak a bonyolult szavakat
		  va1lassza el a Hion, a to2bbi a MaTeX-re bi1zhato1.       */
int statisz;   /* Opcio1val elnyomhato1 a statisztika kii1ra1sa.            */
int braces;    /* Opcio1val va1laszthato1, hogy a dupla karaktereket
		  {} jelek ko2ze1 za1rja-e a program.                       */
int posthy;    /* Az olyan szavak uta1n, amelyeket nem va1lasztunk el
                  tegyu2nk-e \- jelet.                                      */
int protection;/* Az olyan TeX kulcsszavak, mint scaled, ve1delme.          */
int careligatures; /* A ligatu1ra1k figyele1se elva1laszta1skor.            */
int makebars;  /* I1rjuk-e ki a kapcsolo1 | e1s @ karaktereket.             */
int debugdicc; /* ASCII vagy bina1ris forma1ban i1rjuk ki a szo1ta1rat.     */
int usedicc;   /* Haszna1ljuk-e a szo1ta1rat az o2sszetett szavakhoz.       */
int defaultdicc;/* A default szo1ta1rat haszna1ljuk-e.                      */
int useftime;  /* Megvizsga1ljuk-e, hogy kell-e valamit csina1lni.
                * (build or make)                                           */
/* Statisztikai va1ltozo1k. */
#define MAX_STAT 15
long nr_[MAX_STAT];
/* HiOn tatisztikai va1ltozo1k.                                             */
#define nr_tl  (nr_[ 0])/* tex_ligatu1ra vizsga1lat.                        */
#define nr_tls (nr_[ 1])/* sikeres tex_ligatura vizsga1lat.                 */
#define nr_td  (nr_[ 2])/* tex discretionary elva1laszta1s.                 */
#define nr_pf  (nr_[ 3])/* prefix fu2ggve1ny meghi1va1s.                    */
#define nr_pfs (nr_[ 4])
#define nr_tc  (nr_[ 5])/* tex_code                                         */
#define nr_ik  (nr_[ 6])/* igeko2to3 vizsga1lat.                            */
#define nr_iks (nr_[ 7])/* Igeko2to3 tala1lva.                              */
#define nr_sg  (nr_[ 8])/* sa1g se1g kerese1s                               */
#define nr_sgs (nr_[ 9])/* sa1g se1g tala1lva.                              */
#define nr_w   (nr_[10])/* a szavak sza1ma                                  */
#define nr_c   (nr_[11])/* a veze1rlo3 szavak sza1ma                        */
#define nr_cw  (nr_[12])/* o2sszetett szavak kerese1se                      */
#define nr_cws (nr_[13])/* o2sszetett szavak sza1ma                         */
#define nr_cwh (nr_[14])/* extra elva1laszta1sok kive1tel szo1ta1rbo1l      */
/* DICC statisztikai va1ltozo1k.                                            */
#define nr_st  (nr_[ 0])/* A1llapotok sza1ma.                               */
#define nr_rw  (nr_[ 1])/* Beolvasott sorok sza1ma. (Megjegyze1sek ne1lku2l)*/
#define nr_ll  (nr_[ 2])/* Leghoszabb szo1.                                 */
#define nr_sl  (nr_[ 3])/* Legro2vide3bb sor.                               */
#define nr_hy  (nr_[ 4])/* Legto2bb elva1laszta1s.                          */
char dcb_path[FNL];
char exena[FNL];
main(argc,argv)int argc;char *argv[];{
        char fin[FNL],fou[FNL]; /* Bemeno3 e1s kimeno3 fa1jlok nevei.       */
        char foext[FNL];        /* Kimeneti kiterjeszte1s parancssorba.     */
	int  i,                 /* Sege1d va1ltozo1k a ciklusokhoz.         */
             emxrc,             /* A progam funkcio1ja (hion, huoff,...)    */
             ist,ost;           /* ist==1 ha fp==stdin, ost=1 ha fo==stdout */
        char *cpt,              /* Sege1d va1lt. a kit. leva1ga1sa1hoz.     */
             *out_ext=OUT_EXT,  /* Kimeneti f ne1v kiterjeszte1s.           */
             *inp_ext=INP_EXT;  /* Bemeneti f ne1v kiterjeszte1s.           */
        int (*airga[6])();      /* A fo3 fu2ggve1nyek to2mbje.              */

	FunctionStart("main");
/* INICIALIZA1LA1S. */
	/* A UNIX fordi1to1knak valamie1rt nem tetszett a:
                int (*airga[])()={xuywer,huon,huoff,numoff};
           deklara1cio1. Ez viszont elmegy UNIX alatt e1s VMS-en is. */
	airga[0]=xuywer;
	airga[1]=huon;
	airga[2]=huoff;
	airga[3]=numoff;
	airga[4]=hion;
        airga[5]=dicc;

	/* Statisztikai va1ltozo1k inicializa1la1sa. */
        for( i = 0 ; i < MAX_STAT ; i++ )
          nr_[i] = 0L;

        /* ..... OPCIO1K ALAPE1RTE1KE1NEK BEA1LLI1TA1SA .....               */
        hypon      = 1;/* Elva1laszta1s bekapcsolva.                        */
        latex      = 0;/* Nincs LaTeX figyele1s bydefault.                  */
        megmeg     = 1;/* VAN igeko2to3 elleno3rze1s ba1jdifo1lt.           */
        sa1gse1g   = 1;/* VAN postfix elleno3rze1s by default.              */
        onlysz_sz  = 0;/* Mindent elva1lasztunk.                            */
        braces     = 0;/* Default= nincsenek {} karakterek a dupla
                          betu3k ko2ru2l.                                   */
        posthy     = 0;/* Teszu2nk az olyan szavak uta1n, mint ``hogy''
                        * egy \- jelet, hogy a TeX ne va1lassza el.         */
	protection = 1;/* A ve1delmet ku2lo2n kell kikapcsolni.
                          Ez aze1rt van i1gy mert nem valo1szi1nu3, hogy
                          valaki a scaled vagy egy hasonlo1 szo1t a magyar
                          elva1laszta1sokszerint szeretne elva1lasztani.    */
        statisz  =  1 ;/* Statisztika van ba1jdifo1lt.                      */
        mintag   =  2 ;/* Egy szo1tag minimum ke1t betu2.                   */
        extroff  =  0 ;/* Bonyolult elva1laszta1s bekapcsolva.              */
        vesszo3  = '1';/* A default e1rte1kek                               */
        umlaut   = '2';/*       a szabva1ny i1ra1snak                       */
        humlaut  = '3';/*           felelnek meg.                           */

        matex    =  0 ;/* Default e1rte1k a kontroll szekvencia1k
                          genera1la1sa.                                     */
        careligatures = 1; /* A ligatu1ra1kra oda kell figyelni.            */
        debugdicc = 0 ;/* Bina1ris forma az alape1rtelmeze1s.               */
        usedicc   = 1 ;/* Figyelju2k az o2sszetett szavakat.                */
        makebars  = 0 ;/* Alape1rt szerint nem i1rjuk ki a | e1s @
                        * karaktereket.                                     */
        ist = ost = 0 ;/* Az IO nem a standard (by default)                 */
        warnings  = 1 ;/* 1.3 verzio1 felett default a hibau2zenetek
                          kii1ra1sa, e1s a w opcio1 azt kikapcsolja.        */
        ibm_charset=1 ;/* Haszna1ljuk a magas ko1du1 karaktereket.          */
        defaultdicc=1 ;/* A default az default.                             */
	useftime   =0 ;/* Default mu3ko2de1s a make.                        */
	_charset   =0 ;/* Default karakter ke1szlet a ke1pernyo3n nincs.    */
	input_table = ibm_table;
	input_table[128].cd   =
        input_table[128].chr  =
        input_table[128].post = 0;

#ifdef VMS
#define TXT_CUT ']'
        /* VMS esete1n arg[0] tartalmazza az ege1sz o2sve1nyt. (PATH)
           Ezt le kell va1gni, hogy a program ra1ismerjen maga1ra.          */
	cpt = index(argv[0],TXT_CUT);
        if( cpt++ == NULL )internal(0,IERR_VMSPAT,"VMSPAT");/* Ez nem igaz! */
        {char *icpt;/* Ez a [directory1.][directory2] miatt kell.           */
         while( icpt=index(cpt,TXT_CUT) )cpt = icpt+1;}
	strcpy(fin,cpt);
        *cpt = NUL; /* Leva1gjuk a programot a PATH-ro1l, e1s a1tma1soljuk
                     * dcb_path-ba az exe image helye1t.
                     * Lehet, hogy nem illik beletu1rni argv[*]-be, de me1g
                     * nem mondta senki.                                    */
        strcpy(dcb_path,argv[0]);
	cpt = index(fin,'.');
        if( cpt == NULL )internal(0,IERR_VMSEXT,"VMSEXT");  /* Ez nem igaz! */
        *cpt = NUL;/* Leva1gjuk a kiterjeszte1st.                           */
#else
#ifdef MSDOS
#define TXT_CUT '\\'
#else
#define TXT_CUT '/'
#endif
        /* MSDOS esete1n arg[0] tartalmazza az ege1sz o2sve1nyt. (PATH)
           Ezt le kell va1gni, hogy a program ra1ismerjen maga1ra.
           Unix alatt is elo3fordulhat, hogy le kell va1gni egy kis
           o2sve1nyt.                                                       */
	cpt = argv[0];
        {char *icpt;
        /* Megkeressu2k az utolso1 \-t. (vagy /-t)                          */
        while( icpt = index(cpt,TXT_CUT) )cpt = icpt+1;}
        strcpy(fin,cpt);
        *cpt = NUL; /* Megjegyze1s ugyan az, mint VMS-ne1l.                 */
        strcpy(dcb_path,argv[0]);
        cpt = index(fin,'.');
#ifdef MSDOS
        if( cpt == NULL )internal(0,IERR_MSDEXT,"MSDEXT");
#else
	if( cpt )
#endif
	        *cpt = NUL;/* Leva1gjuk a kiterjeszte1st. */
#endif
#ifndef UNIX /* UNIX alatt kisbetu3snek kell lennie a ne1vnek!              */
        strlwr(fin); /*Kisbetu2sre konverta1ljuk. */
#endif
    /* Megne1zzu2k, ha1tha a program neve megadja, hogy mit kell csina1lni. */
	if( !strcmp(fin,HUON) )
		emxrc = FHUON;
	else
	if( !strcmp(fin,HUOFF) )
		emxrc = FHUOFF;
	else
	if( !strcmp(fin,NUMOFF) )
		emxrc = FNUMOFF;
	else
        if( !strcmp(fin,HION) )
                emxrc = FHION;
        else
        if( !strcmp(fin,DICC) )
                emxrc = FDICC;
        else
		emxrc = FXUYWER;/* Valami perverz nevet kapott az exe.
                                   Az opcio1 me1g bea1lli1thatja,
                                   hogy mit kell csina1lni.
                                   Ennek a fu2ggve1nynek a neve is perverz. */

        strcat(dcb_path,DICC_OUT); /* dcb_path most ma1r a teljes fa1jlnevet
                                    * tartalmazza.                          */

        /* A tova1bbiakban nincs szu2kse1g az argv[0]-ra eze1rt
	   ezt itt a1ti1rjuk. */
	argv[0]=getenv(HION_OPT_ENVIRONMENT);

	if( argc == 1 && emxrc != FDICC && argv[0] == NULL)
	  usage();/* Ez nem te1r vissza!                      */

        strcpy(exena,fin);

        *fin = *fou = NUL;


/* PARANCS SOR E1RTELMEZE1S */
	for( i = argv[0] ? 0 : 1 ; i<argc ; i++ ){
		if( *argv[i] == OPTCHAR1 || *argv[i] == OPTCHAR2  )
                  for( oanext = argv[i] ; oanext ; )
                        switch( scanopt(oathis=oanext) ){
                                default:
                                  hfprintf(stderr,MSG_INV_OPT,oathis);
                                  exit(1);
                                case 1:  /* FUNCTION */
                                  switch(oasym ){
				    case 0: emxrc = FXUYWER; break;
				    case -1:emxrc = FXUYWER; break;
                                    case 1: emxrc = FHION;   break;
                                    case 2: emxrc = FHUON;   break;
                                    case 3: emxrc = FHUOFF;  break;
                                    case 4: emxrc = FNUMOFF; break;
                                    case 5: emxrc = FDICC;   break;
                                    }
                                  break;

                                case 2:  /* MAKE */
                                  useftime=1; break;
                                case 3:  /* BUILD */
                                  useftime=0; break;

                                case 4:  /* BARS   */
                                  makebars=1; break;
                                case 5:  /* NOBARS */
                                  makebars=0; break;

                                case 6: /* ICHARSET */
                                  switch( oasym ){
                                    case 0:
                                           /* load_charset beto2lti a
                                           * karakter ta1bla1t az adott
                                           * fa1jlbo1l. */

                                           load_charset(oastr);
                                           break;

                                    case 1: /* BABAI */
                                           vesszo3 = '\'';
                                           umlaut  = '~';
                                           humlaut = '\"';
                                           break;
                                    case 2: /* 123 */
                                           vesszo3 = '1';
                                           umlaut  = '2';
                                           humlaut = '3';
                                           break;
                                    case 3: /* NO123 */
                                           /* Kikapcsoljuk a
                                            * repulo3 e1kezetek figyelem-
                                            * be ve1tele1t.
                                            */
                                            vesszo3 = VESSZO3;
                                            umlaut  = UMLAUT;
                                            humlaut = HUMLAUT;
                                            break;
                                    case 4: /* CWI        */
                                    case 5: /* ISO-LATIN2 */
                                            input_table=ibm_table;
                                            ibm_charset = 1;
                                            break;
                                    case 6: /* 852        */
                                            input_table=cp852;
                                            ibm_charset = 1;
                                            break;
                                    case 7: /* NOCWI        */
                                    case 8: /* NOISO-LATIN2 */
                                    case 9: /* NO852        */
                                            ibm_charset = 0;
                                            break;
                                    }
				  break;

                                case 7: /* NOHYPHEN */
                                  onlysz_sz= 1;
				  extroff  = 1;
                                  sa1gse1g = 0;
                                  megmeg   = 0;
                                  usedicc  = 0;
                                  break;

                                case 8: /* GENERATE */
                                  switch( oasym ){
                                    case 1: /* ASCII  */
                                        debugdicc = 1; break;
                                    case 2: /* BINARY */
                                        debugdicc = 0; break;
                                    }
				  break;

                                case 9: /* DICTIONARY */
                                  if( !defaultdicc ){
                                    PutLogo();
                                    hfprintf(stderr,MSG_1_DEFD);
				    break;
                                    }
                                  defaultdicc = 0;
                                  strcpy(dcb_path,oastr);
                                  break;

                                case 10: /* OCHARSET */
                                  switch( oasym ){
                                    case 1: /* MATEX      */
                                      matex = 1; break;
                                    case 2: /* CWI        */
                                      matex = 2; break;
                                    case 3: /* ISO-LATIN2 */
                                      matex = 3; break;
                                    case 4: /* 123        */
                                      matex = 4; break;
                                    case 5: /* TEX        */
                                      matex = 0; break;
                                    case 6: /* 852        */
                                      matex = 5; break;
                                    }
                                  break;

                                case 11: /* FILTER */
                                  ist = ost = 1; break;
                                case 41: /* NOFILTER */
                                  ist = ost = 0; break;

                                case 12: /* LIGATURES */
                                  careligatures = 1; break;
                                case 13: /* NOLIGATURES */
                                  careligatures = 0; break;

                                case 14: /* HELP */
                                  help(); /* nem te1r vissza */

                                case 15: /* INPUT */
				  switch( oasym ){
                                    case 1: /* STANDARD */
				      ist = 1; break;
                                    case 2: /* FILE */
                                      ist = 0; break;
                                    }
                                  break;
				case 16: /* OUTPUT */
				  switch( oasym ){
                                    case 1: /* STANDARD */
				      ost = 1; break;
                                    case 2: /* FILE */
                                      ost = 0; break;
                                    }
                                  break;

                                case 17: /* HUMLAUT */
                                  humlaut = *oastr; break;
                                case 18: /* UMLAUT */
                                  umlaut  = *oastr; break;
                                case 19: /* APOSTROPHE */
                                  vesszo3 = *oastr; break;

                                case 20: /* LATEX */
                                  latex = 1; break;
                                case 21: /* NOLATEX */
				  latex = 0; break;

                                case 22: /* IGEKOTO */
                                  megmeg = 1; break;
                                case 23: /* NOIGEKOTO */
                                  megmeg = 0; break;

                                case 24: /* SAG SEG */
                                  sa1gse1g = 1; break;
                                case 25: /* NOSAG NOSEG */
                                  sa1gse1g = 0; break;

                                case 26: /* POSTHYPHEN */
                                  posthy = 1; break;
                                case 27: /* NOPOSTHYPHEN */
                                  posthy = 0; break;

                                case 28: /* PROTECTION */
                                  protection = 1; break;
                                case 29: /* NOPROTECTION */
                                  protection = 0; break;

                                case 30: /* STATISTICS */
                                  statisz = 1; break;
                                case 31: /* NOSTATISZTICS */
                                  statisz = 0; break;

                                case 32: /* USE-DICTIONARY */
                                  usedicc = 1; break;
                                case 33: /* DONT-USE-DICTIONARY */
                                  usedicc = 0; break;

                                case 34: /* DISCRETIONARY */
                                  switch( oasym ){
                                    case 1: /* FULL   */
                                      extroff = 0;
                                      onlysz_sz = 0; break;
                                    case 2: /* UNIQUE */
                                      extroff = 0;
                                      onlysz_sz = 1; break;
                                    case 3: /* NONE */
                                      extroff = 1;
                                      onlysz_sz = 0; break;
                                    }
                                  break;
                                case 35: /* 1LETTER */
                                  mintag = 1; break;
                                case 36: /* NO1LETTER */
                                  mintag = 2;break;

                                case 37: /* WARNINGS */
                                  warnings = 1; break;
                                case 38: /* NOWARNINGS */
                                  warnings = 0; break;

                                case 39: /* BRACKETS */
                                  braces = 1; break;
                                case 40: /* NOBRACKEST */
                                  braces = 0; break;

                                case 42: /* SILENT */
				  warnings = 0; statisz = 0; break;
				case 43: /* SCREEN */
				  switch( oasym ){
				    case 1: /* CWI */
				    case 2: /* ISO_LATIN2 */
				    case 3: /* 852 */
				      _charset = oasym;
				      break;
				    case 4: /* RAW */
				      _charset = 0;
				      break;
				    }
                                  break;
                                case 44: /* NOSILENT */
                                  warnings = 1; statisz = 1; break;
				}
		else	{
			if( *fin == NUL )
				(void)strcpy(fin,argv[i]);
			else
			if( *fou == NUL )
				(void)strcpy(fou,argv[i]);
                        else{
                                PutLogo();
                                hfprintf(stderr,MSG_TOO_MANY_FN);
                                hfprintf(stderr,MSG_USAGE,argv[0]);
				exit(1);
				}
			}
                }/* Argumentum e1rtelmeze1s ve1ge.                          */
        PutLogo();
/* Ne1ha1ny opcio1 to2bbe1 keve1sbe1 u2ti egyma1st.                         */
        if( warnings ){
          if( braces && matex )
            hfprintf(stderr,MSG_B_M);
          }

/* A szabva1ny bementnek ill. szabva1ny kimenetnek nincs ido3pontja, amit
 * hasonli1tani lehetne egyma1shoz, vagy egy fa1jlhoz.                    */
        if( useftime && ( ist || ost ) ){
          useftime = 0;
          if( warnings )
            hfprintf(stderr,MSG_ISTOSTTIME);
          }

/* Ha a kimenet std e1s me1gis meg van adva kimeneti fa1jl, akkor az hiba. */
	 if( ost && *fou ){
                hfprintf(stderr,MSG_TOO_MANY_FN);
		exit(1);
		}

/* Ha a bemenet standard, akkor az elso3nek megadott fa1jlne1v, ami most
   'fin'-ben van, a kimeneti fa1jl neve, e1s eze1rt a1t kell ma1solni
   'fou'-ba, 'fin'-t pedig to2ro2lni kell.                                  */
	if( ist && *fin )
	  (void)strcpy(fou,fin),*fin = NUL;
        /* Ha van bemenet, de nincs kimenet. */
	if( ist && !ost && *fou == NUL ){
                hfprintf(stderr,MSG_NO_OUT);
		exit(1);
		}

/* FA1JL NE1V MASSZI1ROZA1S */
	/* Ha visszafele1 konverta1lunk, akkor a default kiterjeszte1sek
           fordi1tottak.                                                    */
	if( emxrc == FHUOFF )
		cpt = inp_ext , inp_ext = out_ext , out_ext = cpt;
        /* Ha magyar TeX fajlt konverta1lunk, akkor .hun a default kiter.   */
	if( emxrc == FHION )
                inp_ext = INP4_EXT;
        if( emxrc == FDICC )
                inp_ext = DIN_EXT , out_ext = DOU_EXT;
        if( *fin == NUL && !ist && emxrc != FDICC ){
                hfprintf(stderr,MSG_NO_INP);
		exit(1);
		}

        if( *fou == '.' ){/* Ha a ma1sodikke1nt megadott fa1jl ne1v
                           * ponttal kezdo3dik, akkor az csak egy
                           * kiterjeszte1s. */
                out_ext = foext;
                strcpy(out_ext,fou);
                *fou = NUL;
                }

        /* A DICC fix fa1jlnevekkel dolgozik. */
        if( emxrc == FDICC ){
          if( !*fin )
            strcpy(fin,DICC_INP);
          if( !*fou )
            strcpy(fou,DICC_OUT);
            if( cpt = index(fou,'.') )
              *cpt = NUL; /* Leva1gjuk a kiterjeszte1st. */
          }

        if( !ist ){
          cpt = index(fin,TXT_CUT);
          if( cpt ){
            char *icpt;
            do{
              icpt = index( cpt+1 , TXT_CUT );
              if( icpt )cpt = icpt; else break;
              }while(1);
            }
          else
            cpt =fin;
          cpt = index(cpt,'.');
          if( cpt == NULL )
            (void)strcat(fin,inp_ext);
          }

        if( *fou == NUL && !ost ){/* Ha nincs kimeneti ne1v, akkor ugyan az
                                     mint a bemeneti ne1v.                 */
		(void)strcpy(fou,fin);

                /* A PATH-ban nem keresu2nk pontot. */
                cpt = index(fou,TXT_CUT);
                /* Ha meg van adva valamilyen PATH a fa1jl nevében,
                   akkor megkeressu2k a PATH ve1ge1t. */
                if( cpt ){
                    char *icpt;
                    do{
                      icpt = index( cpt+1 , TXT_CUT );
                      if( icpt )cpt = icpt; else break;
                      }while(1);
                    cpt++;
                    }
                  else
                    cpt =fou;
		cpt = index(cpt,'.');

		if( cpt != NULL )
			*cpt = NUL;
		(void)strcat(fou,out_ext);
		}
        else{
          /* A PATH-ban nem keresu2nk pontot. */
          cpt = index(fou,TXT_CUT);
          /* Ha meg van adva valamilyen PATH a fa1jl nevében,
             akkor megkeressu2k a PATH ve1ge1t. */
          if( cpt ){
            char *icpt;
            do{
              icpt = index( cpt+1 , TXT_CUT );
              if( icpt )cpt = icpt; else break;
              }while(1);
            }
          else
            cpt =fou;
          cpt = index(cpt,'.');
          if( cpt == NULL )
		(void)strcat(fou,out_ext);
          }

        /* Gondok lehetnek, ha ugyan az a bemeneti, e1s a kimeneti fa1jl.
           Ez alo1l a vms kive1tel, mert ott egy u1j verzio1 keletkezik.    */
	if( !strcmp(fin,fou) && *fin ){
#ifdef VMS
                if( warnings )/* VMS alatt ez csak egy warning e1s eze1rt
                                elnyomhato1.                                */
#endif
                  hfprintf(stderr,MSG_IO_SAME);
#ifndef VMS
		exit(1);
#endif
		}
	/* Ha a mu3ko2de1s hion, e1s a hion lei1ra1st fordi1tjuk, akkor a -l
           opcio1 felte1tlenu2l kell.                                       */
	if( emxrc == FHION && !latex && !strcmp(fin,"hion.hun") ){
                hfprintf(stderr,MSG_HION_LATEX);
		}

/* Fa1jl ido3pont vizsga1lat. */
        if( useftime )useftime= kora1bbi(fin,fou) ;
          /* useftime mostanto1l 1, ha nem kell fordi1tani. */
        if( !useftime ){
/* FA1JL NYITOGATA1SOK. */
          fp = ist ? ((FILE * FAR)stdin) : fopen(fin,"r");
          if( !fp )
          {
            hfprintf(stderr,MSG_UNABLE_TO_OPEN,fin);
            exit(1);
          }

          /* A DICC funkcio1 bina1ris fa1jt ke1szi1t. */
          fo = ost ? ((FILE * FAR)stdout) : ((emxrc == FDICC && !debugdicc)
                                                ? fopen(fou,BRITE) :
                                                  fopen(fou,WRITE));
          if( !fo )
          {
            hfprintf(stderr,MSG_UN_W,fou);
            exit(1);
          }
          /* Ha a kimenet vagy a bemenet standard, akkor nem i1rjuk ki a
             konverzio1s file neveket.                                      */
          }
        if( !(ist || ost) && warnings )
                hfprintf(stderr,MSG_CONV,fin,fou);

        if( useftime ){
          if( warnings )
            hfprintf(stderr,MSG_NOTHINGTODO);
          exit(0); /* Ez nem hiba. */
          }

        /* Az elso3 sort fogjuk elo3szo2r beolvasni.                        */
        LineNumber = 1;

/* KONVERZIO1. */
	i = (*airga[emxrc])();

/* FA1JL CSUKOGATA1SOK. */
	ist || fclose(fp);
	ost || fclose(fo);

        if( statisz )report_stat(emxrc);

	EndFunction;
	ReportCpuUsage();
/* Itt a program kileheli a lelke1t e1s megte1r az oprendszerhez.           */
#ifndef VMS
/* A VMS szeret
   %NONAME-W-NOMSG, Message number 00000000
   u2zeneteket kii1rni.                                                     */
	return(i);
#endif
        }/* A main() ve1ge. */

#define OVT_NONE    0
#define OVT_STRING  1
#define OVT_SYMBOL  2
#define OVT_INTEGER 3
#define OVT_REAL    4
#define OVT_TIME    5
#define OVT_CHAR    6

struct opt {
  int OptVal;
  char *option;
  int valtype;
  char *values;
  char *help;
  } Options[] = {

  1 , "FUN*CTION"  , OVT_SYMBOL , "HION,HUON,HUOFF,NUMOFF,DICC" ,
#ifdef UNIX
"-fun=hion,huon,huoff,numoff,dicc\n",
#else
"/FUNction=HION,HUON,HUOFF,NUMOFF,DICC\n",
#endif

  2 , "MAK*E"      , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-make-build     ",
#else
"/MAKE/BUILD     ",
#endif

  3 , "BUI*LD"     , OVT_NONE   , NULL                          ,
NULL,

  4 , "BAR*S"      , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]bars\n",
#else
"/[NO]BARS\n",
#endif

  5 , "NOBAR*S"    , OVT_NONE   , NULL                          ,
NULL,

  6 , "ICH*ARSET"  , OVT_SYMBOL , "BABAI,123,NO123,CWI,ISO*_LATIN2,852,NOCWI,NOISO*_LATIN2,NO852",
#ifdef UNIX
"-ich=babai,[no]123,[no]cwi,[no]iso,[no]852\n",
#else
"/ICHarset=BABAI,[NO]123,[NO]CWI,[NO]ISO_latin2,[NO]852\n",
#endif

  7 , "NOHYP*HEN"  , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-nohyp          ",
#else
"/NOHYPhen       ",
#endif

  8 , "GEN*ERATE"  , OVT_SYMBOL , "ASC*II,BIN*ARY"                ,
#ifdef UNIX
"-gen=asc,bin                    ",
#else
"/GENerate=ASCii,BINary          ",
#endif

  9 , "DICT*IONARY", OVT_STRING , NULL                          ,
#ifdef UNIX
"-dict\n",
#else
"/DICTionary\n",
#endif

 10 , "OCH*ARSET"  , OVT_SYMBOL , "MATEX,CWI,ISO*_LATIN2,123,TEX,852",
#ifdef UNIX
"-och=matex,cwi,iso,123,tex,852\n",
#else
"/OCHarset=MATEX,CWI,ISO_latin2,123,TEX,852\n",
#endif

 11 , "FILT*ER"    , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]filt       ",
#else
"/[NO]FILTer     ",
#endif

 12 , "LIG*ATURES" , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]lig        ",
#else
"/[NO]LIGatures  ",
#endif

 13 , "NOLIG*ATURES",OVT_NONE   , NULL                          ,
NULL,

 14 , "HELP"      , OVT_NONE   , NULL                          ,
NULL,

 15 , "IN*PUT"     , OVT_SYMBOL , "STAN*DARD,FILE"               ,
#ifdef UNIX
"-in-out=stan,file\n",
#else
"/INput/OUTput=STANdard,FILE\n",
#endif

 16 , "OUT*PUT"    , OVT_SYMBOL , "STAN*DARD,FILE"               ,
NULL,

 17 , "HUM*LAUT"   , OVT_CHAR   , NULL                          ,
#ifdef UNIX
"-[h]umlaut-apos=CHAR\n",
#else
"/[H]UMLAUT/APOStrophe=char\n",
#endif

 18 , "UM*LAUT"    , OVT_CHAR   , NULL                          ,
NULL,

 19 , "APOS*TROPHE", OVT_CHAR   , NULL                          ,
NULL,

 20 , "LAT*EX"     , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]lat        ",
#else
"/[NO]LATex      ",
#endif

 21 , "NOLAT*EX"   , OVT_NONE   , NULL                          ,
NULL,

 22 , "IGE*KOTO"   , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]ige        ",
#else
"/[NO]IGEkoto    ",
#endif

 23 , "NOIGE*KOTO" , OVT_NONE   , NULL                          ,
NULL,

 24 , "SAG"       , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]sag-[no]seg\n",
#else
"/[NO]SAG/[NO]SEG\n",
#endif

 24 , "SEG"       , OVT_NONE   , NULL                          ,
NULL,

 25 , "NOSAG"     , OVT_NONE   , NULL                          ,
NULL,

 25 , "NOSEG"     , OVT_NONE   , NULL                          ,
NULL,

 26 , "POSTH*YPHEN", OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]posth      ",
#else
"/[NO]POSTHyphen ",
#endif

 27 , "NOPOSTH*YPHEN",OVT_NONE  , NULL                          ,
NULL,

 28 , "PROT*ECTION", OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]prot       ",
#else
"/[NO]PROTection ",
#endif

 29 , "NOPROT*ECTION",OVT_NONE  , NULL                          ,
NULL,

 30 , "STAT*ISTICS", OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]stat       ",
#else
"/[NO]STATistics ",
#endif

 31 , "NOSTAT*ISTICS",OVT_NONE  , NULL                          ,
NULL,

 32 , "USE*_DICTIONARY",OVT_NONE, NULL                          ,
#ifdef UNIX
"-[dont_]use\n",
#else
"/[DONT_]USE_dictionary\n",
#endif

 33 , "DONT_USE*_DICTIONARY",OVT_NONE, NULL                     ,
NULL,

 34 , "DISCR*ETIONARY",OVT_SYMBOL , "FULL,UNI*QUE,NO*NE",
#ifdef UNIX
"-discr=full,uni,no\n",
#else
"/DISCRetionary=FULL,UNIque,NOne\n",
#endif

 35 , "1*LETTER" , OVT_NONE , NULL                              ,
#ifdef UNIX
"-[no]1          ",
#else
"/[NO]1letter    ",
#endif

 36 , "NO1*LETTER" , OVT_NONE   , NULL                          ,
NULL,

 37 , "WARN*INGS"  , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]warn       ",
#else
"/[NO]WARNings   ",
#endif

 38 , "NOWAR*NINGS", OVT_NONE   , NULL                          ,
NULL,

 39 , "BRAC*KETS"  , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]brac\n",
#else
"/[NO]BRACkets\n",
#endif

 40 , "NOBRAC*KETS", OVT_NONE   , NULL                          ,
NULL,

 41 , "NOFILT*ER"  , OVT_NONE   , NULL                          ,
NULL,

 42 , "SIL*ENT"    , OVT_NONE   , NULL                          ,
#ifdef UNIX
"-[no]sil\t",
#else
"/[NO]SILent\t",
#endif

 43 , "SCR*EEN"   , OVT_SYMBOL  , "CWI,ISO*_LATIN2,852,RAW"     ,
#ifdef UNIX
"-scr=cwi,iso,852,raw\n",
#else
"/SCReen=CWI,ISO_latin2,852,RAW\n",
#endif

 44 , "NOSIL*ENT" , OVT_NONE    , NULL                          ,
NULL,
  0 , NULL , OVT_NONE , NULL

  };

/* string hasonli1ta1sa minta1hoz. */
int _ sstreq(s1,s2)char *s1;char *s2;{
  int star;

  star = 0;
  while( *s1 && *s1 != '=' && *s1 != '~' ){

    if( *s2 == '*' ){
      star = 1;
      s2++;
      continue;
      }

    if( *s1 != *s2 )return 0;
    if( *s2 == ',' )break;
    s1++;
    s2++;

    }

  if( star || *s2 == '*' ) return 1;
  if( *s2 && *s2 != ',' )return 0;
  return 1;

  }

/* Az 's' opcio1 megada1st vizsga1lja az 'Options' ta1bla1zat alapja1n.
 *
 */
int _ scanopt(s)char *s;{
  int i,j;
  char *q;

  oanext = NULL;

  if( *s == OPTCHAR1 || *s == OPTCHAR2 )s++;

  /* A1tkonverta1ljuk az opcio1t nagybetu3sse1. */
  for( j = 0 , i = 1 ;
       s[j] && s[j] != OPTCHAR1 && s[j] != OPTCHAR2 && s[j] != ' '; j++ ){
    /* Ide1zo3jeleken belu2l nem konverta1lunk. */
    if( s[j] == '\"' || *s == '\'' )i=1-i;
    if( islower(s[j]) && i )s[j] = toupper(s[j]);
    }

  while( s[j] == ' ' )s[j++]=NUL;

  if( s[j] == OPTCHAR1 || s[j] == OPTCHAR2 ){
    s[j] = NUL;
    oanext = s+j+1;
    }
  for( i= 0 ; Options[i].option ; i++ )
    if( sstreq(s, Options[i].option) )break;

  if( !Options[i].option )return 0;

  switch( Options[i].valtype ){
    case OVT_NONE: /* Nincs parame1ter, oasym e1s oastr nem e1rtelmezett.*/
	 return Options[i].OptVal;

    case OVT_CHAR: /* Pontosan egy karakter az opcio1 parame1tere. */
         while( *s && *s != '=' && *s != '~' )s++;
	 if( *s )s++;
	 *oastr = *s;
         oastr[1] = NUL;
	 return Options[i].OptVal;

    case OVT_SYMBOL: /* Szimbo1lum, vagy string az e1rte1k.             */
                     /* oasym a szimbo1lum sorsza1ma.                   */
                     /* oasym == -1 ha nincs semmilyen e1rte1k megadva. */
                     /* oasym ==  0 ha e1rte1k van, de nem szimbo1lum.  */
         while( *s && *s != '=' && *s != '~' )s++;
	 if( *s )s++; else { oasym = -1; return Options[i].OptVal; }
	 q=Options[i].values;j=1;
	 while( *q ){
	   if( sstreq(s,q) ){
	     oasym = j;
	     return Options[i].OptVal;
	     }
	   while( *q && *q != ',' )q++;
	   if( *q ) q++;
	   j++;
	   }
	 oasym = 0;
         /* Nem tala1ltunk megfelelo3 szimbo1lumot, lehet, hogy
          * string lett megadva. */
         if( *s == '\"' || *s == '\'' )s++;
         for( j=0 ; *s && *s != '\"' && *s != '\'' ; j++ )oastr[j] = *s++;
         oastr[j]=NUL;
         if( *s == '\"' || *s == '\'' )s++;
         if( *s ){
           hfprintf(stderr,"Superflouos characters.\n");
           return 0;
           }
	 return Options[i].OptVal;

    case OVT_STRING:/* Az e1rte1k string. oastr a megadott
                       string ide1zo3jelek ne1lku2l.        */
         while( *s && *s != '=' && *s != '~' )s++;
         if( *s )s++;
         if( *s == '\"' || *s == '\'' )s++;
         for( j=0 ; *s && *s != '\"' && *s != '\'' ; j++ )oastr[j] = *s++;
         oastr[j]=NUL;
         if( *s == '\"' || *s == '\'' )s++;
         if( *s ){
           hfprintf(stderr,"Superflouos characters.\n");
           return 0;
           }
	 return Options[i].OptVal;

    case OVT_TIME:
    case OVT_INTEGER:
    case OVT_REAL:   hfprintf(stderr,"Not implemented feature.\n");exit(1);
    }

  }


/* A logo stringet kiteszi a ke1pernzo3re, de csak egyszer futa1sonke1nt. */
int PutLogo(){
  static q=0;

  if( q )return 0;
  q=1;
  if( warnings )
    hfprintf(stderr,MSG_LOGO,exena,HI_VERS,LO_VERS,VERS_DATE,SYSTEM);
  return 0;
  }
/* CUT */
/* Ez a fu2ggve1ny kito2lti chartype to2mbo2t.
 *
 * Ennek a to2mbnek az i-edik eleme, az i ko1du1 karakterro3l ad
 * informa1cio1t. Ez az informa1cio1 egy flag e1s ke1t karakter.
 *
 * A flag also1 ne1gy bitje egyes minden ma1ssalhangzo1 e1s a nagy
 * betu3s maga1nhangzo1k esete1n. A kisbetu3s maga1nhangzo1kna1l az
 * e1rte1ke specia1lis ta1bla1zatbeli eltola1st a MaTeX karakter
 * ke1szletne1l.
 *
 * Az 4. bit 1 minden maga1nhangzo1 esete1n.
 *
 * Az 5. bit 1 ha a ma1ssalhangzo1 lehet hosszu1 ma1ssalhangzo1 elso3
 * betu3je. Ebben az esetben ``elso3'' a dupla betu3 elso3, ``ma1sodik''
 * a dupla betu3 ma1sodik betu3je. (Egy specia1lis eset a cs e1s a ch.
 * A cs c-ke1nt e1s extra bitekkel, a ch h-ke1nt e1s extra bitekkel van
 * ta1rolva. I1gy a 'h' egy dupla betu3 ko1dja lehet, amelynek az elso3
 * betu3je ne 'h' hanem 'c'.)
 *
 * A  6. bit 1 minden ma1ssalhangzo1 esete1n.
 *
 */
void _ prep_chttable(){
	int i,j;

	FunctionStart("prep_chttable");
        /* Elke1szi1tju2k a karakter ti1pus ta1bla1t.                       */
        for( i=0 ; i<256 ; i++ ){/* Inicializa1la1s.                        */
          chartype[i].flag = 15; /* Az also fe1l ba1jt 1111.                */
	  chartype[i].ma1sodik = 0;
	  chartype[i].elso3    = 0;
	  }

	for( i=0 ; i<5 ; i++ )
	  chartype["aeuio"[i]].flag = i*3;

        for( i=0 ; i<10 ; i++ )/* 5 db maga1nhangzo1 van.                   */
	  chartype["aAeEuUiIoO"[i]].flag |= CHT_MAGA1NHANGZO1;

        for( i=0 ; i<42 ; i++ )/* 42 db ma1ssalhangzo1 van.                 */
	  chartype["qwrtypsdfghjklzxcvbnmQWRTYPSDFGHJKLZXCVBNM"[i]].flag |=
	    CHT_MA1SSAL;

        for( i=0 ; i<9 ; i++ )/* 9 darab dupla ma1ssalhangzo1 van.          */
	  chartype["cgltszdnh"[i]].flag  |= CHT_DUPLA;


        for( i=0 ; i<8 ; i++ ){/* 8 darab dupla ma1ssalhangzo1 van, plusz ch*/
	  j = "cszdtlgn"[i];
	  chartype[j].elso3 = j;
	  chartype[j].ma1sodik = "szszyyyy"[i];
          }
       /* A ch karakter specia1lisan van ko1dolva, hogy ne legyen
          o2sszekeverve a cs-vel.                                           */
       chartype['h'].elso3 = 'c';
       chartype['h'].ma1sodik = 'h';

       RETURN;
       }/* prep_chttable() ve1ge */

/* Ez a va1ltozo1 jelzi, hogy a HiOn e1ppen milyen u2zemmo1dban van.
 * Ha a HiOn ki lett kapcsolva ke1t || jellel, akkor nem szabad a1ti1rni
 * az e1kezetes betu3ket jelo2le1s szekvencia1va1, mert azok nem minden
 * esetben lesznek jo1l visszaalaki1tva.
 */
int off_mode;

/* getinteger egy ege1sz sza1mot olvas be az f  fa1jlbo1l. Egy ege1sz
   sza1mot aka1rha1ny szo1ko2z, u1jsor, vagy tabula1tor bevezethet. Egy
   ege1sz sza1m sza1mjegyek sorozata. Ba1rmilyen nem sza1mjegy karakter
   megfelel egy ege1sz sza1mnak, ami a karakter ASCII ko1dja, kive1ve a \
   karaktert e1s a szo1ko2zt. Egy \ karakter uta1n a1llo1 ba1rmilyen
   karakter a saja1t ASCII ko1dja1t jelenti, me1g a szo1ko2z, a \ e1s a 0..9
   karakterek is. I1gy leheto3se1g van arra, hogy az IBM-PC konverzio1s
   ta1bla1zatot ke1nyelmesen lehessen bei1rni.

   EOF esete1n -1 a visszate1re1si e1rte1k. */
int _ getinteger(f)FILE *f;{
	register int c;
	register int k;

        FunctionStart("getinteger");
	/* Szo1ko2z nem sza1mi1t. */
	while( isspace(c = getc(f)) )
		continue;
        /* Ba1rmilyen nem sza1mjegy nem \ e1s nem space karakter o2nnmaga
           ascii ko1dja1t adja. \ helyett \\-t kell i1rni, sza1mjegy helyett
	   \sza1mjegyet, e1s szo1ko2z helyett \szo1ko3zt. */
	if( c > 128 || ( c == '\\' && (c=getc(f))) || !isdigit(c) )Return(c);

	/* A sza1mjegyek decima1lis sza1mke1nt e1rtelmezo3dnek. */
	for( k = 0 ; isdigit(c) ; (c=getc(f)))
		k = 10 * k + c - '0';
	Return(k);
        }/* getinteger() ve1ge */

/* A1talaki1tja a bee1pi1tett ta1bla1zatot annak megfelelo3en, hogy
 * milyen karaktereket haszna1lunk e1ppen az e1kezetek jelo2le1se1re.
 * Ha a 0 opcio1t haszna1ljuk, akkor az e1kezeteknek olyan belso3 ko1djuk
 * van, ami nem jo2het a bemenetro3l (ugyanis a ko1d > 256). Ha ba1rmelyik
 * e1kezet jelo2le1se1re valamilyen ASCII karaktert haszna1lunk,
 * akkor ennek megfelelo3en a1t kell alaki1tani a bemeneti ta1bla1t.
 *
 * Ha a ta1bla a1t lett alaki1tva akkor felto2ltju2k a sibmt ta1bla1t, ami
 * a gyors kerese1st teszi leheto3ve1.
 */
void _ prepare_table(){
        int i;

        FunctionStart("prepare_table");
	/* Elo3ke1szi1tju2k a karakter konverzio1s ta1bla1t. */
	if( vesszo3 != VESSZO3 || umlaut != UMLAUT || humlaut != HUMLAUT )
	    for( i=0 ; input_table[i].cd ; i++ )
		switch(input_table[i].post){
			case VESSZO3: input_table[i].post = vesszo3;break;
			case UMLAUT : input_table[i].post = umlaut;break;
			case HUMLAUT: input_table[i].post = humlaut;break;
			default : if( warnings )
                                    hfprintf(stderr,MSG_TRICKY,
				           input_table[i].post);
		        }

        /* Elo3ke1szi1tju2k a sibmt kereso3 ta1bla1zatot.                   */
        for( i=0 ; i<128 ; i++ )sibmt[i]= -1;/* To2ro2lju2k az ege1szet.    */
	for( i=0 ; input_table[i].cd ; i++ )
	     sibmt[input_table[i].cd-128]=i;

	RETURN;
	}

/* IBM karakter ke1szlet beto2lte1se valamilyen file-bo1l.
   A fa1jlne1v hossza1t adja vissza e1rte1kke1nt.                           */
int _ load_charset(s)char *s;{
	FILE *fp;
	register int j,i;
	register int c;

        FunctionStart("load_charset");
        input_table = ibm_table;
	j = strlen(s);

	if( (fp = fopen(s, "r")) == NULL ){
                hfprintf(stderr,MSG_CHARSET,s);
		exit(1);
		}
	for( i = 0 ; i < 128 ; i++ ){/* Maximum 128 sort olvasunk be.  */
		c = getinteger(fp);
		input_table[i].cd   = /* A ta1bla1zat ve1ge1t a leza1ro1 */
                input_table[i].chr  = /* nulla sor jelzi, ha ro2videbb,  */
                input_table[i].post = c > 0 ? c : 0 ; /* mint 128 sor.   */
		if( c == -1 )break;/* Ha ele1rtu2k a fa1jl ve1ge1t.    */
		if( (input_table[i].chr = getinteger(fp)) > 128  && warnings)
                        hfprintf(stderr,MSG_NOREC);
                switch( input_table[i].post = getinteger(fp) ){
                  case  1: input_table[i].post = VESSZO3;break;
                  case  2: input_table[i].post = UMLAUT; break;
                  case  3: input_table[i].post = HUMLAUT;break;
                  default: hfprintf(stderr, MSG_NOREC); break;
                  }
		}
	Return(j);
	}

/* Egy karakter olvasa1sa az fp fa1jlbo1l az input_table felhaszna1la1sa1val.
   Ha az argumentum nem nulla, akkor az olvasa1s inicializa1la1sa
   to2rte1nik.                                                              */
int _ get_character(){
        static int buffer=0;
	register int bb,s;

        FunctionStart("get_character");

	if( buffer ){/* Ha van va1rakozo1 e1rte1k, akkor to2ro2lni kell, e1s
			az a visszate1re1si e1rte1k. */
		bb = buffer;
		buffer = 0;
		Return(bb);
		}

        LineNumber += (s = getc(fp))== NL;/* Sza1moljuk a sorokat.        */
        /* Ha figyelni kell az IBM karaktereket, e1s nincs kikapcsolva az
           a1talaki1ta1s, e1s a karakter ko1dja nagyobb, mint a nyomtathato1
           karakter ko1d tartoma1ny.                                        */
	if( ibm_charset && off_mode == 0 && s > 127 )
		if( (bb = sibmt[s-128]) != -1 ){
				buffer = input_table[bb].post;
				s = input_table[bb].chr;
				}
	if( off_mode == 0 && s != EOF && (s < 0 || s > 128 ) && warnings ){
                hfprintf(stderr,MSG_NONA,s);
                ReportLineNumber;
                }

	Return(s);
	}


/* Magyar numerikus e1kezetek a1talaki1ta1sa TeX forma1ra.                  */
int huon(){
int ch,pch,st;

        FunctionStart("huon");
	prepare_table(); /* Bea1lli1tjuk a ta1bla1zatot. */
	prep_chttable();
	st = 1;
	ch = GeTc;
	for ever{
		if( st == 1 )
		switch( ch ){
			case EOF :Return(0);
			case 'e' :
			case 'E' :
			case 'u' :
			case 'U' :
			case 'i' :
			case 'I' :
			case 'o' :
			case 'O' :
			case 'a' :
			case 'A' :
				pch=ch;
				st=2;
				break;

			default :
                                tex_code(ch);
				break;
			}
		else
		if( st == 2 )
		if( ch == vesszo3 ){
                        if( isupper(pch) ){
                          pch = tolower(pch);
                          pch |= 1024;
                          }
                        tex_code(pch|VESSZO3);
			st = 1;
			}
		else
		if( ch == umlaut ){
			switch( pch ){
				case 'U' :
				case 'O' :
                                        pch = tolower(pch);
                                        pch |= 1024;
				case 'u' :
				case 'o' :
                                        tex_code(pch|UMLAUT);
					st = 1;
					break;
				default :
                                        tex_code(pch);
					if( warnings ){
                                          hfprintf(stderr,MSG_BD_CH,
                                                        pch,
                                                        umlaut == UMLAUT ?
                                                        '2' :
                                                        umlaut);
                                          ReportLineNumber;
                                          }
					st = 1;
					continue;
				}
			}
		else
		if( ch == humlaut ){
			switch( pch ){
				case 'U' :
				case 'O' :
                                        pch = tolower(pch);
                                        pch |= 1024;
				case 'u' :
				case 'o' :
                                        tex_code(pch|HUMLAUT);
					st = 1;
					break;
				default :
                                        tex_code(pch);
					if( warnings ){
                                          hfprintf(stderr,MSG_BD_CH,
                                                        pch,
                                                        humlaut == HUMLAUT ?
                                                        '3' :
                                                        humlaut);
                                          ReportLineNumber;
                                          }
					st = 1;
					continue;
				}
			}
		else
		if( ch == EOF ){
                        tex_code(pch);
			Return(0);
			}
		else {
                        tex_code(pch);
			st = 1;
			continue;
			}
		ch = GeTc;
		}
	}/* Huon ve1ge. */

/* BETU3K KO1DOLA1SA
 * =================
 *
 * A betu3k 16 biten vannak ko1dolva. Az e1kezetes betu3k e1s az o2sszetett
 * betu3k e1ppenu1gy 16 bitet foglalnak el, mint a norma1l angol ABC betu3i.
 *
 * EGYSZERU3 BETU3K
 * ----------------
 * Minden egyszeru3, teha1t nem e1kezetes, e1s nem o2sszetett betu3 az ASCII
 * ko1dja1val van ko1dolva. Ez azt jelenti, hogy ha egy betu3 ko1dja kisebb
 * mint 256, akkor az egy egyszeru3 betu3.
 *
 * E1KEZETES BETU3K
 * ----------------
 * Egy e1kezetes betu3 ko1dja1nak also1 8 bitje megfelel az e1kezet ne1lku2li
 * betu3 ko1dja1nak. A felso3 8 bit e1rte1ke 256, 512 vagy 768 (=256|512)
 * atto1l fu2ggo3en, hogy az e1kezet vesszo3, ke1t pont vagy ke1t vesszo3.
 * Ezek az e1rte1kek a VESSZO3, UMLAUT, HUMLAUT makro1kban vannak definia1lva.
 *
 * Ha az e1kezetes betu3 nagy, akkor ehhez az e1rte1khez me1g plus 1024
 * ado1dik hozza1.
 *
 * O2SSZETETT BETU3K
 * -----------------
 * Egy o2sszetett betu3 ko1dja1nak also1 8 bitje megfelel az elso3 karakter
 * ASCII ko1dja1nak, egy kive1telto3l eltekintve. I1gy a cs betu3
 * ko1dja1nak also1 8 bitje 'c', az sz betu3e1 's'.
 *
 * Az egy kive1tel a ch, mert a 'c' ko1d ma1r foglalt a cs sza1ma1ra. A ch
 * betu3 ko1dja1nak also1 8 bitje 'h'.
 *
 * Meg kell emli1teni a dz e1s dzs betu3ket.
 * A dz ko1dja1nak also1 8 bitje 'd'. A dzs betu3 azonban mint egy dz e1s egy
 * s betu3 ta1rolo1dik, e1s az elva1laszta1sna1l van specia1lis mo1don
 * figyelembe ve1ve. (Azaz egy dz elo3tt el szabad va1lasztani, ha uta1na
 * maga1nhangzo1 jo2n, VAGY HA uta1na s betu3 jo2n e1s azuta1n jo2n egy
 * maga1nhangzo1.)
 *
 * A felso3 8 bit jelzi, hogy a betu3 o2sszetett, hosszu1 illetve, hogy
 * mely karakterek vannak nagybetu3vel i1rva. A felso3 8 bit e1rte1ke 256 ha
 * a betu3 o2sszetett e1s 768 ha hossszu1 o2sszetett. A az elso3, ma1sodik
 * vagy harmadik karakter nagybetu3s, akkor ehhez az e1rte1khez rendre
 * 1024, 2048, 4096 ado1dik hozza1.
 *
 *
 */

/* Globa1lis va1ltozo1 az o2sszetett szavak lehetse1ges
 * elva1laszta1si helyeinek megada1sa1ra mind a szo1ta1r e1pi1te1sekor,
 * mind pedig amikor elva1lsztju ezeket a szavakat.
 */
#define MAX_PREHYP     15 /* Egy szo1ban max 15 - jel lehet. */
int Hyphen[MAX_PREHYP];
int HypNr;
byte HUGE *Hyp;

/* FileCounter tartja nyilva1n,
 * hogy e1ppen hol tartunk a szo1ta1r fa1jban kii1ra1s ko2zben,
 * illetve, hogy a szo1ta1r milyen nagy, amikor haszna1ljuk.
 * EntryPoint az a pont, ahol a gyo2ke1r kezdo3dik a ta1bla1zatban.
 */
long FileCounter,EntryPoint;

/* Makro1 ne1ha1ny betu2 sza1ma1ra, amelyet haszna1lunk. */
#define a1  ('a'|VESSZO3)
#define e1  ('e'|VESSZO3)
#define i1  ('i'|VESSZO3)
#define o1  ('o'|VESSZO3)
#define o2  ('o'|UMLAUT)
#define o3  ('o'|HUMLAUT)
#define u1  ('u'|VESSZO3)
#define u2  ('u'|UMLAUT)
#define u3  ('u'|HUMLAUT)

#define cs  ('c'|256)
#define ccs ('c'|768)
#define Ch  ('h'|256)
#define dz  ('d'|256)
#define ddz ('d'|768)
#define gy  ('g'|256)
#define ggy ('g'|768)
#define ly  ('l'|256)
#define lly ('l'|768)
#define ny  ('n'|256)
#define nny ('n'|768)
#define sz  ('s'|256)
#define ssz ('s'|768)
#define ty  ('t'|256)
#define tty ('t'|768)
#define zs  ('z'|256)
#define zzs ('z'|768)

/* Argumentum maga1nhangzo1-e? */
#define maga1n(x) (chartype[(x)&255].flag&CHT_MAGA1NHANGZO1)
/* Elva1laszt egy TeX ligatu1ra1t, e1s megfelelo3en le1pteti j-t.
   Visszate1re1si e1rte1k TRUE ha sikeru2lt az elva1laszta1s, e1s
   FALSE ha nem.

   Le1ptetju2k j-t a feldolgozott karakterek sza1ma1nak megfelelo3en, e1s
   ha elva1lasztottunk, akkor bea1lli1tjuk k e1rte1ke1t is.
 */
int _ tex_ligature(word,j,k,st)int *word; int *j; int *k;int *st;{

        FunctionStart("tex_ligature");
	nr_tl++;
	if( word[*j] != 'f' || !word[*j+1] )Return(FALSE);

	if( word[*j+1] == 'l' && word[*j+2] && maga1n(word[*j+2]) ){
	  fprintf(fo,"\\discretionary{f-}{l}{fl}");
	  *k = 1;
	  (*j)++;/* Egy plusz inkrementa1la1s, mert egy
		  plusz betu3t dolgoztunk fel.        */
	  (*st) -= 2;
	  nr_tls++;
	  Return(TRUE);
	  }
	if( word[*j+1] == 'f' && word[*j+2] != 'i' && word[*j+2] != 'l' &&
	    maga1n(word[*j+2]) ){
	  fprintf(fo,"\\discretionary{f-}{f}{ff}");
	  *k = 1;
	  (*j)++;
	  (*st) -= 2;
	  nr_tls++;
	  Return(TRUE);
	  }
	if( word[*j+1] == 'f')
	  if( word[*j+2] == 'i' ){
	    fprintf(fo,"\\discretionary{f-}{fi}{ffi}");
	    *k = 2;
	    (*j) += 2;
	    (*st) -= 3;
	    nr_tls++;
	    Return(TRUE);
	    }
	  else
	  if( word[*j+2] == 'l' && word[*j+3] && maga1n(word[*j+3])){
	    fprintf(fo,"\\dicretionary{ff-}{l}{ffl}");
	    *k = 1;
	    (*j) += 2;
	    (*st) -= 3;
	    nr_tls++;
	    Return(TRUE);
	    }
	Return(FALSE);
        }

/* Egy o2sszetett hosszu1 karakter elva1laszta1sos kii1ra1sa
   tex forma1ban.
*/
void _ tex_discretion(wd)int wd;{
	char l[3],s;

        FunctionStart("tex_discretion");
	nr_td++;
	/* Keressu2k ki a dupla betu elso2 tagja1t. */
	if( !(s=chartype[wd&255].ma1sodik)){
                hfprintf(stderr,"%c %d\n",wd&255,wd);
		internal(0,IERR_BADISC,"BADISC");
		}
	l[1] = l[0] = (char)(wd&255);
	/* Le1pju2nk ra1 a ma1sodik tagra. */
	l[2] = s;
	if( wd&1024 )/* Elso3 betu2 nagy. */
		l[0] = toupper(l[0]);
	if( wd&2048 )/* Ma1sodik betu2 nagy. */
		l[1] = toupper(l[1]);
	if( wd&4096 )/* Harmadik betu2 nagy. */
		l[2] = toupper(l[2]);
	/* Rakjuk ki a betu2t. */
	fprintf(fo,"\\discretionary{%c%c-}{%c%c}{%c%c%c}",l[0],l[2],
						       l[1],l[2],
						       l[0],l[1],l[2]);
	RETURN;
}/* tex_discretion ve1ge */

/* Egy ko1dolt karakter TeX forma1tumu1 kii1ra1sa.
*/
void _ tex_code(wd)int wd;{
	char l[3];
	int k;
	/* A matex karakterek ta1bla1zata. */
	static char matexT[]={
        0341,0000,0000,  /* a1, dummy, dummy */
        0351,0000,0000,  /* e1, dummy, dummy */
        0372,0374,0266,  /* u1,    u2,    u3 */
	0355,0000,0000,  /* i1, dummy, dummy */
	0363,0366,0246   /* o1,    o2,    o3 */
	};
	static char ibmCWIT[]={
		/* Kis betu3k. */
         160, 000, 000,  /* a1, dummy, dummy */
         130, 000, 000,  /* e1, dummy, dummy */
	 163, 129, 150,  /* u1,    u2,    u3 */
         161, 000, 000,  /* i1, dummy, dummy */
	 162, 148, 147,  /* o1,    o2,    o3 */
		/* Nagy betu3k. */
         143, 000, 000,  /* A1, dummy, dummy */
         144, 000, 000,  /* E1, dummy, dummy */
	 151, 154, 152,  /* U1,    U2,    U3 */
         141, 000, 000,  /* I1, dummy, dummy */
	 149, 153, 167   /* O1,    O2,    O3 */
	};
	static char decSTD[]={
		/* Kis betu3k. */
         225, 000, 000,  /* a1, dummy, dummy */
         233, 000, 000,  /* e1, dummy, dummy */
	 250, 252, 251,  /* u1,    u2,    u3 */
         237, 000, 000,  /* i1, dummy, dummy */
	 243, 246, 245,  /* o1,    o2,    o3 */
		/* Nagy betu3k. */
         193, 000, 000,  /* A1, dummy, dummy */
         201, 000, 000,  /* E1, dummy, dummy */
	 218, 220, 219,  /* U1,    U2,    U3 */
         205, 000, 000,  /* I1, dummy, dummy */
	 211, 214, 213   /* O1,    O2,    O3 */
	};
        static char cp852STD[]={
		/* Kis betu3k. */
         160, 000, 000,  /* a1, dummy, dummy */
         130, 000, 000,  /* e1, dummy, dummy */
         163, 129, 251,  /* u1,    u2,    u3 */
         161, 000, 000,  /* i1, dummy, dummy */
         162, 148, 139,  /* o1,    o2,    o3 */
		/* Nagy betu3k. */
         181, 000, 000,  /* A1, dummy, dummy */
         144, 000, 000,  /* E1, dummy, dummy */
         233, 154, 235,  /* U1,    U2,    U3 */
         146, 000, 000,  /* I1, dummy, dummy */
         224, 153, 138   /* O1,    O2,    O3 */
	};
	FunctionStart("tex_code");
	nr_tc++;
/* A matex karakterkioszta1sban ko1d(Xy)=ko1d(xy)-28,
     ahol X=A,E,U,I,O; x=a,e,u,i,o; y=1,2,3
     (e1s persze csak az e1rtelmes kombina1cio1k le1teznek. */
#define MATEXCASEOFFSET 28
/* A CWI karakter kioszta1sban nincsen olyan rendszer, mint a
   MaTeX ta1bla1zatban, i1gy a CWITABLEOFFSET az index, e1s nem
   a karakter ko1d eltola1si e1rte1ke. */
#define CWICASEOFFSET   15
	if( wd < 256 ){/*Egyszeru3 karakter. */
		fprintf(fo,"%c",wd);
		}
	else if( 15 != (k = (chartype[wd&255].flag&CHT_MASK)) ){
		/* E1kezetes maga1nhangzo1. */
		if( matex == 1 ){/* Ha a matex karaktereit
				    haszna1ljuk. */
			k+=((wd/256)&3)-1;/* plusz eltola1s e1kezet szerint.*/
			/* Kii1rjuk a matex-nek megfelelo3 karaktert. */
			fprintf(fo,"%c",matexT[k]
			/* nagybetu2  ? */
			  - ( (wd&1024) ? MATEXCASEOFFSET : 0) );
			}
		else if( matex == 2){/* Ha a CWI karaktereket haszna1ljuk. */
			k+=((wd/256)&3)-1/* plusz eltola1s e1kezet szerint.*/
			  +( (wd&1024) ? CWICASEOFFSET : 0 );
			fprintf(fo,"%c",ibmCWIT[k]);
			}
                else if( matex == 5){/* Ha a 852 karaktereket haszna1ljuk. */
			k+=((wd/256)&3)-1/* plusz eltola1s e1kezet szerint.*/
			  +( (wd&1024) ? CWICASEOFFSET : 0 );
                        fprintf(fo,"%c",cp852STD[k]);
			}
		else if( matex == 3){/* Ha a DEC karaktereket haszna1ljuk. */
			k+=((wd/256)&3)-1/* plusz eltola1s e1kezet szerint.*/
			  +( (wd&1024) ? CWICASEOFFSET : 0 );
			fprintf(fo,"%c",decSTD[k]);
			}
                else if( matex == 4){/* az 123 repu2lo3
                                      * e1kezeteket haszna1ljuk */
                        k=((wd/256)&3);
                        fprintf(fo,"%c%c",
                                ((wd&1024)?/*nagybetu3?*/
                                toupper(wd&255) :
                                wd&255),
                                " 123"[k]);
			}
                     else {
			if( (wd&255) == 'i' && !(wd&1024) ){
				/* A TeX a kis i betu2t
					ku2lo2nlegesen kezeli. */
                          fprintf(fo,braces?"{\\'\\i}":"\\'\\i{}");
                          }
			else{
                          k=((wd/256)&3);
                          fprintf(fo,braces?"{\\%c%s%c}":"\\%c%s%c",
                          /* A vax C nem bi1rta a k["X\'\"H"]-t! */
                                   "X\'\"H"[k], (k==3 ? " " : "") ,
                                    ((wd&1024)?/*nagybetu3?*/
					toupper(wd&255) :
					wd&255));
                          }
			}
	} else if( chartype[wd&255].flag&CHT_DUPLA ){
		/* O2sszetett betu2. */
		/* Keressu2k ki a dupla betu elso2 tagja1t. */
		if( (l[1] = l[0] =chartype[wd&255].elso3) == 0 )
			internal(0,IERR_BADTXC,"BADTXC");
		k=1+((wd&512)!=0);
		/* Le1pju2nk ra1 a ma1sodik tagra. */
		l[2] = l[k] = chartype[wd&255].ma1sodik;
		if( wd&1024 )/* Elso3 betu2 nagy. */
			l[0] = toupper(l[0]);
		if( wd&2048 )/* Ma1sodik betu2 nagy. */
			l[1] = toupper(l[1]);
		if( wd&4096 )/* Harmadik betu2 nagy. */
			l[2] = toupper(l[2]);
		/* Rakjuk ki a betu2t. */
		if( wd&512 ){
			fprintf(fo,braces?"{%c%c%c}":"%c%c%c",l[0],l[1],l[2]);
			}
		else{
			fprintf(fo,braces?"{%c%c}":"%c%c",l[0],l[1]);
			}
		}
		else internal(0,IERR_BADTXK,"BADTXK");
	RETURN;
}/* tex_code ve1ge. */

/*
 * Leelleno2rzi, az s karakter sorozat prefixe-e Z nek.
 * Ha nem, akkor NULL a visszate1re1si e1rte1k, ha igen, akkor
 * z-ben a prefix re1sz uta1ni karakterre mutato1 pointer.
 *
 * Ezek int* e1rte1kek, mert lehetnek e1kezetes karakterek is.
 */
int * _ PrEfIx(s,z)int *s;int *z;{
	int S,Z;

        FunctionStart("PrEfIx");
	nr_pf++;
	while( (S=(*s)) && (Z=(*z)) ){
		/* Kisbetu2t csina1lunk belo3lu2k. */
		S &= ~(1024|2048|4096);/* To2ro2lju2k a nagybetu2 */
		Z &= ~(1024|2048|4096);/*     biteket. */
		if( S < 256 && isupper(S) )S=tolower(S);
		if( Z < 256 && isupper(Z) )Z=tolower(Z);
		/* Ha me1g i1gy sem egyenlo3ek, akkor sorry. */
		if( S != Z )Return(NULL);
		else s++,z++;
		}

	/* Ha z e1rt ve1get elo3bb, akkor. */
	if( !*z )Return(NULL);
	if(z)nr_pfs++;
	Return(z);
	}/* PrEfIx ve1ge. */


/* Az igeko2to3k ta1bla1zata.
!!!FONTOS!!!  Ha megva1ltoztatod a ta1bla1zatot, figyelj oda, hogy soha ne
keru2ljo2n egy szo egy ma1sik olyan szo1 ele1, amelyiknek o3 a prefixe.
Pe1lda1ul, nem lehet elo3bb a `fel' e1s csak uta1na `felu2l', mert akkor a
PrEfIx fu2ggve1ny mindi1g a `fel'-t fogja megtala1lni. !!!!!!!!!!!!!

A va1ltozo1 onnan kapta a neve1t, hogy az elso3 igeko2to3 a `meg' volt.

Az elso3 sza1m 1 ha a prefix biztosan igeko2to3 (pe1lda1ul nincsen olyan
szo1, amelyik u1gy kezdo3dik, hogy ``agyon'' majd pedig maga1nhangzo1val
folytato1dik, e1s az ``agyon'' me1gsem igeko2to3.
Ha az elso3 sza1m 0, akkor meg kell ke1rdezni az automata1t.
*/
static int megarr[17][10] = {
                        { 0 ,'m' , 'e' , 'g' , 0  ,  0  , 0 , 0 , 0 , 0 } ,
			{ 0 ,'f' , 'e' , 'l' , u2 , 'l' , 0 , 0 , 0 , 0 } ,
			{ 0 ,'f' , 'e' , 'l' , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        { 1 ,'a' , gy  , 'o' , 'n',  0  , 0 , 0 , 0 , 0 } ,
                        { 0 , a1 , 'l' , 't' , 'a', 'l' , 0 , 0 , 0 , 0 } ,
			{ 1 ,'k' , 'e' , 'r' , 'e', sz  ,'t', u2,'l', 0 } ,
			{ 0 ,'k' , o2  , 'r' , u2 , 'l' , 0 , 0 , 0 , 0 } ,
			{ 0 , sz , e1  , 'j' , 'j', 'e' ,'l', 0 , 0 , 0 } ,
			{ 0 ,'t' , 'o' , 'v' , a1 , 'b' ,'b', 0 , 0 , 0 } ,
			{ 1 ,'t' , u1  , 'l' , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        { 0 ,'e' , 'l' ,  0  , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        { 0 , a1 , 't' ,  0  , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        { 1 , sz , e1  , 't' , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        { 1 , 'v', e1  , 'g' , 'i', 'g' , 0 , 0 , 0 , 0 } ,
			/* Specia1lis kva1zi igeko2to3k, amelyek nem
			   ismerheto3k fel csak u1gy...
			   Pe1lda1ul a meg-gyu3lik szo1. */
			{ 0 ,'m' , 'e' , ggy , 0  ,  0  , 0 , 0 , 0 , 0 } ,
			/* Pe1lda1ul a leg-gyakrabb szo1. Nos ez
			                                  nem ege1szen
			                                  igeko2to3. */
			{ 1 ,'l' , 'e' , ggy , 0  ,  0  , 0 , 0 , 0 , 0 } ,
                        /* Ta1bla ve1ge jelzo3. */
                        { 0 , 0  ,  0  ,  0  , 0  ,  0  , 0 , 0 , 0 , 0 }
                           };
/* Fontos a sorrend, mert ezekkel a nevekkel tudjuk indexelni a megarr
   vektort! Eze1rt vannak a nem automata1zott igeko2to3kho2z is DUMMY
defini1cio1k.
*/
#define IK_MEG			 0
#define IK_FELU2L		 1
#define IK_FEL			 2
#define IK_AGYON_DUMMY		 3
#define IK_A1LTAL		 4
#define IK_KEREZTU2L_DUMMY	 5
#define IK_KO2RU2L		 6
#define IK_SZE1JJEL		 7
#define IK_TOVA1BB		 8
#define IK_TU1L_DUMMY		 9
#define IK_EL			10
#define IK_A1T			11
#define IK_SZE1T_DUMMY		12
#define IK_VE1GIG_DUMMY		13

/* Fontos, hogy sze1t legyenek va1lasztva az igazi igeko2to3k a
 * kva1zi igeko2to3kto3l. A makro:                                  */
#define IK_KVA1ZI_HATA1R        13
/* azt jelzi, hogy ha egy igeko2to3 sorsza1ma nagyobb mint ez, akkor
 * az ma1r kva1zi igeko2to3, e1s nem igazi.                         */
#define IK_MEGGY		14
#define IK_LEGGY_DUMMY          15
/* Ha egy szo1 eleje1n igeko2to3t tala1tunk, atto1l az me1g lehet, hogy nem
   igeko2to3ke1nt szerepel. Pl: megafon ami me-ga-fon e1s nem meg-afon.

   Ezt elleno3rizzu2k. Ez a fu2ggve1ny egy kis ve1ges automata.
   rest a megtala1lt igeko2to3 uta1ni karakterre mutat.
   type pedig az igeko2to3t azonosi1tja.

   A fu2ggve1ny visszate1re1si e1rte1ke 1 ha a karakter sor igeko2to3,
   e1s 0 ha nem igeko2to3.

   Tulajdonke1ppen ez nem is egy automata, hanem sok kis automata, ami
   persze matematikailag ugyan az. Egy kis automata a1llapota1t az st
   va1ltozo1 hata1rozza meg, ha viszont az ege1szet tekintem egy
   automata1nak, akkor st e1s type hata1rozza1k meg az a1llapotot.
   Maradjunk abban, hogy ez sok, kis automata.

   Az automata determinisztikus, a gra1fja  DAG, azaz nincs benne ciklus. A
   gra1fban lehetnek pa1rhuzamos a1gak, azaz nem biztos, hogy ira1nyi1tas
   ne1lku2l (ND)AG lesz. A fejlesztheto3seg e1s karbantarthato1sa1g
   kedvee1rt nem a1rt, ha pa1rhuzamos a1gak csak ve1ga1llapotokba futnak be.
   Ez azt jelenti, hogy a MEG automata 1-es a1llapota1bo1l az 'l' input a
   kettesbe viszi, mig a 'p' input a ha1rmasba, annak ellene1re, hogy ez a
   ke1t a1llapot a jelen pillanatban ekvivalens, hiszen mind a ketto3 'o'
   input esete1n elutasi1tja a szo1t, ku2lo2nben pedig elfogadja. A
   fejlo3de1s sora1n azonban elo3fordulhat, hogy valaki tala1l me1g egy szo1t,
   ami ugy kezdo3dik, hogy ``megapo'', de folytatni kell. Ha a ke1t
   a1llapotot o2ssze vonna1nk, akkor az azonos ve1gzo3de1su3 megalo... szo1t
   is elfogadna1 a rendszer, hiba1san.
   E1n ezt eddi1g betartottam (nem vol nehe1z, hiszen me1g csak a MEG
   automata van ke1sz :-). A makro1k u1gy lettek megi1rva, hogy nem nagyon
   lehet epszilon a1tmenetket rakni a gra1fba, de nem is nagyon kell.
   (Egyre1szt matematikailag bizonyi1thato, hogy nem kell, ma1sre1szt meg
   te1nyleg mi a fene1nek kellene ide? Ne1zd meg a huoff-ot! Ott azta1n van
   do2givel. )

   DAG    = ira1nyi1tott ko2rmentes gra1f
   (ND)AG = (nem ira1nyi1tott) ko2rmentes gra1f
*/
int _ igeko2to3(rest,type)int *rest;int type;{
int st,ch;
FunctionStart("igeko2to3");
nr_ik++;
/* Makro1k a ve1ges automata1k lei1ra1sa1ra. */
#define automata(x) case x : \
                    for ( st = 0 ;;){ \
                      ch=((*rest++) & ~(1024|2048|4096));\
		      if( ch < 256 && isupper(ch) )ch = tolower(ch); \
                      switch(st){
#define end_automata }}
#define state(x,y) case x: switch(ch){
#define end_state } break;
#define input(x) case x:
#define shift_to(x) st=x;break
#define ReTurn(x) nr_iks += x;Return(x)
#define terminate(x) default: \
                     for( ; *rest ; rest++ )\
			if( isalpha((*rest)&255) )\
                           ReTurn(!(x));\
                     ReTurn(x);
#define IGEKO2TO3 ReTurn(1)
#define NEM_IGEKO2TO3 ReTurn(0)
/*
   Az automata1k rajzairo1l:
   ---> egy a1tmenetet jelent. Ha a nyi1l uta1n egy * van, akkor nem igazi
        a1tmenetro2l van szo1, return 0, azaz a nem igeko2to3 a prefix.
   A ---> fo2le rakott karakter, vagy karakterek az a1tmenetet okozo1
        karaktereket jelentik. Ha ez a karakter 0, akkor az azt jelenti,
        hogy a szo1nak ve1ge kell, hogy legyen. Ez nem felte1tlenu2l jelenti
        hogy fizikailag is ve1ge van a `rest' arraynek, vagyis, hogy a
        ko2vetkezo3 karakter (int)0. A szo1 fizikai ve1ge elo3tt me1g
        lehetnek egye1k nem betu2 karakterek. Eze1rt van az, hogy ez az
        a1tmenet nem egy input(0)-val van megoldva, hanem a terminate()
        makro1ba rejtve. Ez a makro1 ve1gig a marade1k karaktereken, e1s ha
        tala1l betu2t akkor return !x-et hajt ve1gre, ha nincs betu2 a szo1
        marade1k re1sze1ben, akkor return x-et hajt ve1gre. terminate(x)
        teha1t i1gy olvasando1:
        Ha ve1ge van a szo1nak, akkor x ha nincs ve1ge akkor !x.
   Ha egy a1llapotbo1l nem lehet ko2vetkezo3be a1tmenni (mert nincs az input
        karakternek megfelelo3 a1tmenet) akkor a fu2ggve1ny visszate1r. A
        visszate1re1si e1rte1k 1 minden olyan a1llapotna1l, amelyik nics
        *-gal megjelo2lve. Ha az a1llapot *-gal van megjelo2lve, akkor a
        visszate1re1si e1rte1k 0.
   Az automata1k rajza elo3tt tala1lhato1 azon szavak lista1ja, amelyek
        alapja1n az automata fele1pu2lt. A | jel va1gja le azt a re1szt
        amelyik az automata1ban ma1r nincs benne. Ez a re1sz az automata
        rajza1n is olvashato1 a leza1ro1 pszeudo a1llapotot jelento3 * uta1n
        ... jelekkel bevezetve. A szavak uta1n za1ro1jelben elo3fordul
        egy-egy olyan szo1, amelyben a prefix igeko2to3ke1nt szerepel,
        e1s amely megegyezik a szo1 | elo3tti re1sze1vel. Ez mintegy
        indokla1s arra, hogy a szo1t mie1rt kell olyan hosszan ve1gigne1zni.
   Ha az automata fele1pi1te1se u1gy volt egyszeru2bb, akkor nem azokat a
        szavakat proba1lja ve1gig keresni, amelyekne1l a prefix nem
        igeko2to3, hanem egy olyant, amelyikne1l az.
        P.l.: prefix EL
              prefix uta1ni elso3 karakter o3

              Ezek uta1n nagyonsok szo1 van, amelyikne1l az EL nem
              igeko2to3, de csak ne1ha1ny olyan van, amelyekne1l az.
              Pe1lda1ul `elo3gyeleg'. Ebben az esetben e1rdemesebb ezeket
              felismertetni a ve1ges automata1val, e1s minden ma1s
              elfogadni, mint olyan alakot ahol a prefix nem igeko2to3.
        A szavak felsorola1sa1ban az ilyen szavakat egy * elo3zi meg.

   A state makro1ban a ma1sodik argument tartalmazza az eddig feldolgozott
   karaktereket, a prefix-et is. Ez tiszta1n dokumenta1cio1s jellegu3, a
   makro1 ezt a stringet elfelejti, e1s a C preprocesszor uta1n a fordi1to1
   ma1r nem la1t belo3le semmit.
*/
switch(type){
	default: internal(type,IERR_BAD_IK,"BAD_IK");
automata(IK_MEG)
/*
 megaf | on
 megalo | ma1nia    (megal | szik)
        | ma1nia1s
        | ...
 megapo | lis       (megap | ad)
                a      f
    MEG ---> 0 ---> 1 ---> * ... fon
                     \ l      o
                      +--> 2 ---> * ... ma1nia
*/

	state(0,"meg")
		input('a') shift_to(1);
                default:   IGEKO2TO3;
	end_state
	state(1,"mega")
                input('f') NEM_IGEKO2TO3;
		input('l') shift_to(2);
		input('p') shift_to(3);
                input('b') shift_to(4);
                input('c') shift_to(5);
                default:   IGEKO2TO3;
	end_state
	state(2,"megal")
                input('o') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(3,"megap")
                input('o') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
        state(4,"megab")
                input('y') NEM_IGEKO2TO3;
                input(a1 ) shift_to(6);
                default:   IGEKO2TO3;
        end_state
        state(5,"megac")
                input('e') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
        end_state
        state(6,"megaba1")
                input('j') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
        end_state
end_automata

automata(IK_FELU2L)
/*
   felu2l
   felu2li
           i
   FELU2L ---> *
*/
	state(0,"felu2l")
                input('i') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
end_automata

automata(IK_FEL)
/*
  fele.
  fele1.
  fele gy enesedik
  felad |at
  felo3l
  fel-eszik
  fel-eszml
  fel-etet
  fel-evez
  fel-bred
  fel-breszt
  fel-g
  fel-get
  fel-kesĄt
  fel-l
  fel-led
  fel-leds
  fel-leszt
  fel-leszts
  fel-lnkĄt
  fel-lnkl
  fel-lnkls
  fel-ls
  fel-melyedik
  fel-nekel
  fel-pĄt
  fel-pĄts
  fel-pĄtmny
  fel-pl
  fel-pls
  fel-r
  fel-rez
  fel-rkezik
  fel-rtkel
  fel-fricsk z
  fel-frissĄt
  fel-frissl
  fel-frccsen
  fel-rldik
  fel-rl
  fel-plankol
  fel-prd l
  fel-pr˘b l
  felsg- rul s
  fel-spurizik
  fel-sr˘fol
  fel-trancsĄroz
  fe-ll
  fel-let
  fel-letes
  fel-letessg
  fe-lleti
  fe-lletsĄk
  fe-llet
  fel-ltet
*/
	state(0,"fel")
		input('e') shift_to(1);
                input(e1)  shift_to(9);
		input('i') shift_to(6);
		input('a') shift_to(7);
                input(o3)  NEM_IGEKO2TO3;
                input(u2)  shift_to(12);
                default:   IGEKO2TO3;
	end_state
	state(1,"fele")
                input(gy)  IGEKO2TO3;
		input('l') shift_to(2);
		input('m') shift_to(4);
		input('s') shift_to(5);
                input('r') IGEKO2TO3;
                input('n') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(2,"felel")
		input('e') shift_to(3);
                default:   NEM_IGEKO2TO3;
	end_state
	state(3,"felele")
                input('v') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(4,"felem")
                input(a1)  NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(5,"feles")
                input(0)   NEM_IGEKO2TO3;
                input(e1)  NEM_IGEKO2TO3;
                input('e') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(6,"feli")
                input('b') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(7,"fela")
		input('d') shift_to(8);
                default:   IGEKO2TO3;
	end_state
	state(8,"felad")
                input(0)   IGEKO2TO3;
                input('a') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
        state(9,"fele1")
                input('b') shift_to(10);
                input('g') IGEKO2TO3;
                input('k') shift_to(11);
                input('l') IGEKO2TO3;
                input('m') shift_to(12);
                input('n') shift_to(12);
                input('p') IGEKO2TO3;
                default: NEM_IGEKO2TO3;
                input('r') IGEKO2TO3;
        end_state
        state(10,"fele1b")
                input('r') IGEKO2TO3;
                default: NEM_IGEKO2TO3;
        end_state
        state(11,"fele1k")/* fele1m fele1n */
                input('e') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
        end_state
        state(12,"felu2")
                input('l') shift_to(13);
                default: IGEKO2TO3;
        end_state
        state(13,"felu2l")
                input('e') NEM_IGEKO2TO3;
                default: IGEKO2TO3;
        end_state
end_automata

automata(IK_A1LTAL)
/*
  a1ltale | sik
  a1ltalu1 | t
  a1ltalu2 | t
*/
	state(0,"a1ltal")
                input('e') IGEKO2TO3;
                input(u1)  IGEKO2TO3;
                input(u2)  IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
end_automata

automata(IK_KO2RU2L)
/*
  ko2ru2le
  ko2ru2li
  ko2ru2lo2tte
*/
	state(0,"ko2ru2l")
		input('e') shift_to(1);
		input('i') shift_to(2);
                input( o2) shift_to(3);
                default:   IGEKO2TO3;
	end_state
	state(1,"ko2ru2le")
                input(0)   NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(2,"ko2ru2li")
                input(0)   NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
        state(3,"ko2ru2lo2")
                input('t') shift_to(4);
                default:   IGEKO2TO3;
        end_state
        state(4,"ko2ru2lo2t")
                input('t') shift_to(5);
                default:   IGEKO2TO3;
        end_state
        state(5,"ko2ru2lo2tt")
                input('e') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
        end_state

end_automata

automata(IK_SZE1JJEL)
/*
  sze1jjele | bb
  sze1jjelu | grik

                  e
  SZE1JJEL --> 0 ---> * ...lebb
*/
	state(0,"sze1jjel")
                input('e') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
end_automata

automata(IK_A1T)
/*
  a1tala1 | ny
   a1tala | kul
  a1tall
   a1talszik
  a1tok
  a1tabota1ban
  a1tpla1nta1l
*/
	state(0,"a1t")
		input('a') shift_to(1);
                input('o') Return(0);
                default:   IGEKO2TO3;
	end_state
	state(1,"a1ta")
		input('l') shift_to(2);
                input('b') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
        state(2,"a1tal")
                input(a1)  NEM_IGEKO2TO3;
                input('l') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
end_automata

automata(IK_TOVA1BB)
/*
  tova1bba1
  tova1bba1l | l
  tova1bba | d
  tova1bbe1 | l
  tova1bbi1 | t
  tova1bbi | ndul
  tova1bbu | tazik
                 a1     0
  TOVA1BB --> 0 ---> 1 ---> *
              |\ a,e1,u
              | +-------> +
               \ i1
                +--> *

*/
	state(0,"tova1bb")
		input(a1)  shift_to(1);
                input(i1)  NEM_IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(1,"tova1bba1")
                input('l') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
end_automata
/* CUT */
automata(IK_MEGGY)
/* Kva1zi igeko2to3, amely majdnem mindi1g 1-et ad eredme1nyu2l.
   A kive1telek:
   meggy
   meggya1g
   meggye... meggyepa1l
   meggyengi1t
 */
	state(0,"meggy")
		input('e') shift_to(1);
                input(a1)  shift_to(2);
                input('i') shift_to(4);
                input(0)   NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(1,"meggye")
                input('n') shift_to(3);
                input('p') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state;
        state(2,"meggya1")
                input('g') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
        end_state;
        state(3,"meggyen")
                input('g') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
        end_state;
        state(4,"meggyi")
                input('l') shift_to(5);
                default:   NEM_IGEKO2TO3;
        end_state
        state(5,"meggyil")
                input('k') shift_to(6);
                default:   NEM_IGEKO2TO3;
        end_state
        state(6,"meggyilk")
                input('o') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
        end_state
end_automata

automata(IK_EL)
/*
  elab | ora1tum     ha1t, ha ez magyar szo1? De Kornai Andris szo1ta1ra1ban
                     benne volt.
  eladd | ig
  elanny | ira
  ele1.
  ele1g.             ??? ??? ??? ??? Ezt e1rtelemto3l fu2ggo3en kell
                     va1lasztani. Maradjunk abba. hogy igeko2to3.
   ele1get
  ele1b | b
        | e
  ele1ged | etlen...
          | ett...
  ele1gg | e1
  ele1gi | a
         | kuss!!
  ele1gs | e1g
  ele1gt | elen
  ele1gu2 | lt
  ele1j | e
  eled | dig
       | el
  eleg | a1ns
       | ancia
       | endo3
  elegy*en | get
  elei
  eleje
  eleji
  elek | tor
       | trifika1l
       | tro1d
       | ktro1da
       | ktrodinamika
       | ktrokardiogra1f
       | ktrokardiogram
       | ktroke1mia
       | ktroli1zis
       | ktroma1gnes
       | ktrome1rno2k
       | ktromos
       | ktromossa1g
       | ktromotor
       | ktron
       | ktroncso3
       | ktronikus
       | ktrotechnika
       | ktrotechnikai
       | ktrotechnikus
  elem.
  elemen | ta1ris
   eleme1szt
  elemez
  elemi
  elemo1 | zsia
  elemz | e1s
  elese1g
   elese1s
  elev | a1tor
       | ve
       | ven
       | vense1g
       | venszu2lo3
  eli1z | iumi
   eli1te1l
  elimi | na1l
   elima1dkozik
  elit
  elix  | i1r
  elu2ls | o3
  elu2lto2 | lto3
*/
	state(0,"el")
		input('a') shift_to(2);
		input(e1)  shift_to(4);
		input('e') shift_to(7);
		input(i1)  shift_to(15);
		input('i') shift_to(16);
		input(u2)  shift_to(18);
		input(o3)  shift_to(21);
                default:   IGEKO2TO3;
	end_state
	state(2,"ela")
                input('b') NEM_IGEKO2TO3;
		input('d') shift_to(3);
                input(nny) NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(3,"elad")
                input('d') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(4,"ele1")
                input(0)   NEM_IGEKO2TO3;
		input('g') shift_to(5);
                input('b') NEM_IGEKO2TO3;
                input('j') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(5,"ele1g")
                input(0)   NEM_IGEKO2TO3;
		input('e') shift_to(6);
                input('g') NEM_IGEKO2TO3;
                input('i') NEM_IGEKO2TO3;
                input('s') NEM_IGEKO2TO3;
                input('t') NEM_IGEKO2TO3;
                input(u2)  NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(6,"ele1ge")
                input('d') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(7,"ele")
                input('d') NEM_IGEKO2TO3;
                input('g') NEM_IGEKO2TO3;
		input(gy)  shift_to(8);
                input('i') NEM_IGEKO2TO3;
		input('j') shift_to(10);
                input('k') NEM_IGEKO2TO3;
		input('m') shift_to(11);
		input('s') shift_to(13);
                input('v') NEM_IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(8,"elegy")
		input('e') shift_to(9);
                default:   NEM_IGEKO2TO3;
	end_state
	state(9,"elegye")
                input('n') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(10,"elej")
                input('i') NEM_IGEKO2TO3;
                input('e') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(11,"elem")
                input(0)   NEM_IGEKO2TO3;
		input('e') shift_to(12);
                input('i') NEM_IGEKO2TO3;
                input(o1)  NEM_IGEKO2TO3;
                input('z') NEM_IGEKO2TO3;
	end_state
	state(12,"eleme")
                input('n') NEM_IGEKO2TO3;
                input('z') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(13,"eles")
		input(e1)  shift_to(14);
                default:   IGEKO2TO3;
	end_state
	state(14,"elese1")
                input('g') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(15,"eli1")
                input('z') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(16,"eli")
		input('m') shift_to(17);
                input('t') NEM_IGEKO2TO3;
                input('x') NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(17,"elim")
                input('i') NEM_IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
	state(18,"elu2")
		input('l') shift_to(19);
                default:   IGEKO2TO3;
	end_state
	state(19,"elu2l")
                input('s') NEM_IGEKO2TO3;
		input('t') shift_to(20);
                default:   IGEKO2TO3;
	end_state
	state(20,"elu2lt")
                input(o2)  NEM_IGEKO2TO3;
                default:   IGEKO2TO3;
	end_state
	state(21,"elo3")
		input('r') shift_to(22);
                default:   NEM_IGEKO2TO3;
	end_state
	state(22,"elo3r")
                input('k') IGEKO2TO3;
                default:   NEM_IGEKO2TO3;
	end_state
end_automata
#undef ReTurn
#undef automata
#undef end_automata
#undef state
#undef end_state
#undef input
#undef shift_to
#undef IGEKO2TO3
#undef NEM_IGEKO2TO3
}
}/* igeko2to3 ve1ge. */
#define SRLP 43 /* Maximum 10 elva1lszta1s lehet a sege1d szo1ta1rban,
                 * ha mindegyik ss-z alaku1, akkor mindegyiknek kell
                 * ne1gy ba1jt. Ezen ki1vu2l me1g lehet egy igeko2to3 (2
                 * karakter) e1s egy sa1g-se1g toldale1k, ami megint egy
                 * karakter. Szumma 43 karakter plusz, ha mindez egy
                 * sor eleje1n allo1 szo1ban fordul elo3.
                 */

/* Bejelo2li az elva1laszta1sokat a `word' szo1ban, amiknek a
 * darabsza1ma HypNr globa1lis va1ltozo1ban adott, a pozi1cio1k pedig
 * a Hyp array-ben vannak.
 */
int  _ SplitCWord(word)int *word;{
  int i,head,h,c;
  int *p,*q;

#define STEP_h if(h<HypNr)h++;else break
#define NEXT_HYP(x) do{if(i==(Hyp[h]&0x3F)){head+=(x);STEP_h;}}while(0)
#define INSERT_HYP (*p++ = '\\',*p++ = '-')

  /* Elo3szo2 kisza1mi1tjuk, hogy ha1ny karakterrel kell lejjebb
   * hu1zni a szo1t.
   */
  head =   /* Aha1ny karakterrel elo3re1bb kell hu1zni a szo1t.            */
  h    =   /* Hyp to2mb index                                              */
  i    = 0;/* A ma1r lesza1molt karakterek (sz=ke1t karakter, ssz=ha1rom.  */
  for( p=word ; c=(*p) ; p++ ){
    if( c < 0x100 || maga1n(c) ){/* Ha sima karakter vagy maga1nhangzo1.   */
      i++;
      NEXT_HYP(2);
      continue;
      }
    if( ((c/0x100)&3) == 1 ){/* Ro2vid o2sszetett betu3, mint sz.          */
      i++; /* Megsza1mla1ljuk az elso3 betu3t.                             */
      NEXT_HYP(3);
      i++; /* Megsza1mla1ljuk a ma1sodik betu3t.                           */
      NEXT_HYP(2);
      continue;
      }
    if( ((c/0x100)&3) == 3 ){/* Hosszu1 o2sszetettbetu3, mint ssz.         */
      i++;
      NEXT_HYP(3);
      i++;
      NEXT_HYP(4); /* ssz -> ss\-z +2 betu3 +2 jel */
      i++;
      NEXT_HYP(2);
      continue;
      }
    hfprintf(stderr,"Hiba1s karakter %d.\n",c);
    internal(0,0,"BADEK");
    }
  /* Megsza1moltuk, hogy ha1ny karakterrel kell el3bbre hu1zni a szo1t. */
  if( head > SRLP )internal(0,0,"SMSRLP");
  h = i = 0;
  for( p=word-head ; c=(*word) ; ){
    if( c < 0x100 || maga1n(c) ){/* Ha sima karakter vagy maga1nhangzo1.   */
      *p++ = *word++; i++;
      if( i == (Hyp[h]&0x3F) ){
        INSERT_HYP;
        STEP_h;
        }
      continue;
      }
    if( ((c/0x100)&3) == 1 ){/* Ro2vid o2sszetett betu3, mint sz.          */
      *(q=p++) = *word++; i++;
      if( i == (Hyp[h]&0x3F) ){
        INSERT_HYP;
        *p = *q;    /* Most az sz-bo3l `sz\-sz' -lett. */
        *q &= 0xff; /*                  `s\-sz'        */
        if( (*p)&1024 )*q=toupper(*q); /* `S\-sz'        */
        if( !(c=chartype[(*p)&0xff].ma1sodik) ){
          hfprintf(stderr,"%c %d\n",c&255,c);
          internal(0,IERR_BADISC,"BADISK");
          }
        if( (*p)&2048 )c = toupper(c);
        *p++ = c;/*                       'S\-Z'         */
        STEP_h;
        }
      i++; /* Megsza1mla1ljuk a ma1sodik betu3t.                           */
      if( i == (Hyp[h]&0x3F) ){
        INSERT_HYP;
        STEP_h;
        }
      continue;
      }
    if( ((c/0x100)&3) == 3 ){/* Hosszu1 o2sszetettbetu3, mint ssz.         */
      *(q=p++) =(*word++); i++;
      if( i == (Hyp[h]&0x3F) ){/* Az elso3 karakter uta1n kell elva1lasztani
                                * s-sz alakban. */
        INSERT_HYP;
        *p = *q;                       /* ssz\-ssz */
        *q &= 0xff;                    /* s\-ssz   */
        if( (*p)&1024 )*q=toupper(*q); /* S\-ssz   */
        c = *p;
        *p &= ~(512|1024|2048|4096);   /* S\-sz    */
        *p++ |= (c&(2048|4096))/2;     /* S\-SZ    */
        STEP_h;
        }
      i++;
      if( i == (Hyp[h]&0x3F) ){/* A ma1sodik karakter uta1n kell elva1lasztani
                         * ss-z alakban. */
        *p++ = *q;
        INSERT_HYP;
        *p = *q;
        *q &= 0xff;
        if( (*p)&1024 )*q = toupper(*q);
        q++;
        *q &= 0xff;
        if( (*p)&2048 )*q = toupper(*q);
        if( !(c=chartype[(*p)&0xff].ma1sodik) ){
          hfprintf(stderr,"%c %d\n",c&255,c);
          internal(0,IERR_BADISC,"BADISK");
          }
        if( (*p)&4096 )c = toupper(c);
        *p++ = c;/*                       'S\-Z'         */
        STEP_h;
        }
      i++; /* Megsza1mla1ljuk a harmadik betu3t.                            */
      if( i == (Hyp[h]&0x3F) ){
        INSERT_HYP;
        STEP_h;
        }
      continue;
      }
    hfprintf(stderr,"Hiba1s karakter %d.\n",c);
    internal(0,0,"BADEK");
    }
  return head;
  }

/* Eldo3nti, hogy ss valamilyen LaTeX szekvencia-e ami megve1di az uta1na
   a1llo1 szo1t is az elva1laszta1sto1l. Ennek megfelelo3en a visszate1re1si
   e1rte1k 1, ha LaTeX szekvencia1t tala1ltunk, e1s 0 ha nem.

   *fulline akkor va1ltozik, ha a szekvencia specia1lis, e1s nem csak
   a ko2vetkezo3 szo1t, hanem az ege1sz sort ve1di. Ekkor az e1rte1ke
   2, vagy 3 lesz, ami a sor ve1ge1ig mindi1g az st va1ltozo1ba keru2l,
   e1s felu2lb1ra1lja a kora1bbi do2nte1seket arro1l, hogy az e1ppen adott
   szo1t hogyan kell konverta1lni.
*/
int _ slatex(ss,length,fulline)
char *ss;     /* A szekvencia a \ ne1lku2l. */
int length;   /* a szo1 hossza. */
int *fulline;
{
/* Olyan tex e1s latex szekvencia1k amiknek egy argumentumuk van, amelyeket
   be1ke1n kell hagyni. Az nem zavar, ha ko2zben egykarakteres szavak
   vannak, mint pe1lda1ul a { meg a } jelek.

3 betu3sek
012345678901234567890
end
ref

4 betu3sek
012345678901234567890
Alph
alph
cite

5 betu3sek
012345678901234567890
Roman
begin
input
index
label
roman
value

6 betu3sek
012345678901234567890
arabic
typein

7 betu3sek
012345678901234567890
bibitem
include
pageref
typeout

8 betu3sek
012345678901234567890
glossary

9 betu3sek
012345678901234567890
pagestyle

10 betu3sek
012345678901234567890
addcounter
newcounter
newtheorem
indexenrty
setcounter
usecounter

11 betu3sek
012345678901234567890
includeonly

12 betu3sek
012345678901234567890
bibliography

13 betu3sek
012345678901234567890
documentstyle    ve1di a sort, eze1rt fulline=2
glossaryentry
pagenumbering
thispagestyle

14 betu3sek
012345678901234567890
newenviroment

15 betu3sek
012345678901234567890
addcontentsline  ve1di a sort, eze1rt *fulline=3

17 betu3sek
012345678901234567890
bibliographystyle

Ez a fu2ggve1ny u1gy lett megi1rva, hogy minne1l gyorsabban fusson.
Van benne egy goto is, az olvashato1sa1got u1gysem rontja, mert
azon ma1r nincs mit. Isten e1s az o2sszes szentek o1vjanak atto1l,
hogy egyszer ebbe bele kelljen nyu1lni!

*/
  FunctionStart("slatex");
  switch( length ){
    default: /* Ha a hossza olyan, hogy nincs pont olyan hosszu1sa1gu1
                LaTeX veze1rlo3 szekvencia, akkor nem is lehet az. */
            Return(0);
    case 3:
            Return ((ss[0] == 'e' && ss[1] == 'n' && ss[2] == 'd') ||
                    (ss[0] == 'r' && ss[1] == 'e' && ss[2] == 'f'));

    case 4:
            Return (((ss[0] == 'a' || ss[0] == 'A') &&
                     ss[1] == 'l' && ss[2] =='p' && ss[3] == 'h')||
                    (ss[0] == 'c' && ss[1] == 'i' &&
                     ss[2] == 't' && ss[3] == 'e'));

    case 5:
            Return (((ss[0] == 'r' || ss[0] == 'R') &&
                      ss[1] == 'o' && ss[2] == 'm'  &&
                      ss[3] == 'a' && ss[4] == 'n'      )               ||
                     (ss[0] == 'v' && ss[1] == 'a'  &&
                      ss[2] == 'l' && ss[3] == 'u'  && ss[4] == 'e')    ||
                     ( ss[0] == 'b' && ss[1] == 'e' &&
                       ss[2] == 'g' && ss[3] == 'i' && ss[4] == 'n')    ||
                     ( ss[0] == 'i' && ss[1] == 'n' &&
                       (ss[2] == 'p' && ss[3] == 'u' && ss[4] == 't' )
                        ||
                       (ss[2] == 'd' && ss[3] == 'e' && ss[4] == 'x' )) ||
                     ( ss[0] == 'l' && ss[1] == 'a' && ss[2] == 'b' &&
                       ss[3] == 'e' && ss[4] == 'l' )
                   );
    case 6:
            Return (ss[4] == 'i' &&
                    ((ss[0] == 'a' && ss[1] == 'r' && ss[2] == 'a' &&
                      ss[3] == 'b' && ss[5] == 'c' ) ||
                     (ss[0] == 't' && ss[1] == 'y' && ss[2] == 'p' &&
                      ss[3] == 'e' && ss[5] == 'n' )));
    case 7:
            Return ( (ss[5] == 'e' && /* lehet bibitem vagy pageref */
                     ((ss[0] == 'b' && ss[1] == 'i' &&
                       ss[2] == 'b' && ss[3] == 'i' &&
                       ss[4] == 't' && ss[6] == 'm') ||
                      (ss[0] == 'p' && ss[1] == 'a' &&
                       ss[2] == 'g' && ss[3] == 'e' &&
                       ss[4] == 'r' && ss[6] == 'f'))) ||
                     (ss[0] == 'i' && ss[1] == 'n' && ss[2] == 'c' &&
                      ss[3] == 'l' && ss[4] == 'u' && ss[5] == 'd' &&
                      ss[6] == 'e')                    ||
                     (ss[0] == 't' && ss[1] == 'y' && ss[2] == 'p' &&
                      ss[3] == 'e' && ss[4] == 'o' && ss[5] == 'u' &&
                      ss[6] == 't'));
    case 8:
            Return (ss[0] == 'g' && ss[1] == 'l' &&
                    ss[2] == 'o' && ss[3] == 's' &&
                    ss[4] == 's' && ss[5] == 'a' &&
                    ss[6] == 'r' && ss[7] == 'y');
    case 9:
            Return (ss[0] == 'p' && ss[1] == 'a' && ss[2] == 'g' &&
                    ss[3] == 'e' && ss[4] == 's' && ss[5] == 't' &&
                    ss[6] == 'y' && ss[7] == 'l' && ss[8] == 'e' );
    case 10:
            if( (ss[0] == 'a' && ss[1] == 'd' && ss[2] == 'd' ) ||
                (ss[0] == 's' && ss[1] == 'e' && ss[2] == 't' ) ||
                (ss[0] == 'u' && ss[1] == 's' && ss[2] == 'e' ) )
              goto CounterLabel;/* Bocsa1nat. */
            if( ss[0] == 'n' && ss[1] == 'e' && ss[2] == 'w' ){
              if( ss[3] == 't' )
                Return (ss[4] == 'h' && ss[5] == 'e' && ss[6] == 'o' &&
                        ss[7] == 'r' && ss[8] == 'e' && ss[9] == 'm');
              else{
                CounterLabel:/* Bocsa1nat.*/
                Return (ss[3] == 'c' &&
                        ss[4] == 'o' && ss[5] == 'u' && ss[6] == 'n' &&
                        ss[7] == 't' && ss[8] == 'e' && ss[9] == 'r');
                }
            }
            Return ( ss[0] == 'i' && ss[1] == 'n' && ss[2] == 'd' &&
                     ss[3] == 'e' && ss[4] == 'x' && ss[5] == 'e' &&
                     ss[6] == 'n' && ss[7] == 't' && ss[8] == 'r' &&
                     ss[9] == 'y');
    case 11:
            Return (ss[0] == 'i' && ss[1] == 'n' && ss[2] == 'c' &&
                    ss[3] == 'l' && ss[4] == 'u' && ss[5] == 'd' &&
                    ss[6] == 'e' && ss[7] == 'o' && ss[8] == 'n' &&
                    ss[9] == 'l' && ss[10] == 'y');
    case 12:
            Return (ss[0] == 'b' && ss[1] == 'i' && ss[2] == 'b' &&
                    ss[3] == 'l' && ss[4] == 'i' && ss[5] == 'o' &&
                    ss[6] == 'g' && ss[7] == 'r' && ss[8] == 'a' &&
                    ss[9] == 'p' && ss[10] == 'h' && ss[11] == 'y');
    case 13:
            if( ss[8] == 's' && ss[9] == 't' && ss[10] == 'y' &&
                ss[11] == 'l' && ss[12] == 'e' )
              Return ((ss[0] == 'd' && ss[1] == 'o' && ss[2] == 'c' &&
                       ss[3] == 'u' && ss[4] == 'm' && ss[5] == 'e' &&
                       ss[6] == 'n' && ss[7] == 't' && (*fulline=2)) ||
                      (ss[0] == 't' && ss[1] == 'h' && ss[2] == 'i' &&
                       ss[3] == 's' && ss[4] == 'p' && ss[5] == 'a' &&
                       ss[6] == 'g' && ss[7] == 'e'));
            Return (ss[8] == 'e' &&
                    (ss[0] == 'g' && ss[1] == 'l' && ss[2] == 'o' &&
                     ss[3] == 's' && ss[4] == 's' && ss[5] == 'a' &&
                     ss[6] == 'r' && ss[7] == 'y' && ss[9] == 'n' &&
                     ss[10] == 't' && ss[11] == 'r' && ss[12] == 'y') ||
                    (ss[0] == 'p' && ss[1] == 'a' && ss[2] == 'g' &&
                     ss[3] == 'e' && ss[4] == 'n' && ss[5] == 'u' &&
                     ss[6] == 'm' && ss[7] == 'b' && ss[9] == 'r' &&
                     ss[10] == 'i' && ss[11] == 'n' && ss[12] == 'g'));
    case 14:
            Return (ss[0] == 'n' && ss[1] == 'e' && ss[2] == 'w' &&
                    ss[3] == 'e' && ss[4] == 'n' && ss[5] == 'v' &&
                    ss[6] == 'i' && ss[7] == 'r' && ss[8] == 'o' &&
                    ss[9] == 'n' && ss[10] == 'm' && ss[11] == 'e' &&
                    ss[12] == 'n' && ss[13] == 't');
    case 15:
            Return (ss[0] == 'a' && ss[1] == 'd' && ss[2] == 'd' &&
                    ss[3] == 'c' && ss[4] == 'o' && ss[5] == 'n' &&
                    ss[6] == 't' && ss[7] == 'e' && ss[8] == 'n' &&
                    ss[9] == 't' && ss[10] == 's' && ss[11] == 'l' &&
                    ss[12] == 'i' && ss[13] == 'n' && ss[14] == 'e' &&
                    (*fulline = 3));
    case 17:
            Return (ss[0] == 'b' && ss[1] == 'i' && ss[2] == 'b' &&
                    ss[3] == 'l' && ss[4] == 'i' && ss[5] == 'o' &&
                    ss[6] == 'g' && ss[7] == 'r' && ss[8] == 'a' &&
                    ss[9] == 'p' && ss[10] == 'h' && ss[11] == 'y' &&
                    ss[12] == 's' && ss[13] == 't' && ss[14] == 'y' &&
                    ss[15] == 'l' && ss[16] == 'e');
  }
}
/* CUT */
/* Egy karakter fogada1sa a kimenetre.
   A ma1sodik argument azt mondja meg, hogy a
   karakter e1kezetes-e, e1s ha igen, akkor milyen e1kezetet kap.
   Ha a karakter 0, akkor a rendszer inicializa1la1sa to2rte1nik.

   Ha a karakter NL vagy az ``ekezet'' -1 akkor a sor leza1ra1sa to2rte1nik.
   Elso2 esetben egy u1j sor keru1l kii1ra1sra, a ma1sodik esetben nem.

   A sort egy int to2mbben ta1roljuk ege1szen a sor ve1g jelig.
   A norma1lis karaktereket x<256 ko1ddal ta1roljuk. Az e1kezetes betu3k
   e1s o2sszetett betu3k (pl. cs) ko1dja x > 256.
   E1kezetes betu3k esete1ben az also1 ba1jt tartalmazza az e1kezetlen betu3
   kisbetu3s  alakja1t.
   O2sszetett betu3k esete1ban az also1 ba1jt az elso2 betu3 kisbetu3s
   ko1dja.
   A felso3 ba1jt bitjei:
   bit e1kezetes betu3               o2sszetett betu3
   ---------------------------+-----------------------------
   0   e1kezet                | o2sszetett betu2 jelze1se
   1     ti1pusa 1,2,3        | 0/1 sima/hosszu1 betu2
   2   0/1 kis/nagy betu3     | 0/1 elso3 kis/nagy betu2
   3   u2res                  | 0/1 ma1sodik kis/nagy betu2
   4   -"-                    | 0/1 harmadik kis/nagy betu2
   5   -"-                    | u2res
   6   -"-                    | -"-
   7   -"-                    | -"-
   ---------------------------+-----------------------------
 */
static int lline[SRL+SRLP]; /* Bemeno3 sor bufferele1se. */
static int *line;/* Ezt haszna1ljuk a sor indexele1se1re.
		    Ez mindi1g lline+SRLP-re mutat, hogy ha a
		    sor eleje1n ismert igeko2to3 van, akkor
                    is legyen hova elo3rehu1zni a sort. */
static int bpos; /* Buffer pozi1cio1. (Elso3 szabad hely.) */
void _ send_character(ch,ekezet)char ch;int ekezet;{
static int pw,cw; /* Az aktua1lis ill. a megelo3zo3
		     szo \begin vagy \end vagy egye1b latex szekvencia
		     volt-e */
static int termch; /* A szo1 leza1ro1 karakter. */
/* Olyan TeX szavak, amelyek eleje1n nincs \ karakter, me1gsem
   valo1szi1nu3, hogy valaki a magyar elva1laszta1s szerint akarna1
   o3ket elva1lasztani. */
static char *texwords[] = { "scaled"           ,
                            "plus"             ,
                            "minus"            ,
                            "width"            ,
                            "depth"            ,
                            "height"           ,
			  NULL };
int j,i,st,pch,ppch,k,kk;
char l[3];/* A dupla karakterek kisbetu3sse1 konverta1lva, szelekcio1hoz. */
int *word; /* Egy szo1t mindi1g kigyu2jtu2nk ide. */
char ss[SRL];
int *is,*ws,fullline,allow,hyped;

/* Egy karakter elte1tele. A tu1l hosszu1 sorok ve1ge elve1sz. */
#define store(x) ((bpos<SRL-1)?(line[bpos++]=(x)):\
                  (hfprintf(stderr,MSG_LILONG,SRL),ReportLineNumber))

/* O2sszetett karakterek kezele1se1re. */
#define cmp1(x) (*l == (x)[0] && l[1] == (x)[1])
/* O2sszetett hasszu1 karakterek kezele1se1re. */
#define cmp2(x) (cmp1(x) && l[2] == (x)[2])
/* Argumentum maga1nhangzo1-e? */ /* Szu2kse1g van ra1 a tex_ligature
				   * fu2ggve1nyben eze1rt a1tkeru2lt oda
				   * a defini1cio1.
				   */
/* Argumentum ma1ssal hangzo1-e? */
#define ma1ssal(x) (chartype[(x)&255].flag&CHT_MA1SSAL)

        FunctionStart("send_character");
        if( ch == NUL ){/* Inicializa1la1s. */
                line = lline+SRLP;/* Ke1t karakter hely kell az extra \-
				     jelnek, amikor egy igeko2to3t elo3bbre
                                     hu1zunk, e1s a sorba egy \- jelet rakunk
                                     e1ppen u1gy mintha a felhaszna1lo1
                                     jelo2lte volna be. Ha nem hagyna1nk
				     u2res helyet, akkor egy a sor eleje1n
				     a1llo1 igeko2to3 mego