ARexx III.Jan Petkov
Konec pusté teorie, nastal čas programování, zkoušení a bezesných nocí.
Připravili jsme si pro vás malou, ale velmi užitečnou ukázku využití AREXXu v
praxi. Minule jsme si řekli, že tento programovací jazyk slouží ke komunikaci mezi
programy V širším slova smyslu však má AREXX ve své moci jakoukoli aplikaci v
systému, která je autorem vybavena AREXX portem. Dnešní příklad nám poslouží
jako ukázka komunikace mezi uživatelem a archivačními utilitami.
Každý programátor trpí chorobnou touhou optimalizovat vše co mu přijde pod ruku.
Jeho ego nemilosrdně drásá pomyšlení na to, že někde běží něco, co může být
ještě rychlejší nebo, že někde spatřil věc, která je na daném místě úplně
zbytečná. Možná i vás už napadlo proč si pamatovat syntaxi celé škály různých
archivačních utilit jenom proto, že chcete vybalit pár souborů nebo proto, že
váš známý používá staré LHA, když LZX je přece mnohem lepší.
Zkusme si napsat, pokud to dokážeme, krátký program v AREXXu, který za nás
vyřeší všechny tyto trable. Nazveme jej příhodně „ROZBAL“ a bude nám rozbalovat
všechny možné archívy do zadaného adresáře. Jako parametry si vezme jméno
archívu včetně koncovky a jméno cílového adresáře, to vše z příkazové řádky. Začínáme
Každý program v AREXXu začíná poznámkou, my toho využijeme k tomu, abychom
si zde uchovali stručnou informaci o celém programu. /*
Jméno: ROZBAL
Účel: Program pro extrahování souborů z různých typů archívů.
Vstup: <archiv + koncovka> [Cílový adresář]
Popis: Podle třípísmenné koncovky se identifikuje použitá archivační utilita a
všechny extrahované soubory se uloží do cílového adresáře, jehož zadáni je
nepovinné.
*/ Nejdříve je třeba přečíst parametry z příkazové řádky. Celý program můžeme
chápat jako jednu velkou proceduru, takže stačí na začátek doplnit následující
příkaz: /* přečti příkazovou řádku */
ARG soubor adresar Dejme tomu, že si celý program uložíme pod jménem „REXX:Rozbal.rexx“ a chceme
rozbalit archív „ARCHIV.LHA“ do adresáře „RAM:T/“. Pak tuto akci provedeme
voláním „RX ROZBAL ARCHIV.LHA RAM:T/“. Nebudeme stavět nekorektní programy a
přidržíme se konvence stanovené tvůrci Amiga Dosu, proto jako odpověď na
parametr „?“ vybídneme uživatele k dodatečnému zadání parametrů: /* odpověď na parametr „?“ */
IF soubor = „?“ THEN
DO
OPTIONS PROMPT „SOUBOR/A, CILOVY ADRESAR/F:“
PULL soubor adresar
END Příkaz OPTIONS slouží ke změně vnitřních proměnných Arexxu, v našem případě
„OPTIONS PROMPT...“ změní hlášku, která se vypíše při každém zadávání parametrů
přes „PULL“.
Jednou jsme se dali cestou správné konvence, nezbude nám nic jiného než vytrvat.
Pokud je příkaz ADosu spuštěn bez parametrů, pak obvykle vypíše hlášku jak jej
správně používat (případně se zde autor pochlubí svým životopisem): /* hláška o správném použití programu */
IF soubor = „“ THEN
DO
SAY „Pouziti:“
SAY „ Rozbal <Soubor> [CilovyAdresar]“
SAY „<Soubor> musí koncil platnou koncovkou“
SAY „(.LHA, .LZH, .LZX, .RAR nebo .ARJ)“
EXIT
END Nestačí jen přečíst parametry správně, ale musíme přečíst i správné
parametry. Proto do skriptu zahrneme malý test na to, jestli se nám uživatel
nesnaží podvrhnout falešné jméno archivu: /* existuje vůbec takový archiv? */
IF ~EXISTS(soubor) THEN
DO
SAY „Soubor “ „soubor“ „ nebyl nalezen.“
EXIT
END Postupně jsme se prokousali byrokracií vstupních testů a konečně začíná
pořádná práce. Nejdříve si utrhneme ze vstupního jména archívu jeho třípísmennou
koncovku: /* vezmi si koncovku archivu */
koncovka = UPPER(RIGHT(soubor,3)) Funkce „RIGHT“ vrací 3 znaky z řetězce „soubor“ a to od konce (tedy zprava).
A pro pořádek si výstup převedeme na velká písmena pomocí „UPPER“. Jistě vás
napadlo, že inverzní funkce k „RIGHT“ nese označení „LEFT“, a že opačná funkce k
„UPPER“ se nazývá ... prostě neexistuje. AREXX je v řetězcových funkcích zkrátka
nedostižný.
Protože naše archivační utility AREXX nezná, budeme se na ně muset odkázat
externě. Pokud není příkaz rozpoznán jako interní, je poslán externí aplikaci.
Právě tímto způsobem komunikuje AREXX se svým okolím. Připojení k vnější
aplikaci se provádí přes příkaz „ADDRESS <adresa>“, který má jako parametr
adresu externího programu (tu najdete v dokumentaci příslušné aplikace). Pokud
za adresu dosadíme klíčové slovo „COMMAND“ budou všechny externí příkazy
vykonávány jako programy volané z klasického SHELLu a to právě chceme: /* přepni se do SHELL módu */
ADDRESS COMMAND A blíží se finále. Podle koncovky si vybereme příslušný archivační utilitu a
všechny soubory vybalíme do cílového adresáře. /* podle koncovky vyber a rozbal */
SELECT
WHEN koncovka = „LZH“ | koncovka = „LHA“ THEN
„LHA -X X“ soubor „#?“ adresar
WHEN koncovka = „LZX“ THEN
„LZX -X X“ soubor „#?“ adresar
WHEN koncovka = „RAR“ THEN
CALL ZmenaAdresare(„UNRAR X“ soubor „#?“)
WHEN koncovka = „ARJ“ THEN
CALL ZmenaAdresare(„UNARJ X“ soubor) OTHERWISE
SAY „Archiv “ „soubor“ „nebyl rozpoznán.“
SAY „Musí končit na „LZH“, „LHA“, „LZX“, „RAR“ nebo „ARJ“.“
EXIT
END
EXIT
/* konec programu */ Tady vás možná trochu zaskočily řádky volající externí utility. „LHA -X X“
soubor „#?“ adresar“ je pro neotrlého programátora možná trochu velké sousto.
Vše si přiblížíme na ukázkovém příkladě. Dejme tomu, že jsme zadali jako soubor
„ARCHIV.LHA“ a adresář „RAM:T/“. Pak se řádek
„LHA -X X“ ,soubor „#?“ adresar
rozepíše do
„LHA -X X ARCHIV.LHA #? RAM: T/“
Celý řádek je identifikován jako externí příkaz a je předán ADosu jako
standardní SHELL příkaz.
Proč u „LHA“ a „LZX“ voláme přímo externí příkaz a u „RAR“ a „ARJ“ si pomáháme
přes funkci „ZmenaAdresare“? Je to dáno pouze tím, že nedokonalé rozbalovače
„UnRAR“ a „UnARJ“ nedovolují nastavovat cílový adresář, proto musíme nejdříve
změnit aktuální adresář na cílový (obdoba klasického commandu „CD“), pak archív
rozbalíme a ze slušnosti se přepneme zpět na původní adresář. Blíže už výpis
funkce: /* Fce: Rozbalení s použitím „CD“ */
ZmenaAdresare:
PARSE ARC rozbal_tool
stary_adresar = PRAGMA(„DIRECTORY“)
CALL PRAGMA(„DIRECTORY“, adresar)
rozbal_tool
CALL PRAGMA(„D“,stary_adresar)
RETURN Jako vstupní parametr si funkce vyžádá řetězec, který odpovídá volání externí
archivační utility i s parametry. Pro změnu adresáře použijeme interní fci
„PRAGMA“ a klíčové slovo „DIRECTORY“ (zkráceně jen „D“).
Kompletní výpis programu včetně textu tohoto článku naleznete na APD disku,
který vychází s tímto číslem AR. Příště pokračujeme. AREXXu zdar. Vytlačiť článok
Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.
Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing
none
|