AMIGA REVIEW online
  Uvodná stránka     Software     Hry     Obaly     Download     Amiga na PC     Amiga Forever  

ARexx IV

Jan Petkov

Dnešní díl povídání o Arexxu bude určen především obci programátorské a všem spřízněným duším. Nejdříve si ovšem dovolíme vsunout malý odstaveček, který osloví všechny z nás, kteří jsme při listování minulým číslem našeho časopisu nepřeskočili článek „Arexx III“.

Posledně jsme si vytvořili prográmek, pomocí kterého bylo možno rozbalit různé typy archívů. Tedy celkem užitečná utilitka pro všechny lenivější, a že je nás většina. Malou vadu na kráse by Šťoura Štouralovič našel i tady. Volání programu mělo následující tvar RX Rozbal.rexx <archív> <cílový adresář>. Uživatele tak komfortního systému jakým ADos bezesporu je nepotěší a už vůbec nezajímá, že daná utilitka je napsána v Arexxu a tudíž je nutno ji spouštět pomocí RX, o dotěrné koncovce .rexx ani nemluvě. Předpokládáme, že maximum co je uživatel ADosu ochoten udělat pro Arexx je přesunutí ikony RexxMast do adresáře WBstartup. Nebyl by to ovšem ADos, kdyby tu neexistovalo elegantní řešení. Vytvořme si soubor, který obsahuje následující řádky:

.key soubor, adresar rx rozbal.rexx <soubor> <adresar>

Soubor uložte pod jménem Rozbal třeba do adresáře C: a nastavte S protect bit (protect C:Rozbal ADD S). Amiga Dos totiž umožňuje předat scriptovým souborům i parametry z příkazové řádky (viz .key). Zápis RX Rozbal.rexx <archív> <cílový adresář> se sympaticky zkrátil na Rozbal <archív> <cílový adresář>. Tolik úvodem.
V předchozích exemplářích Amiga Review jsem si přečetl několik oslavných ód na textový editor GoldED. Nedalo mi to, abych po svých zkušenostech s GEDem taky jednu nepřidal. Dnešní článek je určen lidem programátorského ducha, kterým slova assembler a céčko nenahánějí husí kůži.
Mimo všech ostatních vymožeností oplývá GED jednou pro nás velmi zajímavou, má Arexx port. A nestačí, že jej vlastní, on s ním i komunikuje! Ne nechci tady snižovat důležitost žádné instance, ale po mých zkušenostech to není vlastnost až tak úplně běžná. A nejen že GED se svým Arexx portem komunikuje, překvapí nás i slušná podpora Arexxovských maker. GoldEd má totiž vše nač si vzpomenete a co nemá, to si dopíšete v Arexxu.
Od té doby co jsem se sžil s GoldEDem používám i starý dobrý AsmOne jen jako pouhý překladač a občas jako debugger. Když pracujete s GEDem, tak debugger už tolik nepotřebujete. Každá nová karosérie ovšem potřebuje vyleštit. Představíme vám arexxovská makra, která programátorské soužití s GoldEDem ulehčí. Všechny makra GoldEdu mají víceméně standardní hlavičku a patičku:

/* $VER: x, y, © 1996 */
OPTIONS RESULTS /* enable return codes */
/* not started by GoldEd ? */
if (LEFT(ADDRESS(), 6) ~= „GOLDED“) then address GOLDED.1
LOCK CURRENT /* lock GUI, gain access */
OPTIONS FAILAT 6 /* ignore warnings */
SIGNAL ON SYNTAX /* ensure clean exit */
/*--- Konec hlavičky: Zde začíná vlastní makro ---*/
...
/*--- Konec makra: Začátek paličky -----------------*/
UNLOCK /* VERY important: unlock GUI */
EXIT
SYNTAX:
SAY „Sorry, error line“ SIGL „:“
ERRORTEXT(RC) „:-(„
UNLOCK
EXIT

Samotné makro budeme psát, jak už komentáře napovídají, mezi hlavičku a patičku. To platí o všech příkladech, jenž budou následovat.
Při přechodu od AsmOne vám nejspíš bude chybět užitečná funkce, která zakomentuje příslušný blok (tzn. že na začátek každého řádku bloku umístí znak ;). Makro v GEDu vypadá následovně:

/* ------------------------- */
PING SLOT 9
GOTO BFIRST
if (RC = 0) then
DO
QUERYBLOCKB VAR=BLOCKENDLINE
MODE INSERT TRUE
DO UNTIL currentline > blockendline
FIRST
TEXT T=;
DOWN
QUERYLINE VAR=CURRENTLINE
END
PONG SLOT 9
END
/* ----------------------------- */

Náš kurz není jen sbírkou užitečných příkladů, chceme se naučit Arexx chápat a ovládat. K tomu je ovšem nejschůdnější cesta pochopit a napodobit cizí (tzn. funkční) programy. Proto si teď přiblížíme funkci makra. Z hlavičky, která je uvedena výše bychom vyčetli, že aktuální adresa je GOLDED.x, kde `x je číslo podprocesu. To znamená, že každý nearexxovský příkaz bude zaslán GoldEdu (všechny vnitřní příkazy GEDu najdete v helpu). Pokud bude příkaz nesrozumitelný i pro GED, pak bude vypsána chybová hláška a makro se zastaví. Odchycení chybného příkazu zajišťuje řádek SIGNAL ON SYNTAX z hlavičky a funkce SYNTAX definovaná v pacičce. Samotné tělo makra provádí tuto činnost:
PING SLOT 9 si zapamatuje aktuální pozici kurzoru. Je to potřeba, jelikož budeme kurzorem pohybovat. Kurzor se po práci vrátí na původní pozici vykonáním předposledního řádku makra PONG SLOT 9. GOTO BFTRST přesune kurzor na začátek označeného bloku. Úspěch každé operace je zaznamenán v návratovém kódu, který je ukládán do proměnné RC. Jestliže nebyl žádný blok označen (RC <> 0), pak nemá smysl něco zakomentovávat, v opačném případě pokračujeme dál. QUERY BLOCKB VAR=BLOCKENDLINE číslo posledního řádku bloku je uloženo do proměnné BLOCKENDLINE. MODE INSERT TRUS pro pořádek se přepneme do módu insert. Nebylo by od nás fér, kdybychom si přepsali několik znaků z našeho bloku. DO UNTIL currentline > blockendline, nenechte se zmýlit tím, že UNTIL je na začátku cyklu, jedná se opravdu o cyklus REPEAT ... UNTIL s podmínkou až na konci cyklu. Nyní nastává samotný proces zakomentování, nejprve přesuneme kurzor na začátek řádku FIRST, vsuneme středník TEXT T=„;“, kurzor posuneme o řádek dolů DOWN a zjistíme si, na kterém řádku právě jsme QUERY LINE VAR=CURRENTLINE. To vše opakujeme až po konec bloku.
Každá seriózní funkce by měla mít i svou inverzní podobu. Tady je makro, které provede „odkomentování“ bloku:

/* -------------------------- */
PING SLOT 9
GOTO BFIRST
if (RC = 0) then
DO
QUERY BLOCKB VAR=BLOCKENDLINE
MODE INSERT TRUE
DO UNTIL currentline > blockendline
FIRST
QUERY CODE VAR=CURRENTCHAR
IF currentchar = C2D(;) THEN
DEL
DOWN
QUERY LINE VAR=CURRENTLINE
END
PONG SLOT 9
END
/* ------------------------------ */

Celý proces probíhá obdobně jako v předešlém programu, rozdíl je pouze v tom, že si v rámci slušnosti prověříme, zda je daný řádek opravdu zakomentovaný (tzn. začíná středníkem). To mají na starosti tyto řádky:

QUERY CODE VAR=CURRENTCHAR
IF currentchar = C2D(;) THEN
DEL

QUERY CODE VAR=CURRENTCHAR uloží ascii kód znaku pod kurzorem do proměnné CURRENTCHAR. Tato proměnná obsahuje opravdu číselnou hodnotu ascii kódu, proto si v podmínce musíme pomoci funkcí C2D(;), která převádí ascii znak na jeho číselný kód. A konečně DEL smaže znak pod kurzorem.
Oddíl pro příznivce assembleru zakončíme krátkým, ale šikovným arexxovským makrem. Zdrojáky psané ve strojáku nepatří k nejkratším, obsahují nesčetně podprogramů, struktur apod. a ještě více odkazů na ně. Nezřídka zapomeneme, co který podprogram dělá, či jak která struktura vypadá a při tom by stačilo krátké oživení. Přizveme si na pomoc Arexx a napíšeme si makro, které provede asi toto: vezme si slovo pod kurzorem, doplní jej dvojtečkou, jelikož by návěští ve standardním assembleru měla dvojtečkou končit a skočí na jeho nejbližší pozici. Zapamatujeme si starou pozici kurzoru pro případ, že bychom se chtěli vrátit zpátky.

Malý příklad:
LEA Data(pc),a0
BSR Funkce
....
Funkce: RTS
Data: DC.B Ahoj!

Najedeme kurzorem na slovo Data v prvním řádku naší ukázky, pak se spuštěním makra rázem ocitneme na posledním řádku Data: DC.B .... Zpět na první řádek se vrátíme třeba kombinací <AMIGA 1>. Samotné makro vypadá následovně:

/* ----------------------------- */
QUERY WORD VAR=CURRENTWORD
currentword = currentword ||:
if (currentword ~= ;) THEN
DO
PING SLOT 1
FIND STRING currentword
END
/* ------------------------------- */

Nic velkého. Příkaz. QUERY WORD VAR=CURRENTWORD předá proměnné CURRENTWORD aktuální slovo pod kurzorem. Pak k němu připojíme ;. Pokud bylo slovo pod kurzorem platné zapamatujeme si starou pozici PING SLOT 1, standardně se vyvolává přes kombinaci kláves <AMIGA 1>. Pomocí FIND STRING currentword skočíme na příslušné návěští. Vřele vám doporučuji zvolit si pro výše uvedená makra horké klávesy, připojíme-li k tomu možnost foldingu, stane se programování v GEDu opravdu příjemným zážitkem.
Pro skalní příznivce véčka a SAS C zvlášť mám dobrou zprávu. GoldED lze přetvořit ve velmi dobré integrované prostředí. Potřebujete k tomu dvě makra od Rolanda Sehwingela (SAS_smake.ged, SAS_scmsg_loadfile.ged), která se starají o to nejdůležitější, překlad a výpis chybových hlášení. K opublikování na tomto místě jsou příliš rozsáhlá, pokud vše dopadne tak jak má, najdete je na novém APD disku spolu s ostatními makry. Práci s makra Rolanda Schwingela si alespoň trochu okomentujeme. K tomu, aby se vám chybové hlášky přesměrovaly do okna GoldEDu je potřeba několik úprav. Nejprve je potřeba v programu scopts pod gadgetem MESSAGE OPTIONS... nastavit ErrorRexx. Uložte jako Save Default. Následovně přenastavíme konfiguraci v Message Browseru. Spusťte SC:C/scmsg/ a zvolte menu položku Project/Set Options. Zde provedeme následující změny, nastavme Hidden, RexxOnly, AutoEdit, do řádků postupně vpisujme, Portname = GOLDED.1, EditCommand = ged %f, GotoFile = rx CMD=„GOLDED:Arexx/SAS_scmsg_loadfile %f %l“, GoToLine zůstane prázdný a PubScreen = GOLDED.1. Vše samozřejmě bez uzavírajících apostrofů. K minimálnímu integrovanému prostředí patří ještě makra, pomocí kterých je možno nastavovat parametry překladu, volat debugger a spouštět samotný přeložený program. Vše se samozřejmě musí odehrávat na obrazovce GEDu, jinak by byla veškerá práce marná. Toho lze dosáhnout dvěma způsoby. Buďto si pomůžeme dodatečnou utilitkou např. MultiCX, jenž umožňuje zvolení aktuální obrazovky jako PubScreenu, anebo si v samotném GoldEDu při konfiguraci menu nebo klávesnice nastavíme gadget Shanghai. Doporučuji alespoň na 2 sekundy. Obě cesty vedou ke stejnému síly. Makro k nastavení parametrů kompilace ani nepotřebujeme, vše je záležitostí konfigurace GEDu, stačí nastavit spuštění externího programu SC:C/scopts.
Volání debuggeru je už věc trošku složitější.

/* ------------------------------ */
QUERY PATH VAR PATH
IF ((RIGHT(path, l) ~= ;)
& (RIGHT(path, 1) ~= /)) THEN
path = path || /
QUERY FILE VAR FILE
DO WHILE (RIGHT(file, 1) ~=.)
file=DELSTR(file,LENGTH(file), 1)
END
file=DELSTR(file,LENGTH(file), l)
ADDRESS COMMAND
PRAGMA(D, path )
SC:C/CPR file
/* ----------------------------- */

Nejdříve si vyžádáme jméno cesty k souboru QUERY PATH VAR PATH a případně ji opatříme ukončujícím lomítkem path = path || /, pokud je to nutné. Na řadu pak přichází jméno souboru, ze kterého je potřeba odvodit název přeloženého programu, to se děje tím, že ukousneme koncovku (.c, .cpp apod.). Následně se připravíme na odstartování samotného debuggeru, přepneme se na adresu cli COMMANDů, nastavíme aktuální cestu PRAGMA(D,path) a spustíme debugger SC:C/CPR file. Bohužel si debugger z prostředí SAS C otevírá svou vlastní obrazovku, takže v tomto případě musíme z ideálního integrovaného prostředí trochu slevit. Pro méně znalé uvádím, že zdrojový text dostaneme do debuggeru nastavením Debug=FULLFLUSH v scopts.
Máme-li vše potřebné přeloženo a odlazeno, nezbývá než výsledek spustit.

/* ------------------------------ */
QUERY PATH VAR PATH
IF ((RIGHT(path, 1) ~= :)
& (RIGHT(path, l) ~= || /)) THEN
path = path || /))
QUERY FILE VAR FILE
DO WHILE (RIGHT(file,1) ~= ,)
file=DELSTR(file, LENGTH(file), 1 )
END
file=DELSTR(file, LENGTH(file),1)
ADDRESS
COMMAND
PRAGMA(D, pach)
file
/* ------------------------------ */

Určitě vám neuniklo, že se jedná až na poslední řádek o shodná makra. Proto se sdržíme zbytečného komentáře. Poslední řádek file se postará o spuštění přeloženého programu.
Pokud vám neuniklo ani písmenko z dnešního článku a nepřeskočili jste předchozí díly, nebude pro vás žádný problém rozepjat svá arexxovská křídla a pustit se do poznávání vlastních neprobádaných krajů. Což si například naprogramovat makra, která nakomentují části céčkovského zdrojáku? Že by to bylo zase až tak jednoduché? Tomu nevěřte.

Vytlačiť článok


© ATLANTIDA Publishing Všechna práva vyhrazena.
Žádna část nesmí být reprodukována nebo jinak šířena bez písemného svolení vydavatele.



Amiga na Vašem PC rychle, snadno a zdarma!


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 )