VII. Egyéb bôvítômodulok

Автор: Kádár Zsolt

Дата: 20.06.1999

Источник: https://xenia.sote.hu

Язык: Венгерский

Bevezetés

Az OS/2-be, vagy IBM-es termékekbe beépített "hivatalos" REXX felületek mellett nagyon sok internetrôl letölthetô, freeware/shareware bôvítôcsomag létezik. Ha mindegyiket be akarnánk mutatni, akkor külön tanfolyamat kellene erre a célra szentelni. Persze nem biztos, hogy erre szükség van. Aki eddig végig tudta követni a REXX tanfolyam összes leckéjét, az már biztosan eljutott egy olyan szintre, hogy egy kis bevezetés után már könnyen el fog boldogulni a kisebb nagyobb nem IBM-es fejlesztésû bôvítôcsomagok között. Ezért aztán ebben a leckében nem is teszünk kísérletet arra, hogy átfogó képet nyújtsunk az egyéb bôvítômodulokról, csupán néhány, számomra érdekes vagy fontos csomagot fogunk megnézni.

RxPortIO

Rögtön egy olyan csomaggal kezdjük, amely az alap REXX-bôl teljesen hiányzó funkcionalitást nyújt. Az RxPortIO segítségével ugyanis REXX-bôl programozhatjuk a hardver I/O portokat. Az ingyenesen letölthetô bôvítést annak idején azért készítette el a fejlesztôje, hogy OS/2-bôl tudja használni FM rádiókártyáját. Az RxPortIO az OS/2 Warp által alapesetben mindig betöltött TESTCFG.SYS vezérlô szolgáltatásait használja.

A bôvítôcsomag által nyújtott szolgáltatásoknak vannak bizonyos korlátai is. A bôvítô DLL 32 bites, a függvények azonban 8 bites I/O olvasást tesznek lehetôvé. Az RxPortIO nem képes a megszakítás-vezérelt eszközök kezelésére. A printerportok kezelése is problémákba ütközhet, amennyiben az adott portot a rendszer már lefoglalta a printer számára. A legnagyobb probléma pedig az, hogy a kártyák fejlesztôi általában nem publikálják a regiszterek eléréséhez szükséges adatokat... Azoknál az alkalmazásoknál, amelyeknél a sebesség elsôdleges szempont, az RxPortIO sajnos nem nagyon jöhet számításba. A REXX réteg közbeiktatása sajnos olyan sokat ront az I/O mûveletek sebességén, hogy az akár 1/10-e is lehet az ugyanazt a mûveletet végzô, C-ben írt programnak. A hátrányok ellenére a legtöbb esetben mégis jól használható ez a bôvítôcsomag, s bizony sok esetben ez lehet az egyetlen szalmaszál, ha a kártyához nem adtak OS/2-es drivert.

A csomagban található DLL-t használat elôtt be kell másolni egy olyan könyvtárba, amely benne van a LIBPATH-ban, s a REXX program elején regisztrálni kell a függvényeket:

CALL RXFuncAdd 'PIOLoadFuncs', 'RXPORTIO', 'PIOLoadFuncs'
CALL PIOLoadFuncs 

A PIOLoadFuncs-on kívül még hét további függvényt rejt az RxPortIO:

Függvény: Funkció:
PIOLoadFuncs Függvények betöltése
PIODropFuncs Függvények kitakarítása a memóriából
PIORead Port olvasása
PIOWrite Port írása
PIODelay Várakozás ms pontossággal
PIOBitPick Bit kiolvasása
PIOBitSet Bit beállítása
PIOBitClear Bit törlése

A csomagban a DLL-en kívül a függvényeket viszonylag részletesen bemutató INF fájl, példaprogram, valamint a vizuális REXX környezetben való használatot demonstráló anyag található.

RxTelnet

A Socket bôvítôcsomag kiegészítéseként lehet felfogni az RxTelnet csomagot, amellyel telnet szekciók kezelése automatizálható REXX-bôl. Bár elvileg a Socket bôvítôcsomag minden olyan elemet tartalmaz, amelyekbôl fel lehet építeni az RxTelnetben felkínált függvények megfelelôit, én még is inkább azt javaslom, hogy elôbb próbáljuk ki ezt a csomagot, ha telnet szekciókkal kell REXX-bôl dolgoznunk. A csomagban nemcsak REXX bôvítôfüggvények, hanem ezek C-bôl is hívható megfelelôje is megtalálható a forráskóddal egyetemben. Mielôtt használni tudnánk a bôvítéseket, be kell másolni az NVT.DLL fájlt (NVT = Network Virtual Terminal, RFC854) a LIBPATH-ba és a REXX program elején megadni a következô sorokat:

Call RxFuncAdd "LoadRtn", "Nvt", "Load_Routine"
Call LoadRtn

A csomag a következô függvényeket tartalmazza a fenti kódrészletben már használt LoadRtn mellett:

Függvény: Funkció:
Telnet Telnet szekció létrehozása
Tget Karakterlánc olvasása a telnet szekcióból
Tput Karakterlánc írása a telnet szekcióba
Tctl Szekcióinformáció lekérdezése vagy out-of-band parancs küldése
Tquit Telnet szekció zárása

A bôvítôkönyvtárakon kívül az RxTelnet tartalmaz még egy rövid, ám elégséges leírást a táblázatban is felsorolt REXX (és C) függvények használatáról, s egy REXX és egy C példaprogramot is.

RxIPC

A klasszikus REXX-rôl szóló tanfolyamban azt állítottuk, hogy a REXX nem, vagy csak igen korlátozott mértékben alkalmas folyamatok közötti kommunikációra (IPC = Inter Process Communications), nem képes szálak kezelésére és a szemaforokat sem ismeri. Ezeken a hiányosságokon segít az RxIPC bôvítôcsomag, amely gyakorlatilag egy-az-egyben lemásolja és REXX-ben elérhetôvé teszi az ezen szolgáltatások használatához szükséges rendszerfüggvényeket. Ez persze azt is jelenti, hogy ennek a csomagnak a használata megköveteli, hogy használója jól ismerje a háttérben meghúzódó rendszerfüggvények mûködését. A szükséges ismeretanyag megtalálható a Developer's Toolkit Control Program Guide and Reference könyvében.

Ha már rendelkezünk a szükséges ismeretekkel, akkor másoljuk be a LIBPATH-ba a mellékelt REXXIPC.DLL-t és adjuk ki REXX programunk elején a következô utasításokat:

Call RxFuncAdd 'IPCLoadFuncs', 'REXXIPC', 'IPCLoadFuncs'
Call IPCLoadFuncs

Figyeljünk arra, hogy a kis és nagybetûk közötti különbségeket megtartsuk, mivel ez a bôvítôkönyvtár erre érzékeny.

A RxIPC-ben nagy sok függvény található, így ezeket nem soroljuk fel mindet, csak megnevezzük azt a négy függvénycsoportot, amelyek valamelyikébe minden függvény besorolható. Az elsô csoportba tartoznak az IPC bôvítôfüggvényeket részben, vagy teljesen regisztráló, illetve eltávolító függvények. Az IPCLoadFunc minden egyes bôvítôfüggvényt betölt, ezért ha csak nem akarunk nagyon takarékoskodni a memóriával, akkor érdemes ezt használni. A második csoportba tartoznak a csatornák (pipe) használatát lehetôvé tevô függvények (PipeCreate, PipeConnect, PipeWrite, stb.). A harmadik csoportba a folyamatokat (ProcCreateThread, ProcSetThreadPriority, ProcSendSignal, stb.), a negyedikbe pedig a szemaforokat (SemEventCreate, SemMutexCreate, SemStartTimer, stb.) manipuláló függvények tartoznak. Példaképpen tekintsünk meg egy programot, amely átállítja a saját maga futási prioritását:

/* REXX program prioritásának állítása */

/* A segédfüggvények betöltése */
Call RxFuncAdd 'IPCLoadFuncs', 'REXXIPC', 'IPCLoadFuncs'
Call IPCLoadFuncs
Say IPCVersion()

/* Az új prioritási paraméterek bekérése */
Say 'Adja meg az osztályt! (Idle/Regular/Server/Critical)'
Parse Pull class
IF class <> 'Idle' & class <> 'Regular' & class <> 'Server' & class <> 'Critical' THEN
	DO
		Say 'Érvénytelen osztály!'
		EXIT 1 
	END

Say 'Adja meg a deltát (0-31)!'
Parse Pull delta
IF delta < 0 | delta > 31 THEN
	DO
		Say 'Érvénytelen delta!'
		EXIT 1
	END

/* A prioritás átállítása */
Call ProcSetPriority 0, class, delta
IF result <> 0 THEN
	DO
		Say 'A mûvelet nem sikerült!' result
		EXIT 2
	END
ELSE
		Say 'A mûvelet sikerült!'

EXIT

Az RxIPC nagyon részletes, a visszatérési értékek kivételével szinte minden részletre kiterjedô INF fájlt is tartalmaz. A visszatérési értékek és a függvények mûködésének valamint használatának még részletesebb leírása megtalálható a már említett Control Program Guide and Reference könyvben.

RxAsync

A soros portok kezelésére alkalmas az RxAsync bôvítôcsomag. Ez szintén egy olyan terület, amelyre nem lehet klasszikus REXX-bôl bôvítômodulok nélkül betörni. Az RxAsync gyakorlatilag az összes OS/2-es soros kommunikációt elôsegítô függvényt elérhetôvé teszi a REXX programok számára. Sajnos a csomagból kimaradt a dokumentáció. Jobban mondva a dokumentáció a bôvítô DLL mellékelt forráskódjában található, és innen kell kiolvasni a függvények használatának módját. Szerencsére a szerzô mellékelt több példaprogramot is, így egy kis REXX és C gyakorlattal elég jól el lehet boldogulni. A betöltést a következô kódrészlettel kell elvégezni:

Call RxFuncAdd 'RxAsyncLoadFuncs', 'RXASYNC', 'RxAsyncLoadFuncs'
Call RxAsyncLoadFuncs

Az RxAsync20 a következô bôvítôfüggvényeket tartalmazza:

Függvény: Funkció:
RxAsyncDropFuncs Bôvítôfüggvények kitakarítása
RxAsyncLoadFuncs bôvítôfüggvények betöltése
RxAsyncPriority A folyamat prioritásának beállítása
RxAsyncSleep Várakozás
RxAsyncGetDcbInfo A kontroll blokk információ lekérdezése
RxAsyncSetDcbInfo A kontroll blokk információ beállítása
RxAsyncGetEnhParm Kiolvassa a kiterjesztett paramétereket
RxAsyncSetEnhParm Beállítja a kiterjesztett paramétereket
RxAsyncGetLnCtrl Kiolvassa a com port paramétereit
RxAsyncSetLnCtrl Beállítja a com port paramétereit
RxAsyncSetBreakOff Kikapcsolja a break-et
RxAsyncSetBreakOn Bekapcsolja a break-et
RxAsyncTxImmediate Azonnal továbbítja a bájtot
RxAsyncTxStop Leállítja a transzfert (a'la XOFF)
RxAsyncTxStart Elindítja a transzfert (a'la XON)
RxAsyncGetComStatus Lekérdezi a com port státuszát
RxAsyncGetTxStatus Lekérdezi az adatforgalom státuszát
RxAsyncGetMdmOutput Lekérdezi a modem output jeleit
RxAsyncGetMdmInput Lekérdezi a modem input jeleit
RxAsyncSetMdmOutput Beállítja a modem output jeleit
RxAsyncGetRxCount Lekérdezi az RX sorban várakozó karakterek számát és méretét
RxAsyncGetTxCount Lekérdezi az TX sorban várakozó karakterek számát és méretét
RxAsyncGetComError Lekérdezi a com hibaüzenetet
RxAsyncGetComEvent Lekérdezi a com eseményüzenetet
RxAsyncOpen Megnyitja a com portot
RxAsyncClose Lezárja a com portot
RxAsyncWait Inputra vár
RxAsyncWatch Vár egy adott sztring beérkezésére
RxAsyncRead Adatot olvas és várakozik
RxAsyncWrite Adatot ír a com portra
RxAsyncCarrier Teszteli/Várakozik a Data Carrier Detect (DCD) jelet/jelre
RxAsyncBreak Break-et küld
RxAsyncDcbInfo Kinyomtatja a kontroll blokk információt
RxAsyncActive Teszteli az aktív modem jelet
RxAsyncRaise Kiadja a megadott modem jelet
RxAsyncLower Leveszi a megadott modem jelet
RxAsyncFileExists Fájl meglétét ellenôrzi
RxAsyncFileDelete Fájlt töröl
RxAsyncFileCopy Fájlt másol
RxAsyncFileMove Fájlt mozgat
RxAsyncFileRename Fájlt nevez át
RxAsyncFileNameIs Lekérdezi a fájl nevét
RxAsyncFilePathIs Lekérdezi a fájl elérési útvonalát
RxAsyncDirectory Lekérdezi/Beállítja az elérési utat
RxAsyncPrint Kinyomtatja a sztringet a standard outputon
RxAsyncMsgBox Grafikus üzenetablakot jelenít meg

RexxLib

Az elôzô bôvítôcsomagokkal ellentétben fizetni kell az RexxLib csomagért, amelyet a Quercus Systems terjeszt shareware alkalmazásként. Szerencsére bárki letöltheti és kipróbálhatja a több mint 150 függvényt tartalmazó RexxLib-et, mivel az interneten található verzió semmilyen módon sem limitált.

A használathoz be kell másolni a zip fájlban található REXXLIB.DLL és RXWIN30.DLL fájlokat a LIBPATH-ba és ki kell adni a REXX program elején a következô parancsokat:

Call RxFuncAdd 'rexxlibregister', 'rexxlib', 'rexxlibregister'
Call rexxlibregister
Call RxFuncAdd 'w_register', 'rxwin30', 'rxwindow'
Call w_register

Ezen csomag esetében is lényeges helyenként a kis és nagybetûk közötti különbség, ezért a legegyszerûbb, ha egy az egyben átvesszük a fenti kódrészletet. A dokumentáció két INF fájlból áll, amelyek igen jó leírást adnak a függvényekrôl. Természetesen meg sem kíséreljük, hogy itt felsoroljuk ezeket a függvényeket. Ízelítônek azért elárulunk annyit, hogy a REXXLIB.DLL többek között függvényeket tartalmaz az összetett változók még sokoldalúbb felhasználására, a REXX dátumformátumok konverziójára, CRC értékek meghatározására, csatornák (pipes) elérésére és bonyolult matematikai mûveletek elvégzésére. Az RXWINDOW.DLL függvényei segítségével a REXX programok könnyen és gyorsan elláthatók szöveges módú felhasználói felülettel. Az INF fájlok és DLL-ek mellett a RexxLib nagyon sok példaprogramot is tartalmaz, ezért használata viszonylag könnyen és gyorsan elsajátítható.

FileRexx

A FileRexx bôvítôcsomag olyan függvényeket bocsát a felhasználó rendelkezésére, amelyekkel a bináris fájlok kezelését lehet könnyen elvégezni. A klasszikus REXX ezen a területen sem nyújt kimagasló lehetôségeket, így a programot biztosan sokan hasznosnak fogják találni. A bináris fájlkezelésen kívül a FileRexx I/O függvényeket is tartalmaz, valamint lehetôvé teszi fájlok megosztott használatát. A bôvítô DLL megfelelô elhelyezése után a függvényeket az alábbi kódrészlettel lehet regisztrálni:

CALL RxFuncAdd 'FileLoadFuncs', 'FILEREXX', 'FileLoadFuncs'
CALL FileLoadFuncs

Ez a csomag a következô függvényeket tartalmazza:

Függvény: Funkció:
FileAddFuncs A bôvítôfüggvények regisztrálása
FileDropFuncs A bôvítôfüggvények kitakarítása
FileOpen Fájl megnyitása
FileClose Fájl lezárása
FileRead Fájl olvasása
FileGets Sor beolvasása
FileReadValue Megadott bájtok beolvasása
FileReadBlock Blokkonkénti beolvasás
FileWrite Fájlba írás
FilePuts Egy sor kiírása
FileWriteValue Megadott bájtok kiírása
FileSeek Fájlon belüli pozícionálása
FileDevIOCtl Eszköz mûködési paramétereinek beállítása
FileGetInfo Fájlinformáció lekérdezése
FileDeleteFile Fájl törlése
FileMoveFile Fájl átnevezése
FileCopyFile Fájl másolása
FileMkDir Könyvtár készítése
FileRmDir Könyvtár törlése
FileMatchFile Fájl keresése
FileSearchPath Fájl keresése megadott könyvtárban
FileDriveMap Kilistázza a meghajtókat
FileDriveInfo Információt ad a megadott eszközrôl
FileGetPath Megadja a fájl elérési útvonalának komponenseit
FileEditName Fájl nevének átalakítása
FileSysInfo Operációs rendszer információ lekérdezése
FileIterateExe Exe ismételt meghívása
FileBit Bináris mûvelet végzése
FileDoSleep Várakozás

A függvények használatának módjáról további információt a zip fájlban található INF fájlban lehet találni. Jó néhány példaprogramot is mellékelt a szerzô, így ennek a csomagnak az elsajátítása is viszonylag egyszerû.

RexxGDB2

Nagyon jól kiegészíti a DB2/2 beépített REXX támogatását a RexxGDB2 csomag, amely többek között lehetôvé teszi a statikus (gyors) SQL parancsok végrehajtását és az SQL parancsok eredményének HTML-be foglalását.

Mielôtt a függvényeket használatba vehetnénk, el kell készíteni a megfelelô package-eket a zip fájlban található BindGDB2.CMD RexxGDB2.BND jelenlétében történô lefuttatásával. Ezután már nincs más hátra, mint bemásolni a REXXGDB2.DLL-t, és a REXX program elején kiadni a következô parancsokat:

Call RxFuncAdd 'g2LoadFuncs', 'REXXGDB2', 'g2LoadFuncs'
Call g2LoadFuncs

A RexxGDB2 nagyon sok bôvítôfüggvényt tartalmaz, így arra nincs lehetôség, hogy mindet felsoroljuk ebben a leckében. Aki további információra vágyik, az megtalálhatja azt a zip fájlban mellékelt INF formátumú dokumentációban. A csomag sok példaprogramot is tartalmaz, s a szerzô különösen nagy hangsúlyt fektetett a HTML oldalakat generáló függvények használatára, amelyek segítségével összeházasítható a gépen található DB2 adatbázis és web-kiszolgáló (Goserv).

 

REXX GYÍK:

K1. Az elôzô leckékben található példaprogramok bôvítômoduljai mind sikeresen betöltôdnek, az itt bemutatottak viszont nem. Miért?
V1. Az elôzô leckékben egy-két kivételtôl eltekintve IBM-es termékek REXX interfészérôl volt szó, amelyek DLL-je automatikusan olyan könyvtárba került a termék telepítésekor, amely benne van a config.sys LIBPATH sorában. Az itt felsorolt termékek azonban nem rendelkeznek telepítôprogrammal, így nekünk kell gondoskodni a kiegészítô függvényeket tartalmazó DLL-ek megfelelô könyvtárba történô bemásolásról.

K2. Honnan lehet további bôvítôcsomagokat beszerezni?
V2. Nagyon sok bôvítâcsomag található a hobbes.nmsu.edu kiszolgáló /pub/os2/dev/rexx könyvtárában.

 

Gyakorlatok:

1. Alakítsa át a leckében található példaprogramot oly módon, hogy az megadott ideig mind a négy prioritásosztályt beállítsa! Futtassa a programot és jegyezze fel, hogy az egyes prioritási osztályok esetében tudja-e használni a gépet más feladatok végrehajtására is!

Kádár Zsolt
1999. 06. 20.