AMIGA REVIEW obsah časopisu online!
  Domov     Software     Hry     Obaly     Download  

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

AMIGA REVIEW

57 ( 11-12 / 2000 )
56 ( 9-10 / 2000 )
55 ( 7-8 / 2000 )
54 ( 5-6 / 2000 )
53 ( 3-4 / 2000 )
52 ( 1-2 / 2000 )
 
51 ( 12 / 1999 )
50 ( 11 / 1999 )
49 ( 10 / 1999 )
48 ( 9 / 1999 )
46-47 ( 7-8 / 1999 )
45 ( 6 / 1999 )
44 ( 5 / 1999 )
43 ( 4 / 1999 )
42 ( 3 / 1999 )
41 ( 2 / 1999 )
40 ( 1 / 1999 )
 
39 ( 12 / 1998 )
38 ( 11 / 1998 )
37 ( 10 / 1998 )
36 ( 9 / 1998 )
35 ( x / 1998 )
34 ( x / 1998 )
33 ( 1-2 / 1998 )
 
32 ( 11-12 / 1997 )
31 ( 9-10 / 1997 )
30 ( 7-8 / 1997 )
29 ( 6 / 1997 )
28 ( 5 / 1997 )
27 ( 4 / 1997 )
26 ( 3 / 1997 )
25 ( 2 / 1997 )
24 ( 1 / 1997 )
 
23 ( 12 / 1996 )
22 ( 11 / 1996 )
21 ( 10 / 1996 )
20 ( 9 / 1996 )
18-19 ( 7-8 / 1996 )
17 ( 6 / 1996 )
16 ( 5 / 1996 )
15 ( 4 / 1996 )
14 ( 3 / 1996 )
13 ( 2 / 1996 )
12 ( 1 / 1996 )
 
11 ( 12 / 1995 )
10 ( 11 / 1995 )
9 ( 10 / 1995 )
8 ( 9 / 1995 )
7 ( 7 / 1995 )
6 ( 5 / 1995 )

ATLANTIDA NEWS

5 ( 3 / 1995 )
4 ( 1 / 1995 )
 
3 ( 11 / 1994 )
2 ( 9 / 1994 )
1 ( 7 / 1994 )
0 ( 5 / 1994 )