ARexx IVJan 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
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
|