/* 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 #include #include #include #include /* 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 #define TURBOCPTR (void far *) */ #define TURBOCPTR #else #define TURBOCPTR #endif #ifdef MSC #include #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 #include #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 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 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= 1 && (pch=line[i--]) < 256 && (ppch=line[i]) < 256 ){ /* Ma1r lehetnek hosszu1 ketto3s betu3k. */ l[2] = islower(ch) ? ch : tolower(ch); l[1] = islower(pch) ? pch : tolower(pch); l[0] = islower(ppch) ? ppch : tolower(ppch); if( cmp2("ssz") || cmp2("zzs") || cmp2("ddz") || cmp2("ccs") || cmp2("lly") || cmp2("ggy") || cmp2("tty") || cmp2("nny") ){ line[i] = *l|768; /* Dupla, hosszu1 betu3. */ if( isupper(ppch) )/* Elso3 karakter nagybetu2. */ line[i] |= 1024; if( isupper(pch) )/* Ma1sodik karakter nagybetu2. */ line[i] |= 2048; if( isupper(ch) )/* Harmadik karakter nagybetu3. */ line[i] |= 4096; bpos = ++i; RETURN; } } if( (i = bpos-1) >= 0 && (pch = line[i]) >= 256 && (pch&255) == 'c' && (ch == 'z' || ch == 'Z')){ /* ha valahol csz szerepel, akkor a dupla betu3 az sz e1s nem a cs. Most a cs uta1n z jo2tt, e1s eze1rt a cs-t sze1tbontjuk c-re e1s s-re. Ezuta1n a program tova1bbi re1sze ma1r o2ssze fogja vonni az s-et e1s a z-t sz-e1. */ if( pch&(4*256) )/* Nagybetu3 a C a cs-bo3l. */ line[i] = 'C'; else line[i] = 'c'; i++; if( pch&(8*256) )/* Nagybetu3 az S a cs-bo3l. */ line[i] = 'S'; else line[i] = 's'; bpos++; } if( (i = bpos-1) >= 0 && (pch = line[i]) < 256 ){ /* Ma1r lehetnek ketto3s betu3k. */ l[1] = islower(ch) ? ch : tolower(ch); l[0] = islower(pch) ? pch : tolower(pch); /* A ch karakter nem ketto3s betu2, de specia1lisan kell elva1lasztani, eze1rt u1gy ta1roljuk mint a ketto3s betu2ket. */ if( cmp1("ch") ){ line[i] = 'h'|256; if( isupper(pch) )/* Elso3 karakter nagybetu2. */ line[i] |= 256*4; if( isupper(ch) )/* Ma1sodik karakter nagybetu2. */ line[i] |= 256*8; RETURN; } if( cmp1("sz") || cmp1("zs") || cmp1("dz") || cmp1("cs") || cmp1("ly") || cmp1("gy") || cmp1("ty") || cmp1("ny") ){ line[i] = *l|256;/* Dupla karakter jelze1se. */ if( isupper(pch) )/* Elso3 karakter nagybetu2. */ line[i] |= 1024; if( isupper(ch) )/* Ma1sodik karakter nagybetu2. */ line[i] |= 2048; /* Itt nem kell bpost macera1lni, mert nem lett egy karakter sem elte1ve feleslegesen. */ RETURN; } store(ch); RETURN; } store(ch); RETURN; case 1: switch(ch){ case 'a' : case 'A' : case 'e' : case 'E' : case 'u' : case 'U' : case 'i' : case 'I' : case 'o' : case 'O' : store((isupper(ch)? tolower(ch)+1024:ch)+256); break; default: internal(0,IERR_BADEK1,"BADEK1"); } RETURN; case 2: switch(ch){ case 'u' : case 'U' : case 'o' : case 'O' : store((isupper(ch)? tolower(ch)+1024:ch)+512); break; default: internal(0,IERR_BADEK2,"BADEK2"); } RETURN; case 3: switch(ch){ case 'u' : case 'U' : case 'o' : case 'O' : store((isupper(ch)? tolower(ch)+1024:ch)+768); break; default: internal(0,IERR_BADEK3,"BADEK3"); } RETURN; /* Erre az esetre mindaddi1g nincs szu2kse1g, ami1g nincsen ebben a switchben egy default eset. Ez az e1kezet jelo2le1s, akkor amikor az EOF a beolvasott karakter, e1s e1s a hi1vo program re1sz egy leza1ro1 karaktert akar ku2ldeni. Ha az u1j sor karakter lenne, akkor egy extra u1j sor keletkezne a konverta1lt fa1jl ve1ge1n. I1gy az EOF jelze1se szo1ko2z 4 e1kezettel. */ case 4: break; /* EOF + sorleza1ra1s */ } /* Ide csak u1gy juthat el a program, hogy a karakter NL volt, e1s a if( ch == NL )break; kile1pett a switchbo3l. Minden ma1s Return-nal szaki1tja meg a switch-et. Me1g az is elo3fordulhat, hogy ekezet == -1 e1s i1gy bele sem le1pu2nk a switchbe. Akkor is ide jut a program, hogyha az e1kezet e1rte1ke 4 (ez akkor fordul elo3, amikor EOF jo2tt, de a program me1g le akarja za1rni a sort, e1s eze1rt egy szo1ko2zt ku2ld extra e1kezet jelo2le1ssel). */ fullline = 0;/* Ez nulla mindaddi1g, ami1g nem tala1lunk olyan LaTeX veze1rlo3t, ami az ege1sz sort leve1di. */ line[bpos] = 0;/* Leza1rjuk a sort. */ /* Ve1gigmegyu2nk a soron. */ for( j = i = 0 ; i < bpos ; i++ ){ /* Ez a nagy if megvizsga1lja, hogy ele1rtu2nk-e egy szo1 ve1ge1re, azaz `i' a szo1 uta1nra mutat. */ if( (line[i]<256 && isspace(line[i])) || /* Szo1ko2z. */ (index("{}[]-=+`~/<>",line[i]) && (i<1||line[i-1]!='\\')) || (j+2==i && line[j] == '\\' && !isalpha(line[j+1]&0xff) ) || (line[i] == '\\' && line[i+1] != '-' && i != j) || /* Ele1rtu2k a sor fizikai ve1ge1t. */ (i == bpos-1 && (i++,1))){ if( i == j )i++; /* Ele1rtu2nk egy szo1 ve1ge1re. */ if( i == j+1 ){ /* Nem volt szo1 csak to2bb szo1ko2z egyma1s uta1n, vagy egykarakteres szo1t tala1ltunk. */ tex_code(line[j]); j = i--; continue; } nr_w++; pw = (cw==1);/* Shiftelju2k a latex szekvencia flageket. */ word = line+j; /* A szo1 eleje. */ if( i < bpos ){/* Ha nem a fiz. sor ve1ge za1rja a szo1t. */ termch = line[i];/* Eltesszu2k a szo1 za1ro1 karaktert. */ line[i] = 0; /* Leza1rjuk a szo1t. */ } else termch = line[++i] = 0; /* A sor ve1ge za1rja le. */ if( latex || protection ){ /* A1tma1soljuk a szo1t ss-be a hasonli1ta1sokhoz. */ for( j = st = 0 ; ; j++,st++ ){ ss[kk=st] = word[j]&255; if( maga1n(word[j]) ) switch( word[j]&~0xFF ){ case VESSZO3: ss[++st]=vesszo3;break; case UMLAUT : ss[++st]=umlaut ;break; case HUMLAUT: ss[++st]=humlaut;break; } else if( word[j]&512 ) /* Ha *hosszu1* o2sszetett betu3. */ ss[++st] = word[j]&255; /* Ha magyar betu3 e1s nem e1kezetes. */ if( word[j] > 255 && (*l=chartype[word[j]&255].ma1sodik) ){ /* Le1pju2nk ra1 a ma1sodik tagra. */ ss[++st] = *l; if( word[j]&1024 ) /* Elso3 betu2 nagy. */ ss[kk] = toupper(ss[kk]); if( word[j]&2048 ) /* Ma1sodik betu2 nagy. */ ss[kk+1] = toupper(ss[kk+1]); if( word[j]&4096 ) /* Harmadik betu2 nagy. */ ss[kk+2] = toupper(ss[kk+2]); } if( ! word[j] )break; } /* Ha nem \ az eleje, akkor meg sem hi1vjuk. */ cw= *ss == '\\' ? slatex(ss+1,st-1,&fullline) : 0; if( cw == 0 && protection ){/* Ha nem LaTeX szekvencia */ for( j = 0 ; texwords[j] ; j++ ) if( ! strcmp(texwords[j],ss) ){ cw = 2; break; } } } if( CompWor && *word != '\\' && (!latex || !cw) && cw != 2 ){ /* Megne1zzu2k, hogy nem o2sszetett szo1-e. */ nr_cw++; CheckCWord(word); if( HypNr ){/* Ha o2sszetett. */ nr_cws++; nr_cwh += (long)HypNr; word -= SplitCWord(word); } } if( sa1gse1g && *word != '\\' && (!latex || !cw) && cw != 2 ){ /* Ha latex szekvencia, akkor u1gysem va1lasztjuk el. */ nr_sg++; /* Olyan szavakat keresu2nk, amelyben szerepel a sa1g vagy a se1g sorozat, mint pe1lda1ul a malacsa1g. Ezek ko2zu2l csak azokkal kell to2ro3dni, amelyekben az s betu3 elo3tt c vagy z a1ll, azaz a csa1g, cse1g e1s zsa1g zse1g. */ for( j = 0 ; word[j] ; j++ ) if( (word[j]&0x1ff) == cs || (word[j]&0x1ff) == zs ) break; /* Pillanatnyilag minden olyan szo1t amelyben csa1g, cse1g vagy zsa1g, zse1g szerepel u1gy va1lasztunk el, mint a malac-sa1g szo1t. Ke1so3bbi verzio1kban ez va1ltozhat. */ if( word[j] && /* Ha tala1ltunk, */ word[j+1] && /* e1s van tova1bb */ ((word[j+1]&0x1ff) == a1 || (word[j+1]&0x1ff) == e1) && /* e1s az a1, e1s */ word[j+2] && word[j+2]<256 && /* van tova1bb, e1s*/ (isupper(word[j+2]) ? /* az g vagy G */ tolower(word[j+2]):word[j+2]) == 'g'){ /* akkor*/ for( ws = word-1 , k=0 ; k<=j ; ws++,k++) *ws = ws[1]; /* Az utolso1 karaktert * lemaszkoljuk, e1s i1gy pe1lda1ul * a malacsa1g-bo1l elo3szo2r * malacs|csa1g lesz, azuta1n */ k= ws[-1] & 255; /* Ha a dupla betu3bo3l az elso3 karakter nagybetu3. */ if( ws[-1]&1024 )k=toupper(k); ws[-1]=k; /* malac|sa1g. */ /* A ma1sodik mindi1g s vagy S. */ *ws = ((*ws)&2048) ? 'S' : 's'; /* Ezuta1n ma1r az eredeti * elva1lszto1 algoritmus helyesen * fog mu3ko2dni. */ /* word pedig a lehu1zott szo1 eleje1re mutat. */ word--; nr_sgs++; } } if( megmeg && *word != '\\' && (!latex || !cw) && cw != 2 ){ /* Ha latex szekvencia, akkor u1gysem va1lasztjuk el. */ /* Keresu2nk olyan szo1tagokat mint a ``meg''. */ /* Megkeressu2k az elso3 betu2t, mert a [megette] szo1t is helyesen akarjuk elva1lasztani.*/ for( j = 0 ; word[j] && !isalpha(word[j]&255) ; j++) continue; /* Ha van betu2 a szo1ban (lehet [[]] is egy szo1)*/ if( word[j] ){ k = word[j] & ~(1024|2048|4096); if( isupper(k) )k=tolower(k); switch(k){ #define CheckPrefix(x) k=x;if(is=PrEfIx(megarr[k]+1,word+j))break #define NotFound k=16;break case 'm': CheckPrefix(0); CheckPrefix(14); NotFound; case 'f': CheckPrefix(1); CheckPrefix(2); NotFound; case 'a': CheckPrefix(3); NotFound; case a1: CheckPrefix(4); CheckPrefix(11); NotFound; case 'k': CheckPrefix(5); CheckPrefix(6); NotFound; case sz: CheckPrefix(7); CheckPrefix(12); NotFound; case 't': CheckPrefix(8); CheckPrefix(9); NotFound; case 'e': CheckPrefix(10); NotFound; case 'v': CheckPrefix(13); NotFound; case 'l': CheckPrefix(15); NotFound; default: NotFound; } #undef CheckPrefix #undef NotFound /* Ha tala1ltunk igeko2to3 prefixet, e1s az uta1na jo2vo3 karakter maga1nhangzo1 e1s nem kell megvizsga1lttani vagy az automata is elfogadja a szo1t. */ if( megarr[k][1] && maga1n(*is) && (*megarr[k] || igeko2to3(is,k)) ){ if( k > IK_KVA1ZI_HATA1R ){ for( ws = word-1 ; ws != is-1 ; ws++) *ws = ws[1]; /* Az utolso1 karaktert * lemaszkoljuk, e1s i1gy pe1lda1ul * a meggyu3lik-bo3l elo3szo2r * meggy|ggyu3lik lesz, azuta1n * meg|ggyu3lik, majd */ *(ws-1) &= 255; /* meg|gyu3lik. */ *ws &= (~512); /* Ezuta1n ma1r az eredeti * elva1lszto1 algoritmus helyesen * fog mu3ko2dni. */ /* word pedig a lehu1zott szo1 eleje1re mutat. */ word--; } else { /* Elo3re hu3zzuk a szo1 eleje1t.*/ for( ws = word-2 ; ws != is-2 ; ws++) *ws = ws[2]; /* Berakjuk az elva1laszto1 jelet, mintha az eredeti szo2vegben bent lett volna. */ *ws++ = '\\'; *ws = '-'; /* word pedig a lehu1zott szo1 eleje1re mutat. */ word -= 2; } } } } st=2*(*word=='\\'); if( cw == 2 )st=2; if( st == 0 )st = 1; /* st == 0 (megszu3nt) * 1 bonyolult discretionary elva1laszta1s * 2 veze1rlo3 szo1 * 3 ki van kapcsolva az elva1laszta1s */ nr_c += st == 2; /* Korriga1ljuk a do2nte1st ku2lo2nbo2zo3 flagek a1lla1sa szerint. */ if( onlysz_sz && st != 1 && st != 2 ) st = 3; /* Ha csak a bonyolult elva1laszta1s van bekapcsolva. */ /* Ha minden ma1s ki van kapcsolva a norma1l elva1laszta1s, e1s a discretionary is, e1s a szo1 nem veze1rlo3 szo1. */ if( onlysz_sz && extroff && st !=2 ) st = 3; /* if( st == 1 && extroff ) st = 0; */ if( !hypon )st = 3; /*Ha ki van kapcsolva az elva1laszta1s.*/ if( latex && (pw||fullline)) /* Nem nyu1lunk LaTeX kulcsszavakhoz. */ st = fullline ? fullline : 2; switch( st ){ case 1:/* Bonyolult elva1laszta1s. */ hyped = 0; /* Me1g nem volt elva1laszta1s. */ allow = 0; /* Mindaddi1g nem engedu2nk meg elva1laszta1st, ami1g nem tala1lunk egy maga1nhangzo1t */ /* Megsza1moljuk a szo1ban szereplo3 betu3ket. */ for( j = st = 0 ; word[j] ; j++ ) if( isalpha( (word[j]&255) ) )st++; if( st < 3 )hyped = 1; for( k = j = 0 ; word[j] ; j++ ){ /* Ha vigya1zunk a ligatu1ra1kra, e1s a * ligatu1ra nem a szo1 eleje1n van. */ if( careligatures && j && tex_ligature(word,&j,&k,&st) ){ hyped = 1; continue; } /* Ha o2sszetett hosszu1 ma1ssalhangzo1. */ if( ma1ssal(word[j]) && (word[j]&512) && /* E1s uta1na maga1nhangzo1 jo2n. */ word[j+1] && maga1n(word[j+1]) /* E1s nincs kikapcsolva a az ilyen elva1laszta1s. */ && ! extroff ) /* e1s nem ez az elso3 betu3 (ba1r ez a magyar nyelvben ele1g ritka.) */ if(j) hyped=1 , tex_discretion(word[j]); else { if( warnings ){ hfprintf(stderr, MSG_SSZS,word[j]&255); ReportLineNumber; } tex_code(word[j]); } else tex_code(word[j]); if( isalpha( (word[j]&255) ) ){ /* Sza1moljuk a kii1rt karaktereket e1s a me1g visszalevo3ket. */ k++,st--; if(maga1n(word[j]))allow = 1; } /* Egy eredetileg ma1r bent le1vo3 elva1laszta1s is lenulla1zza a sza1mla1lo1t. */ /* Csak a szo1 eleje1n e1s ve1ge1n nem * engedju2k meg az egybetu3s szo1tagokat, * mert szo1 ko2zben ezek nem fognak meg- * jelenni, mert hozza1 lesznek csapva a * szo1 elejehez, vagy a ve1ge1hez. */ if( j > 0 && word[j] == '-' && word[j-1] == '\\' )allow = 0,hyped=1; if( allow && k >= mintag && st >= mintag && /* Ha st >= mintag ami 1 vagy 2, akkor biztos, hogy word[j] e1s word[j+1] OK. word[j+2]-t azonban meg kell vizsga1lni. */ ((maga1n(word[j]) && maga1n(word[j+1])) || /* Ma1ssal hangzo1, de nem o2sszetett hosszu1. */ (ma1ssal(word[j+1]) && !(word[j+1]&512) && word[j+2] && maga1n(word[j+2])) || /* dz jo2n, uta1na s ==>azaz DZS, e1s uta1na maga1nhangzo1. */ (word[j+1] == dz && word[j+2] && (word[j+2]=='s'||word[j+2]=='S') && word[j+3] && maga1n(word[j+3]))) ){ /* onlysz_sz * 0 ha mindent * elva1lasztunk, * 1 ha csak a \discretionary * szekvencia1kat i1rjuk be, * 2 ha azokat a szavakat, * amelyekben \discretionary * elva1laszta1s van el * va1lasztjuk, de ma1st nem. * Ez azt jelenty, hogy az * ONLYSSZ opcio1 ke1tszer volt * megadva. */ if( onlysz_sz != 1 ){ fprintf(fo,"\\-"); hyped = 1; allow = 0;/* Mindaddi1g nem va1lasztunk el, ami1g nem jo2n egy u1j maga1nhangzo1. */ } } } if( posthy && !hyped ) fprintf(fo,"\\-"); break; case 2:/* Nem va1lsztjuk el a szo1t e1s nem is oldjuk fel a 1,2,3 e1kezeteket. */ for( j = 0 ; word[j] ; j++ ) if( word[j] < 256 ){/*Egyszeru3 karakter. */ fprintf(fo,"%c",word[j]); } else if( maga1n(word[j]) ){ /* E1kezetes maga1nhangzo1. */ /* Itt akkor is az 123 jelo2le1s jelenik meg a kimeneten, ha a bemeneten nem azt haszna1ltuk. */ fprintf(fo,"%c%1d",((word[j]&1024)?/*nagybetu2?*/ toupper(word[j]&255) : word[j]&255) , ((word[j]/256)&3)); } else if( chartype[word[j]&255].flag&CHT_DUPLA ){ /* O2sszetett betu2. */ /* Keressu2k ki a dupla betu elso2 tagja1t. */ if(!(l[1] = l[0] = chartype[word[j]&255].elso3)) internal(0,IERR_BADUPC,"BADUPC"); k=1+((word[j]&512)!=0); /* Le1pju2nk ra1 a ma1sodik tagra. */ l[2] = l[k] = chartype[word[j]&255].ma1sodik; if( word[j]&1024 )/* Elso3 betu2 nagy. */ l[0] = toupper(l[0]); if( word[j]&2048 )/* Ma1sodik betu2 nagy. */ l[1] = toupper(l[1]); if( word[j]&4096 )/* Harmadik betu2 nagy. */ l[2] = toupper(l[2]); /* Rakjuk ki a betu2t. */ if( word[j]&512 ){ fprintf(fo,"%c%c%c",l[0],l[1],l[2]); } else{ fprintf(fo,"%c%c",l[0],l[1]); } } else internal(0,IERR_WEIRDE,"WEIRDE"); break; case 3:/* Nem va1lsztjuk el a szo1t de a 1,2,3 e1kezeteket feloldjuk. */ for( j = 0 ; word[j] ; j++ ) tex_code(word[j]); break; } if( termch ){ line[i--]=termch; /* Visszaa1lli1tjuk a szo1leza1ro1 karaktert. */ /* i-t aze1t kell dekrementa1lni, mert a ciklus no2veli. */ } j = i+1;/* A ko2vetkezo3 szo1 eleje. */ } } if( ekezet == 0 )/* NL za1rta le a sort. */ fprintf(fo,"\n"); /* A sort kii1rtuk, kezdu2nk egy u1j sort. */ bpos = 0; RETURN; #undef store #undef cmp1 #undef cmp2 #undef maga1n #undef ma1ssal }/* Send_character ve1ge. */ #define CLOSE_BUFFER ' ',4 #define INIT_BUFFER NUL,0 /* Magyar numerikus e1kezetek a1talaki1ta1sa TeX forma1ra * valamint elva1laszta1s bekapcsola1sa. */ int hion(){ int ch,pch,st; FunctionStart("hion"); if( usedicc ){/* Ha haszna1ljuk az o2sszetett szavakat. */ ReadStateMachine(); if( CompWor == NULL && warnings ) hfprintf(stderr,MSG_DICCNR); } send_character(INIT_BUFFER); /* Inicializa1ljuk a kimenetet. */ prepare_table(); /* Bea1lli1tjuk a ta1bla1zatot. */ prep_chttable(); st = 1; off_mode= 0; /* Elva1laszta1s meg minden bekapcsolva. */ /* off_mode = 1 kikapcsolva || jellel. 2 kikapcsolva $ jellel. 3 kikapcsolva $$ jelekkel. 4 kikapcsolva \( jelekkel. 5 kikapcsolva \[ jelekkel. 6 kikapcsolva % jellel. */ pch = ' '; ch = GeTc; for ever{ if( ch == EOF ){ send_character(CLOSE_BUFFER); if( !hypon ){ hfprintf(stderr,MSG_EOF_OFF); ReportOffLineNumber; } if( off_mode && warnings ) switch( off_mode ){ case 1: case 6: hfprintf(stderr,MSG_EOF_OFF); ReportOffLineNumber; break; default: hfprintf(stderr,MSG_EOF_MATH); ReportOffLineNumber; break; } Return(0); } if( off_mode ){/* Ha ki volt kapcsolva. */ /* Kikapcsolva | jellel. */ if( off_mode == 1 && ch == '@' ){ if( (ch=GeTc) == '@' ){ off_mode = 0; ch = GeTc; st = 1; pch = ' '; makebars && fprintf(fo,"@@"); continue; } fprintf(fo,"@"); pch = '@'; continue; } /* Kikapcsolva $ jellel. */ if( off_mode == 2 && ch == '$' ){ off_mode = 0; ch = GeTc; fprintf(fo,"$"); st = 1; pch = ' '; continue; } /* Kikapcsolva $$ jellel. */ if( off_mode == 3 && ch == '$' && pch == '$' ){ off_mode = 0; ch = GeTc; fprintf(fo,"$");/* kii1rjuk a ma1sodik $-t. */ st = 1; pch = ' '; continue; } /* Kikapcsolva \( jellel. */ if( off_mode == 4 && ch == ')' && pch == '\\' ){ if( !latex ) internal(0,IERR_BADOF4,"BADOF4"); off_mode = 0; ch = GeTc; fprintf(fo,")"); st = 1; pch = ' '; continue; } /* Kikapcsolva \[ jellel. */ if( off_mode == 5 && ch == ']' && pch == '\\' ){ if( !latex ) internal(0,IERR_BADOF5,"BADOF5"); off_mode = 0; ch = GeTc; fprintf(fo,"]"); st = 1; pch = ' '; continue; } if( off_mode == 6 && ch == NL ){ off_mode = 0; fprintf(fo,"\n"); ch = GeTc; st = 1; pch = ' '; continue; } fprintf(fo,"%c",ch); pch = ch; ch = GeTc; continue; } /* Ha nincs kikapcsolva. */ if( ch == '|' && hypon ){ if( st == 2 && (st=1) )send_character(pch,0); send_character(CLOSE_BUFFER); makebars && putc('|',fo); ch = GeTc; LineOffNumber = LineNumber; if( ch == '|' ){ off_mode = 1; ch = GeTc; makebars && putc('|',fo); continue; } hypon = 0; pch = ' '; continue; } if( ch == '@' && !hypon ){ if( st == 2 && (st=1) )send_character(pch,0); send_character(CLOSE_BUFFER); hypon = 1; ch = GeTc; makebars && putc('@',fo); continue; } if( ch == '$' && pch != '\\' ){ /* Ha valamilyen e1kezetre va1runk, akkor az most nem jo2tt, e1s el kell ku2ldeni az elo3zo3 karaktert. */ if( st == 2 ) send_character(pch,0); send_character(CLOSE_BUFFER);/* lezarjuk a sort u1jsor karakter ne1lku2l. */ ch = GeTc; if( ch == '$' ){ fprintf(fo,"$$"); off_mode = 3; LineOffNumber = LineNumber; ch = GeTc; pch = ' '; continue; } fprintf(fo,"$%c",ch); pch = ch; off_mode = 2; LineOffNumber = LineNumber; ch = GeTc; continue; } if( ch == '%' && pch != '\\' ){ /* Ha valamilyen e1kezetre va1runk, akkor az most nem jo2tt, e1s el kell ku2ldeni az elo3zo3 karaktert. */ if( st == 2 ) send_character(pch,0); send_character(CLOSE_BUFFER);/* lezarjuk a sort u1jsor karakter ne1lku2l. */ fprintf(fo,"%%"); pch = ch; off_mode = 6; ch = GeTc; continue; } if( latex && ch == '(' && pch == '\\' ){ /* Ha valamilyen e1kezetre va1runk, akkor az most nem jo2tt, e1s el kell ku2ldeni az elo3zo3 karaktert. */ if( st == 2 ) send_character(pch,0); send_character(CLOSE_BUFFER);/* lezarjuk a sort u1jsor karakter ne1lku2l. */ fprintf(fo,"("); pch = ch; off_mode = 4; LineOffNumber = LineNumber; ch = GeTc; continue; } if( latex && ch == '[' && pch == '\\' ){ /* Ha valamilyen e1kezetre va1runk, akkor az most nem jo2tt, e1s el kell ku2ldeni az elo3zo3 karaktert. */ if( st == 2 ) send_character(pch,0); send_character(CLOSE_BUFFER);/* lezarjuk a sort u1jsor karakter ne1lku2l. */ fprintf(fo,"["); pch = ch; off_mode = 5; LineOffNumber = LineNumber; ch = GeTc; continue; } if( st == 1 ) switch( ch ){ case EOF : send_character(CLOSE_BUFFER); 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 : pch = ch; send_character(ch,0); break; } else if( st == 2 ) if( ch == vesszo3 ){ send_character(pch,1); st = 1; } else if( ch == umlaut ){ switch( pch ){ case 'u' : case 'U' : case 'o' : case 'O' : send_character(pch,2); st = 1; break; default : send_character(pch,0); 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 'U' : case 'o' : case 'O' : send_character(pch,3); st = 1; break; default : send_character(pch,0); if( warnings ){ hfprintf(stderr,MSG_BD_CH, pch, humlaut == HUMLAUT ? '3' : humlaut); ReportLineNumber; } st = 1; continue; } } else if( ch == EOF ){ send_character(pch,0); send_character(CLOSE_BUFFER); Return(0); } else { send_character(pch,0); st = 1; continue; } ch = GeTc; } }/* Hion ve1ge. */ #undef CLOSE_BUFFER /* Ez a ta1bla1zat a nemnyomtathato1 karakterekhez nyomtathato1 * stringet rendel. */ char *CoExCh[]={ "a1", /* 1 */ "e1", /* 2 */ "i1", /* 3 */ "o1", /* 4 */ "o2", /* 5 */ "o3", /* 6 */ "u1", /* 7 */ "u2", /* 8 */ "u3", /* 9 */ "cs", /* 10 */ "ccs", /* 11 */ "ch", /* 12 */ "dz", /* 13 */ "ddz", /* 14 */ "gy", /* 15 */ "ggy", /* 16 */ "ly", /* 17 */ "lly", /* 18 */ "ny", /* 19 */ "nny", /* 20 */ "sz", /* 21 */ "ssz", /* 22 */ "ty", /* 23 */ "tty", /* 24 */ "zs", /* 25 */ "zzs", /* 26 (Ez ASCII fa1jban EOF !!!) */ }; /* Ez a fu2ggve1ny egy 16 bites betu3t a1talaki1t 8 bitesre. Mivel * itt nincsen szu2kse1gu2nk a specia1lis veze1rlo3 karakterekre, eze1rt * a nem ASCII karakterek az also1 re1gio1ba keru2lnek. * A kisbetu3ket e1s a nagybetu3ket nem ku2lo2nbo2ztetju2k meg. * * a1 1 * e1 2 * i1 3 * o1 4 * o2 5 * o3 6 * u1 7 * u2 8 * u3 9 * cs 10 * ccs 11 * ch 12 * dz 13 * ddz 14 * gy 15 * ggy 16 * ly 17 * lly 18 * ny 19 * nny 20 * sz 21 * ssz 22 * ty 23 * tty 24 * zs 25 * zzs 26 (Ez ASCII fa1jban EOF !!!) */ char _ ConvertExtChar(ch)int ch;{ if( ch < 256 ) if( islower(ch) )return ch; else return tolower(ch); ch &= ~(1024|2048|4096); /* Lemaszkoljuk a nagybetu3t jelzo3 biteket. */ switch( ch ){ case a1 : return 1; case e1 : return 2; case i1 : return 3; case o1 : return 4; case o2 : return 5; case o3 : return 6; case u1 : return 7; case u2 : return 8; case u3 : return 9; case cs : return 10; case ccs: return 11; case Ch : return 12; case dz : return 13; case ddz: return 14; case gy : return 15; case ggy: return 16; case ly : return 17; case lly: return 18; case ny : return 19; case nny: return 20; case sz : return 21; case ssz: return 22; case ty : return 23; case tty: return 24; case zs : return 25; case zzs: return 26; default : hfprintf(stderr,MSG_BAD_C,ch); exit(1); } }/* ConvertExtChar ve1ge */ char * _ PrintExtChar(ch)int ch;{ static char q[2]=" "; if( ch < 256 ){ *q = ch; return q; } return CoExCh[ConvertExtChar(ch)-1]; } /* Elleno3rzi, hogy a szo1 o2sszetett-e. * Felto2lti a Hyphen array-t. */ void _ CheckCWord(s)int *s;{ char c,ct; int n; long index,hlp; byte HUGE *ptr; ptr = NULL; for(index = EntryPoint ;;){ n = CompWor[index++]; /* Ha1ny a1tmenet van? */ if( *s == 0 ){/* Ele1rtu2nk a szo1 ve1ge1re. */ if( n == 0 ){/* e1s nincs is to2bb a1tmenet. */ HypNr = CompWor[index++]&0xF;/* Az elva1laszta1sok sza1ma. */ if( HypNr > MAX_PREHYP ) internal(0,0,"TCWOR"); Hyp = CompWor+index; } else {/* Lenne me1g a1tmenet. */ HypNr = CompWor[index++]&0xF; if( HypNr > MAX_PREHYP ) internal(0,0,"TCWOR"); if( HypNr > 0 ) Hyp = CompWor+index; else if( ptr ){ HypNr = (*ptr++)&0xF; Hyp = ptr; } } return; } c = ConvertExtChar(*s++);/* Vesszu2k a szo1 ko2vetkezo3 karaktere1t. */ if( CompWor[index]&0xF ) /* Ha vannak elva1lszta1sok. */ ptr = CompWor+index; /* A lehetse1ges elva1laszta1sok. */ index += (CompWor[index]&0xF)+1; /* A1tle1pju2k az elva1laszta1si * sza1mokat. */ ct = (~c);/* Valami ami biztosan nem c. */ while( n-- ){ ct = CompWor[index++]; if( c == ct )break; index += 3;/* A1tle1pju2k az a1tmenet mutato1t. */ } if( c == ct ){/* Megtala1ltuk az a1tmenetet. */ index += 2;/* 3 ba1jt a file pointer */ hlp = CompWor[index--]; hlp = 0x100*hlp + CompWor[index--]; index = 0x100*hlp + CompWor[index]; if( index < 0 || index > FileCounter ) internal(0,0,"FLDPT"); } else{/* Nincsen megfelelo3 a1tmenet, azaz ve1gige1rtu2nk az * egyik szo1ta1rbeli szo1n, e1s a vizsga1lt szo1 * me1g folytato1dik. */ if( ptr ) HypNr = (*ptr++)&0xF;/* Az elva1laszta1sok sza1ma. */ else HypNr = 0; if( HypNr > MAX_PREHYP ) internal(0,0,"TCWOR"); Hyp = ptr; return; } } }/* CheckCWord ve1ge */ #ifdef __TURBOC__ #pragma warn -def #endif #define MAX_SZO1_HOSSZ 18 /* Egy szo1 maxima1lis hossza. */ #define PARANCS_SZA1M 128 /* A za1ro1parancsok sza1ma. */ /* Egy sort olvas a bemeno3 fa1jlbo1l, e1s a karaktereket * a send_character fu2ggve1nnyel berakatja a line to2mbbe. */ int _ getline(){ int ch,st,pch,hypi,ci; send_character(INIT_BUFFER); /* Inicializa1ljuk a sor buffert. */ for( hypi = 0 ; hypi < MAX_PREHYP ; hypi++ )Hyphen[hypi]=0; st = 1; ch = GeTc; if( ch == EOF )return EOF; ci = 0; hypi = 0; for ever{ if( ch == EOF || ch == NL || isspace(ch) ){ if( st != 1 )/* azaz van va1rakozo1 karakter */ send_character(pch,0); return !EOF; } if( ch == '`' ){ while( ch != '\'' && ch != NL && ch != EOF ) ch = GeTc; if( ch == '\'' )ch = GeTc; continue; } if( ch == '%' ){ while( ch != NL && ch != EOF ) ch = GeTc; continue; } if( ch == '-' ){ if( hypi >= MAX_PREHYP ){ hfprintf(stderr,MSG_TOOMHY); ReportLineNumber; bpos = 0; return !EOF; } if( hypi > 0 && Hyphen[hypi-1] == ci ){ if( warnings ){ hfprintf(stderr,MSG_DOUB_HYP); ReportLineNumber; } } else Hyphen[hypi++]=ci; ch = GeTc; continue; } if( st == 1 ) switch( ch ){ case EOF : return!EOF; 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 : pch = ch; send_character(ch,0); break; } else if( st == 2 ) if( ch == vesszo3 ){ send_character(pch,1); st = 1; } else if( ch == umlaut ){ switch( pch ){ case 'u' : case 'U' : case 'o' : case 'O' : send_character(pch,2); st = 1; break; default : send_character(pch,0); 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 'U' : case 'o' : case 'O' : send_character(pch,3); st = 1; break; default : send_character(pch,0); if( warnings ){ hfprintf(stderr,MSG_BD_CH,pch, humlaut == HUMLAUT ? '3' : humlaut); ReportLineNumber; } st = 1; continue; } } else { send_character(pch,0); st = 1; continue; } ch = GeTc; /* Az e1kezeteket nem sza1moljuk, de minden ma1s karaktert * igen, egyese1vel! */ if( ch != vesszo3 && ch != umlaut && ch != humlaut )ci++; } }/* getline ve1ge */ #ifdef __TURBOC__ #pragma warn +def #endif /* Ez a fu2ggve1ny megpro1ba1lja beolvasni * az o2sszetett szavak ta1bla1ja1t. Ha valami nem megy, akkor * a globa1lis CompWor va1ltozo1 e1rte1ke NULL marad. */ void _ ReadStateMachine(){ FILE *fs; long q,i,j; int bt; char Fname[FNL]; static First = 1; if( First && CompWor != NULL ) internal(0,0,"CWNNL"); if( !First )return; First = 0; if( defaultdicc ){ if( (fs = fopen(DICC_OUT,BREAD)) == NULL && /* Elo3szo2r a default. */ (fs = fopen(dcb_path,BREAD)) == NULL ) /* 2x ahol az exe van. */ for( bt=0 ; DefDicDir[bt] ; bt++ ){ #ifdef UNIX if( *(DefDicDir[bt]) == '~' ){ strcpy(Fname,getenv("HOME")); strcat(Fname,DefDicDir[bt]+1); } else #else strcpy(Fname,DefDicDir[bt]); #endif strcat(Fname,DICC_OUT); fs = fopen(Fname,BREAD); if( fs )break; } } else fs=fopen(dcb_path,BREAD); if( fs == NULL ){ if( warnings ) hfprintf(stderr,"A %s fa1jlt nem lehet megnyitni.\n",DICC_OUT); return; } if( warnings ) hfprintf(stderr,MSG_DCBREADING); /* Beolvassuk a bevezeto3 karaktereket. */ #define HCREAD(x) \ bt = getc(fs); \ if( bt != x ){ \ fclose(fs); \ if( warnings ) \ hfprintf(stderr,MSG_DCFCORR); \ return; \ } HCREAD(68) HCREAD(67) HCREAD(66) /* DCB ASCII ko1d, nem ASCII ge1pen is. */ #undef HCREAD #define GETCFS \ bt = getc(fs); \ if( bt == EOF ){ \ fclose(fs); \ if( warnings ) \ hfprintf(stderr,MSG_FILEVSH); \ return; \ } #define UnHex(x) ((x<'A') ? x-'0' : x-'A'+10) GETCFS if( warnings ){ bt = UnHex(bt); if( bt > HI_VERS ) hfprintf(stderr,MSG_HVDF); i = (bt != HI_VERS);/* Ha hi_vers ma1r nagyobb, akkor nemi1runk ki egy * hibau2zenetet ke1tszer. Ha kisebb, akkor lo_vers * lehet nagyobb, nem baj. */ } GETCFS if( warnings && !i ){/* Ha kell a figyelmeztete1s, e1s HI_VERS stimmel */ bt = UnHex(bt); if( bt > LO_VERS ) hfprintf(stderr,MSG_HVDF); } GETCFS /* A minima1lisan megki1va1nt hi verzio1. */ i = UnHex(bt); GETCFS /* A minima1lisan megki1va1nt lo verzio1. */ bt = UnHex(bt); if( i>HI_VERS || (i == HI_VERS && bt>LO_VERS) ){ fclose(fs); if( warnings ) hfprintf(stderr,MSG_MINVER,(int)i,bt); return; } GETCFS GETCFS GETCFS GETCFS /* A da1tum, e1s az 1A ko1d, * ami MSDOS alatt EOF. */ /* Beolvassuk a fa1jl hossza1t, ami nem tartalmazza a fejle1c info1t */ for( j=(i=FileCounter=0l)+1 ; i<4 ; i++, j *= 0x100 ){ GETCFS FileCounter += bt*j; } /* Beolvassuk a bele1pe1si pontot. */ for( j=(i=EntryPoint=0l)+1 ; i<4 ; i++, j *= 0x100 ){ GETCFS EntryPoint += bt*j; } #undef GETCFS exitonfail = 0; CompWor = (byte *)Malloc(FileCounter); exitonfail = 1; if( CompWor == NULL )return; for( i=0 ; i",q); fclose(fs); if( warnings && CompWor ) hfprintf(stderr,MSG_DCT_OK); return; } /* Az automata lei1ra1sa1hoz la1ncolt lista1kat haszna1lunk. * Amikor az automata1t felhaszna1ljuk, akkor persze ma1r ismert * az egyes a1llapotok me1rete, e1s i1gy to2mbo2ket haszna1lhatunk * la1ncolt lista1k helyett. */ struct ksz_state { union { struct ksz_state HUGE *elso3; /* Az elso3 e1l. */ byte fc[3]; }e; struct ksz_state HUGE *next; /* Ko2vetkezo3 e1l. */ /* 26 betu3 van az angol ABC-ben e1s ehhez me1g 26 * specia1lis karakter ado1dik hozza1. Ez o2sszesen 52 * lehetse1ges a1tmenet. Emiatt a legfelso3 ke1t bitet * me1g ma1sra is haszna1lhatjuk. */ byte betu3; /* Az e1lre i1rt betu3 */ /* A legfelso3 ke1t bit to2rle1se. */ #define MSKbetu3(x) ((x)&0x7F) #define NO_HYPH 128 /* A struktu1ra ve1gen egy meghata1rozatlan hosszu1sa1gu1 to2mb van, e1s * mindi1g annyi helyet foglalunk le, amennyi a struktu1ra hossza, plusz * a to2mb me1rete. Vigya1zat!!! Lehet a to2mb hossza nulla is. * A szoka1sos forma az ilyen to2mbo2kne1l hy[]. Ne1ha1ny fordi1to1 * azonban (pl. SUN OS gcc vagy rcc) ezt nem bi1rja. Ilyenkor a hy[0] * alakot kell haszna1lni: az elso3 #if uta1n a 1-bo3l nulla, e1s a ma1sodik * #if uta1ni 0-bo1l 1 lesz. * Van olyan fordi1to1 (pl. SUN OS rcc) amelyik me1g ezt sem bi1rja, ekkor a * harmadik deklara1cio1t kell haszna1lni.*/ #if 0 byte hy[]; #define KSZ_ME1RET sizeof(struct ksz_state) #endif #if 0 byte hy[0]; #define KSZ_ME1RET sizeof(struct ksz_state) #endif #if 1 byte hy[1]; #define KSZ_ME1RET sizeof(struct ksz_state)-1 #endif }; #define SIZE_Mstat 256 long Mstat[SIZE_Mstat]; /* Ez a to2mb tartalmazza a * statisztika1t az automata1ro1l. * Mstat[i] azt mondja meg, hogy ha1ny olyan * a1llapot van, amelyikbo3l i darab e1l fut ki. */ /* Ez a fu2ggve1ny rekurzi1van kii1rja az o2sszetett szavak ta1bla1zata1t. * passWrite mondja meg, hogy melyik menetben vagyunk. Mivel a fu2ggve1ny * rekurzi1v, eze1rt nagy luxus lenne ezt az infot argumentumke1nt a1tadni. */ byte passWrite; long _ WriteStateMachine(root)struct ksz_state *root;{ static struct ksz_state HUGE *aux; struct ksz_state HUGE *nxt; int i; static long q;/* A haszna1lata ko2zben nincs rekurzi1v hi1va1s, i1gy * ka1r lenne a stacken tartani. */ if( root == NULL ) internal(0,0,"FSMBE"); if( debugdicc ){ for( i=0 , nxt=root->e.elso3 ; nxt ; nxt = nxt->next )i++; if( i )/* Ha vannak innen a1tmenetek. */ if( passWrite == 1 ){ for( nxt=root->e.elso3 ; nxt ; nxt = nxt->next ) (void)WriteStateMachine(nxt); } else{ /* Kii1rjuk a lesza1rmazottakat. */ for( i=0 , nxt=root->e.elso3 ; nxt ; nxt = nxt->next , i++) (void)WriteStateMachine(nxt); } FileCounter ++; if( passWrite == 2 ){ fprintf(fo,"State %d\n",FileCounter); fprintf(fo,"n=%d\n",(byte)i); if( (root->betu3&NO_HYPH) == NO_HYPH ) fprintf(fo,"--"); else{ i=0; if( (root->betu3&NO_HYPH) != NO_HYPH ){ for( ; ihy[i]&128) ; i++ ) ; i++; } fprintf(fo,"%d : ",i);/* Az elva1laszta1si helyek sza1ma. */ if( (root->betu3&NO_HYPH) != NO_HYPH ) for( i=0 ; ihy[i]&0x3F)); if( root->hy[i]&128 )break; } } fprintf(fo,"\n"); for( i=0 , nxt=root->e.elso3 ; nxt ; nxt = nxt->next , i++ ){ fprintf(fo,"%c ",MSKbetu3(nxt->betu3)); q = nxt->e.fc[2];q *= 0x100; q += nxt->e.fc[1];q *= 0x100; q += nxt->e.fc[0]; fprintf(fo,"%ld\n",q); } q = FileCounter -1; /* Ez ma1r a ma1sodik menet. Felszabadi1tjuk a lesza1rmazottakat, * e1s a ra1juk mutato3 pointert ma1sra haszna1ljuk. */ for( nxt=root->e.elso3 ; nxt ; nxt = aux ){ aux = nxt->next; free(TURBOCPTR nxt); } root->e.fc[0] = q&0xFF; q /= 0x100; root->e.fc[1] = q&0xFF; q /= 0x100; root->e.fc[2] = q&0xFF; } return FileCounter-1; } else{/* Ha nem debug fa1jlt genera1lunk. */ /* Lesza1moljuk a kimeno3 e1lek sza1ma1t. */ for( i=0 , nxt = root->e.elso3 ; nxt ; nxt = nxt->next )i++; if( i )/* Ha vannak tova1bbi e1lek. */ if( passWrite == 1 ) for( nxt=root->e.elso3 ; nxt ; nxt = nxt->next ) (void)WriteStateMachine(nxt); else{ for( i=0 , nxt=root->e.elso3 ; nxt ; nxt = nxt->next , i++ ){ (void)WriteStateMachine(nxt); } } /* Kii1rjuk a kimeno3 e1lek sza1ma1t (1 byte) */ if( passWrite == 2 ) fprintf(fo,"%c",(byte)i); q = FileCounter ++; /* Lesza1moljuk az elva1laszta1sok sza1ma1t. */ i=0; if( (root->betu3&NO_HYPH) != NO_HYPH ){ for( ; ihy[i]&128) ; i++ ) continue; i++; } if( passWrite == 2 ) fprintf(fo,"%c",i); FileCounter++; if( (root->betu3&NO_HYPH) != NO_HYPH ) for( i=0 ; ihy[i]); FileCounter++; if( root->hy[i]&128 )break; } for( i=0 , nxt=root->e.elso3 ; nxt ; nxt = nxt->next , i++ ){ if( passWrite == 2 ){ fprintf(fo,"%c",MSKbetu3(nxt->betu3)); fprintf(fo,"%c",nxt->e.fc[0]); fprintf(fo,"%c",nxt->e.fc[1]); fprintf(fo,"%c",nxt->e.fc[2]); } FileCounter += 4; } if( passWrite == 2 ){ /* Ez ma1r a ma1sodik menet. Felszabadi1tjuk a lesza1rmazottakat, * e1s a ra1juk mutato1 pointerbe a pillanatnyi gyo2ke1r file * mutato1ja1t to2ltju2k. */ for( nxt=root->e.elso3 ; nxt ; nxt = aux ){ aux = nxt->next; free(TURBOCPTR nxt); } root->e.fc[0] = q&0xff; root->e.fc[1] = (q/0x100)&0xff; root->e.fc[2] = (q/0x10000L)&0xff; } return q; } } /* A1tkonverta1t egy sza1mot Hex e1rte1kre. Ha nagyobb, mint 15, akkor * megyu2nk tova1bb az ABC-vel. */ #define Hex(q) ( (q<10) ? q+'0' : q-10+'A') /* CUT */ /* * dicc -> Dictionary create. * * Ez a fu2ggve1ny egy text fa1jlbo1l bina1ris ta1bla1zatot ke1szi1t, * amelyik tartalmazza azokat az o2sszetett szavakat, amelyeket a * program helyesen va1laszt el. * */ int dicc(){ char *o; byte IsNewEndState,*hyptr; int i,ch,j; struct ksz_state HUGE *root = NULL, HUGE * HUGE *proot; struct ksz_state HUGE * HUGE *eroot,HUGE *eauxpt; /* Memo1ria foglalo1 makro1k. */ #define AllocState() AllocnState(0) #define AllocnState(x) (nr_st++,(struct ksz_state HUGE *)\ Malloc((long)KSZ_ME1RET+x*sizeof(byte))) /* Az i1gy definia1lt ke1t pointer nem csupa1n ke1t a megfelelo3 * helyre mutato1 pointer, hanem o3k A pointerek, amik oda mutatnak. I1gy * ezeknek e1rte1ket adva a megfelelo3 la1cok automatikusan kialakulnak. */ #define SPointer (*proot) #define EPointer (*eroot) prepare_table(); /* Bea1lli1tjuk a ta1bla1zatot. */ prep_chttable(); nr_sl = 9999;/* Ilyen hosszu1 szo1 nincs. */ while( getline() != EOF ){ if( bpos == 0 )continue;/* U2res sorokkal nem foglalkozunk. */ /* Egy \eof veze1rlo3 jel EOF-nak sza1mi1t. */ if( bpos == 4 && line[0] == '\\' && line[1] == 'e' && line[2] == 'o' && line[3] == 'f' )break; nr_rw++;/* Isme1t egy u1j szo1. */ if( bpos > nr_ll )nr_ll = bpos;/* Leghoszabb szo1. */ if( bpos < nr_sl )nr_sl = bpos;/* Legro2videbb szo1. */ IsNewEndState = 0; proot = (&root); hyptr = NULL; /* Megsza1moljuk az elva1laszta1si helyeket. */ for( HypNr=0 ; Hyphen[HypNr] ; HypNr++ ) ; if( nr_hy < HypNr )nr_hy = HypNr;/* Legto2bb elva1laszta1s. */ for( i=0 ; i 26 ){ hfprintf(stderr,MSG_INVDCHAR,ch); ReportLineNumber; if( debugdicc ){ fprintf(fo,MSG_INVDCHAR,ch); ReportfoneNumber; } } if( SPointer == NULL ){ SPointer = AllocState(); SPointer->betu3 = NO_HYPH; SPointer->e.elso3 = NULL; } eroot = &(SPointer->e.elso3); /* Megkeressu2k, hogy van-e ma1r a ch-nak megfelo3 e1l. * Ha nincs, akkor csina1lunk egy olyant ami u2res, * e1s a ciklus ko2vetkezo3 lefuta1sa1ban megtala1ljuk. */ for( j = 0 ; ; j++ ){/* Nincs lea1lla1si felte1tel, mert mindi1g * megtala1ljuk. Ha nincs, akkor csina1lunk, * e1s azt tala1ljuk meg. */ if( EPointer == NULL || /* Nincs tova1bb, vagy */ MSKbetu3(EPointer->betu3) > ch ){/* ez ma1r tu1l nagy. */ if( i == bpos-1 )/* Ez ma1r az utolso1 betu3. */ (eauxpt = AllocnState(HypNr))->betu3=0,IsNewEndState = 1; else /* Csina1lunk egy u1j a1tmenetet. */ (eauxpt = AllocState())->betu3 = NO_HYPH; eauxpt->next = EPointer;/* Befu3zzu2k. */ EPointer = eauxpt; eauxpt->betu3 |= ch; /* Ez az a1tmeneti betu3. */ eauxpt->e.elso3 = NULL; } else /* Ha te1nyleg megtala1ltuk a betu3t, e1s nem csak egy * most u1jonnan ke1szi1tettet tala1ltunk meg, e1s vannak * elva1laszta1sok, akkor hyptr ezekre az elva1laszta1sokra * mutat. */ if( MSKbetu3(EPointer->betu3) == ch && (EPointer->betu3&NO_HYPH) != NO_HYPH )hyptr = EPointer->hy; if( MSKbetu3(EPointer->betu3) == ch )break;/* Megtala1ltuk. */ eroot = &(EPointer->next); /* Le1pu2nk a ko2vetkezo3re. */ } proot = eroot;/* Tova1bb le1pu2nk a ko2vetkezo3 * a1llapotra. */ }/* ele1rtu2nk a szo1 ve1ge1re. */ if( (SPointer->betu3&NO_HYPH) == NO_HYPH || !IsNewEndState ){ /* Ha ma1r volt pont ez a szo1, vagy volt olyan szo1, * aminek ez a prefixe akkor nem tudunk vele mit * kezdeni. */ if( warnings ){ if( (SPointer->betu3&NO_HYPH) == NO_HYPH ) hfprintf(stderr,MSG_WREP);/* Volt ma1r ez a szo1? */ else hfprintf(stderr,MSG_WPRE);/* Prefix ko2vet. */ if( debugdicc ) if( (SPointer->betu3&NO_HYPH) == NO_HYPH ) fprintf(fo,MSG_WREP);/* Volt ma1r ez a szo1? */ else fprintf(fo,MSG_WPRE);/* Prefix ko2vet. */ ReportLineNumber; if( debugdicc ) ReportfoneNumber; for( i=0 ; ihy[j]=Hyphen[j]; if( j == 0 ){/* Nincs elva1lasztva??? */ SPointer->betu3 |= NO_HYPH; hfprintf(stderr,MSG_NOELV); ReportLineNumber; if( debugdicc ){ fprintf(fo,MSG_NOELV); ReportfoneNumber; } for( i=0 ; ihy[j-1] |= 128; } /* Elke1szu2lt a ta1bla1zat a memo1ria1ban, * most ma1r csak ki kell i1rni. */ if( warnings ) hfprintf(stderr,MSG_FINITO); FileCounter = 0L; /* Inicializa1ljuk a statisztika to2mbo2t. */ for( i=0 ; i0 ) || ( (ch == umlaut || ch == humlaut) && st>1 )) ) fputc(ch,fo); st = (index("eEuUiIoOaA",ch) != NULL) + (index("uUoO",ch) != NULL ); } }/* numoff ve1ge. (Most ma1r mindegy.) */ /* TeX forma1ro1l numerikus e1kezetekke1. ** (Egy kis (determinisztikus?) ve1ges automata epszilon a1tmenetekkel ** tarki1tva.) ** (Ha valaki tud jobbat, akkor i1rja meg. Ennek az a nagy baja, hogy ** nagyon hamar elfelejti az ember, hogy hogy volt ez az ege1sz, e1s ** ha hiba1s, akkor nagyon nehe1z javi1tani.) */ int huoff(){ int ch,st;/* ch=beolvasott karakter, st=sta1tusz. */ #define eps(x) {st=(x);continue;} #define trn(x) {st=(x);break;} FunctionStart("huoff"); st = 300; ch = GeTc; for ever{ switch( st ){ case 300 : if( ch == EOF )Return(0); if( ch == '\\' )trn(301); fputc(ch,fo); break; case 301 : if( ch == '\'' )trn(0); if( ch == '\"' )trn(100); if( ch == 'H' )trn(200); fprintf(fo,"\\%c",ch); trn(300); /* ----------- CASE ' ------------------ */ case 0: if( ch == ' ' )trn(1); if( ch == '{' )trn(2); eps(3); case 2: if( ch == '}' )trn(3); if( ch == '\\' )trn(8); fprintf(fo,"\\'{"); eps(300); case 3: if( ch == '\\' )trn(4); if( ch == '{' )trn(5); fprintf(fo,"%c%c",ch,vesszo3); trn(300); case 4: if( ch == 'i' )trn(6); fprintf(fo,"\\'\\"); eps(301); case 5: if( ch == '\\' )trn(8); fprintf(fo,"%c%c",ch,vesszo3); trn(11); case 6: fprintf(fo,"i%c",vesszo3); if( ch == ' ' )trn(9); eps(300); case 7: if( ch == ' ')trn(7); eps(300); case 8: if( ch == 'i'){ fprintf(fo,"i%c",vesszo3); trn(9); } fprintf(fp,"%c%c",ch,vesszo3); trn(300); case 9: if( ch == ' ' )trn(10); if( ch == '}' )trn(300); eps(300); case 10: if( ch == ' ' )trn(10); if( ch == '}' )trn(300); eps(300); case 11: if( ch == '}' )trn(300); eps(300); /* ----------- CASE " ------------------ */ case 100: if( ch == ' ' )trn(101); eps(102); case 101: if( ch == ' ' )trn(101); eps(102); case 102: if( ch == '{' )trn(103); eps(104); case 103: if( ch == '}' )trn(104); fputc('{',fo); eps(104); case 104: fprintf(fo,"%c%c",ch,umlaut); trn(300); /* ----------- CASE \H ------------------ */ case 200: if( ch == ' ')trn(201); eps(205); case 201: if( ch == ' ')trn(201); eps(202); case 202: if( ch == '{')trn(203); eps(204); case 203: if( ch == '}')trn(204); fputc('{',fo); eps(204); case 204: fprintf(fo,"%c%c",ch,humlaut); trn(300); case 205: if( ch == '{' )trn(206); fprintf(fo,"\\H"); eps(300); case 206: if( ch == '}' )trn(204); fprintf(fo,"{%c%c",ch,humlaut); trn(300); /* ----------- CASE I N T E R N A L E R R O R -------*/ default: internal(st,IERR_BADHOF,"BADHOF"); } ch = GeTc; } }/* huoff ve1ge */ int _ report_stat(exmrc)int exmrc;{ if( exmrc == FHION ){ hfprintf(stderr,"\n\t\tHiOn jelente1s\n\n"); hfprintf(stderr,"%6ld TeX karaktert i1rtam ki.\n",nr_tc); hfprintf(stderr,"%6ld szo1 volt, ebbo3l\n",nr_w); hfprintf(stderr,"%6ld veze1rlo3 szo1.\n",nr_c); hfprintf(stderr,"%6ld bonyolult, discretionary elva1laszta1s volt.\n", nr_td); hfprintf(stderr, "%6ld alkalommal meru2lt fel ligatu1ra ve1delem, e1s ebbo3l\n", nr_tl); hfprintf(stderr, "%6ld alkalommal kellett discretionary formula1t alkalmaznom.\n", nr_tls); hfprintf(stderr, "%6ld alkalommal vizsga1ltam igeko2to3 kezdetu3 szavakat e1s\n", nr_pf); hfprintf(stderr, "%6ld alkalommal tala1ltam is.\n",nr_pfs); hfprintf(stderr, "%6ld alkalommal vizsga1ltam meg a szo1 to2bbi re1sze1t is,\n", nr_ik); hfprintf(stderr,"%6ld alkalommal tala1ltam valo1di igeko2to3t.\n",nr_iks); hfprintf(stderr,"%6ld alkalommal kerestem sa1g se1g ke1pzo3t, e1s\n",nr_sg); hfprintf(stderr,"%6ld alkalommal tala1ltam.\n",nr_sgs); hfprintf(stderr,"%6ld alkalommal kerestem o2sszetett szavakat,\n",nr_cw); hfprintf(stderr,"%6ld alkalommal tala1ltam, e1s\n",nr_cws); hfprintf(stderr,"%6ld ku2lo2n elva1laszta1st helyeztem el.\n",nr_cwh); } if( exmrc == FDICC ){ hfprintf(stderr,"\n\t\tDicc jelente1s\n\n"); hfprintf(stderr,"%6ld szo1t dolgoztam fel.\n",nr_rw); hfprintf(stderr,"%6ld karakter volt a leghoszabb, e1s\n",nr_ll); hfprintf(stderr,"%6ld karakter volt a legro2videbb szo1.\n",nr_sl); hfprintf(stderr,"%6ld elva1laszta1s volt a legto2bb.\n",nr_hy); hfprintf(stderr,"%6ld a1llapot keletkezett.\n",nr_st); hfprintf(stderr,"%6ld ba1jt memo1ria1t haszna1ltam.\n",AllocatedMemory); /* It is not likely that someone is trying to compile HiON with an old compiler #ifdef __TURBOC__ hfprintf(stderr, "%6ld ba1jt maradt me1g felhaszna1lhato1.\n",Marade1k); #endif */ } hfprintf(stderr,"\n\nSzi1vesen ma1skor is.\n"); } /* Ha sem a fa1jl neve, sem opcio1 nem hata1rozza meg a funkcio1t. ** (Jo1 neve van, nem?) ** Ha valaki van olyan perverz, hogy maske1pp hi1vja a programot, ** az mege1rdemli ezt a hibajelzest. (Me1g az is lehet, hogy olyan perverz, ** hogy e1lvezni fogja.) */ int xuywer(){ hfprintf(stderr,MSG_WHAT_TO_DO); exit(1); } /* Ro2vid emle1kezteto3t i1r ki. */ int _ usage(){ hfprintf(stderr,"Haszna1lat:\n"); hfprintf(stderr,"hion [[-|/]opcio] [bemeno3_fa1jl] [kimeno3_fa1jl]\n"); hfprintf(stderr,"\n\nSegi1tse1g: hion /%s\n",Options[13].option); exit(1); } /* Egy help szo2veget i1r ki. */ int _ help(){ int i; #ifdef UNIX hfprintf(stderr,"hion [-opcio] [bemeno3_fa1jl] [kimeno3_fa1jl]\n"); #else hfprintf(stderr,"hion [[-|/]opcio] [bemeno3_fa1jl] [kimeno3_fa1jl]\n"); #endif hfprintf(stderr,"Opcio1k:\n"); for( i=0 ; Options[i].OptVal ; i++ ) if( Options[i].help ) hfprintf(stderr,"%s",Options[i].help); exit(1); } int _ kora1bbi(inf,ouf)char *inf;char *ouf;{ int h1,h2; struct stat s1,s2; #ifdef VMS #define MY_O_RDONLY O_RDONLY,0 #else #define MY_O_RDONLY O_RDONLY #endif /* Megnyitjuk a fa1jlokat, hogy kiolvassuk az ido3pontokat. */ if( (h1 = open(inf,MY_O_RDONLY)) == -1 )return 0; if( (h2 = open(ouf,MY_O_RDONLY)) == -1 ){ close(h1); return 0; } /* Leke1rju2k a statisztika1t, benne az utolso1 mo1dosi1ta1s ido3pontja1t. */ fstat(h1,&s1); fstat(h2,&s2); /* Itt nem kellenek to2bbet fa1jlok, fopen-nel majd a fo3program nyitja meg.*/ close(h1); close(h2); return s1.st_ctime < s2.st_ctime; } /* Reme1lem, hogy ez do2glo2tt ko1d. ** Szeretne1k egyszer egy olyan C fordi1to1t, amelyik ezt a programot ** fordi1tva kii1rja: ** Unreachable code. ** ** (Ez pedig fordi1tva: .edoc elbahcaernU) */ int _ internal(state,phase,message)int state,phase;char *message;{ fprintf(stderr,"HION INTERNAL ERROR\n"); fprintf(stderr,"STATE=%d\n",state); fprintf(stderr,"PHASE=%d\n",phase); fprintf(stderr,"MESAG=%s\n",message); fprintf(stderr,"LINEN=%d\n",LineNumber); fprintf(stderr,"Please contact:\n"); fprintf(stderr,"h3309ver@ella.hu\n"); fprintf(stderr,"\tor\n"); fprintf(stderr,"Peter Verhas\nPatyolat 4.\n"); fprintf(stderr,"Budapest\nH-1155\n"); fprintf(stderr,"HUNGARY\\EUROPE\n"); exit(2); } /* Karakter ta1bla1zat, amelyet arra haszna1l a program, hogy a ke1pernyo3re e1kezetes betu3ket i1rjon. */ int tTable[3][19]={ {/* CWI table */ -1,143,160,144,130,140,161,149,162,153,148,167,147,151,163,154,129,152,150 }, /* The value -1 is dummy just for indexing. */ {/* IOS table */ -1,193,225,201,233,205,237,211,243,214,246,213,245,218,250,220,252,219,251 }, {/* 852 table */ -1,181,160,144,130,214,161,224,162,153,148,138,139,233,163,154,129,235,251 } }; /* Az s karakterfu3ze1rt konverta1lja e1kezetesse1 a CodePage va1ltozo1nak megfelelo3 karakter ke1szlettel. Az eredme1ny a buffer statikus loka1lis va1ltozo1ba keru2l, e1s ezt adja vissza a fu2ggve1ny. */ static char *hconvert(char *s, int CodePage){ static char buffer[512]; static int i,vovel; for( i=0 ; *s ; s++ ){ if( s[1] == '1' ) switch( *s ){ case 'A': vovel = 1; break; case 'a': vovel = 2; break; case 'E': vovel = 3; break; case 'e': vovel = 4; break; case 'I': vovel = 5; break; case 'i': vovel = 6; break; case 'O': vovel = 7; break; case 'o': vovel = 8; break; case 'U': vovel = 13; break; case 'u': vovel = 14; break; default: vovel = 0; break; } else if( s[1] == '2' ) switch( *s ){ case 'O': vovel = 9; break; case 'o': vovel = 10; break; case 'U': vovel = 15; break; case 'u': vovel = 16; break; default: vovel = 0; } else if( s[1] == '3' ) switch( *s ){ case 'O': vovel = 11; break; case 'o': vovel = 12; break; case 'U': vovel = 17; break; case 'u': vovel = 18; break; } else vovel = 0; if( vovel ){ buffer[i++] = tTable[CodePage][vovel]; s++; } else buffer[i++] = *s; } buffer[i] = NUL; return buffer; } /* E1kezetes karakterekkel i1r a fa1jlba. */ int hfprintf(FILE *fp, char *format, ...){ int i; va_list argptr; va_start(argptr,format); if( _charset ) i = vfprintf(fp,hconvert(format,_charset-1),argptr); else i = vfprintf(fp,format,argptr); va_end(argptr); return i; } /* Itt a fa1jl ve1ge, ne olvasd tova1bb, mert ve1gtelen ciklusba keru2lsz. ve1gtelen ciklusba keru2lsz. ve1gtelen ciklusba keru2lsz. ve1gtelen ciklusba keru2lsz. ve1gtelen ciklusba keru2lsz. ve1gtelen ciklusba keru2lsz. */