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

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ó:
PIOLoadFuncsFüggvények betöltése
PIODropFuncsFüggvények kitakarítása a memóriából
PIOReadPort olvasása
PIOWritePort írása
PIODelayVárakozás ms pontossággal
PIOBitPickBit kiolvasása
PIOBitSetBit beállítása
PIOBitClearBit 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ó:
TelnetTelnet szekció létrehozása
TgetKarakterlánc olvasása a telnet szekcióból
TputKarakterlánc írása a telnet szekcióba
TctlSzekcióinformáció lekérdezése vagy out-of-band parancs küldése
TquitTelnet 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ó:
RxAsyncDropFuncsBôvítôfüggvények kitakarítása
RxAsyncLoadFuncsbôvítôfüggvények betöltése
RxAsyncPriorityA folyamat prioritásának beállítása
RxAsyncSleepVárakozás
RxAsyncGetDcbInfoA kontroll blokk információ lekérdezése
RxAsyncSetDcbInfoA kontroll blokk információ beállítása
RxAsyncGetEnhParmKiolvassa a kiterjesztett paramétereket
RxAsyncSetEnhParmBeállítja a kiterjesztett paramétereket
RxAsyncGetLnCtrlKiolvassa a com port paramétereit
RxAsyncSetLnCtrlBeállítja a com port paramétereit
RxAsyncSetBreakOffKikapcsolja a break-et
RxAsyncSetBreakOnBekapcsolja a break-et
RxAsyncTxImmediateAzonnal továbbítja a bájtot
RxAsyncTxStopLeállítja a transzfert (a'la XOFF)
RxAsyncTxStartElindítja a transzfert (a'la XON)
RxAsyncGetComStatusLekérdezi a com port státuszát
RxAsyncGetTxStatusLekérdezi az adatforgalom státuszát
RxAsyncGetMdmOutputLekérdezi a modem output jeleit
RxAsyncGetMdmInputLekérdezi a modem input jeleit
RxAsyncSetMdmOutputBeállítja a modem output jeleit
RxAsyncGetRxCountLekérdezi az RX sorban várakozó karakterek számát és méretét
RxAsyncGetTxCountLekérdezi az TX sorban várakozó karakterek számát és méretét
RxAsyncGetComErrorLekérdezi a com hibaüzenetet
RxAsyncGetComEventLekérdezi a com eseményüzenetet
RxAsyncOpenMegnyitja a com portot
RxAsyncCloseLezárja a com portot
RxAsyncWaitInputra vár
RxAsyncWatchVár egy adott sztring beérkezésére
RxAsyncReadAdatot olvas és várakozik
RxAsyncWriteAdatot ír a com portra
RxAsyncCarrierTeszteli/Várakozik a Data Carrier Detect (DCD) jelet/jelre
RxAsyncBreakBreak-et küld
RxAsyncDcbInfoKinyomtatja a kontroll blokk információt
RxAsyncActiveTeszteli az aktív modem jelet
RxAsyncRaiseKiadja a megadott modem jelet
RxAsyncLowerLeveszi a megadott modem jelet
RxAsyncFileExistsFájl meglétét ellenôrzi
RxAsyncFileDeleteFájlt töröl
RxAsyncFileCopyFájlt másol
RxAsyncFileMoveFájlt mozgat
RxAsyncFileRenameFájlt nevez át
RxAsyncFileNameIsLekérdezi a fájl nevét
RxAsyncFilePathIsLekérdezi a fájl elérési útvonalát
RxAsyncDirectoryLekérdezi/Beállítja az elérési utat
RxAsyncPrintKinyomtatja a sztringet a standard outputon
RxAsyncMsgBoxGrafikus ü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ó:
FileAddFuncsA bôvítôfüggvények regisztrálása
FileDropFuncsA bôvítôfüggvények kitakarítása
FileOpenFájl megnyitása
FileCloseFájl lezárása
FileReadFájl olvasása
FileGetsSor beolvasása
FileReadValueMegadott bájtok beolvasása
FileReadBlockBlokkonkénti beolvasás
FileWriteFájlba írás
FilePutsEgy sor kiírása
FileWriteValueMegadott bájtok kiírása
FileSeekFájlon belüli pozícionálása
FileDevIOCtlEszköz mûködési paramétereinek beállítása
FileGetInfoFájlinformáció lekérdezése
FileDeleteFileFájl törlése
FileMoveFileFájl átnevezése
FileCopyFileFájl másolása
FileMkDirKönyvtár készítése
FileRmDirKönyvtár törlése
FileMatchFileFájl keresése
FileSearchPathFájl keresése megadott könyvtárban
FileDriveMapKilistázza a meghajtókat
FileDriveInfoInformációt ad a megadott eszközrôl
FileGetPathMegadja a fájl elérési útvonalának komponenseit
FileEditNameFájl nevének átalakítása
FileSysInfoOperációs rendszer információ lekérdezése
FileIterateExeExe ismételt meghívása
FileBitBináris mûvelet végzése
FileDoSleepVá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.
[ Elôzô lecke | Következô lecke | Tartalom ]