Programátorské rozhraní v CeduPetr Mareš
Dneska potěším vás, kteří si občas sednete k Cygnus Editoru a napíšete nějaký
ten script, amigaguide dokument, nebo třeba něco naprogramujete. Dozvíte se
totiž, jak svůj výtvor jednou klávesou spustit, zkompilovat, nebo prohlédnout. To se hodí, ne? Většina programovacích jazyků má sice svůj vlastní editor,
ale co se týče třeba ARexxu, nebo Amigaguide dokumentů, těžko byste takové
hledali. Takže vám jeden exemplář takového spouštěče-ukazovače předvedu, jak
jinak, než v ARexxu. Pracovně ho nazývejme „Runner“. Aby toho nebylo moc
najednou, uvedu na začátek jen jakousi kostru. /* $VER:Runner.rexx 1.0
*/
OPTIONS RESULTS
OPTIONS FAILAT 21
ADDRESS rexx ced
STATUS 18
IF RESULT ~= 0 THEN Save
STATUS 21
file = RESULT
STATUS 20
dir = RESULT
STATUS 19
path = RESULT
IF RIGHT(file,6) = .guide THEN
DO
Shell command MultiView >NIL: „ || path || „
EXIT
END
IF RIGHT(file,5) = .rexx THEN
DO
Shell command RX >CON:/50//200/ARexx/WAIT/CLOSE /AUTO path
EXIT
END
/* Tady můžete testovat jiné přípony a podle toho se souborem naložit */
OPEN(F,T:Com-00,WRITE)
WriteLN(F,Echo „*ec“ NOLINE)
WriteLN(F,Execute S:Shell-Startup)
WriteLN(F,CD „ (|| dir || „)
WriteLN(F,Execute „ || file || „)
CLOSE(F)
Shell Command NewShell FROM T:Com-00 CON:/50//200/Amigados/CLOSE
EXIT Než jsem si zvykl na to, že na začátku každého ARexxovského scriptu musí být
komentář, udivovala mne vždy při pokusu o spuštění nesmyslná hláška, že program
nebyl nalezen. Jinak do svých scriptů komentáře nepíšu, bylo-li obtížné program
napsat, musí být obtížné ho taky přečíst... Ale speciálně pro vás ten svůj
program okomentuji. První řádek, který stojí za zmínku je STATUS 18. Ten z
CEdu vymámí informaci o tom, kolik bylo v aktuálním souboru provedeno změn.
Pokud se dozvíme, že k nějakým změnám došlo (proměnná RESULT nebude nulová),
soubor uložíme. Na následujících šesti řádcích zjistíme jméno aktivního souboru,
jeho adresář a kompletní cestu k němu, bude se nám to hodit. Ted přichází to
nejdůležitější, vlastni prohlížení. Pokud má aktivní soubor příponu „.guide“,
pustíme na něj MultiView (první podmínka IF) a skončíme, jestliže je přípona
„.rexx“, spustíme script jako ARexx script. Pokud nerozpoznáme žádnou příponu,
zkusíme pustit soubor jako AmigaDOS script. Správně zkonstruovat příkaz pro
prohlédnutí díla někdy vyžaduje trochu umu. V případě ARexxu stačí jen
přesměrovat výstup příkazu „RX soubor.rexx“ do okna s atributem „AUTO“ (okno se
otevře jen když do něj bude chtít ARexx něco napsat). O něco těžší je to v
případě Shellovského scriptu. Nepodařilo se mi zjistit, jak se dá výstup scriptu
přesměrovat. To se ovšem dá obejít tím, že script spustíme pomocí příkazu
NewShell který umožňuje určit Shellovský script, který má být při otevírání
shellu spuštěn. Trik je to poněkud méně elegantní a navíc v adresáři T: zůstává
pomocný soubor „Com-00“. Co se s tím dá dělat, je mi záhadou.
Představte si, že by se vám zachtělo, aby se váš AmigaDOS script spouštěl s
nějakými parametry. Pak by na řádku zodpovědném za spuštění scriptu (čtvrtý
zespod) přibylo udání parametrů. Vypadalo by to nějak takto:
WriteLN(F,Execute „ || file || „ PARAM)
Jak vidíte, přidali jsme na konec proměnnou PARAM, do které bychom měli nějakým
způsobem dostat zmíněné parametry. Způsobů, jak na to jít, je hodně. Bud je mít
v Runnerovi napsané natvrdo, což je hloupé, nebo mít nějaký externí soubor, ze
kterého bychom ty argumenty četli, to je však stejně hloupé jako způsob číslo
jedna. Dobrý nápad je mít ty argumenty napsané někde v komentáři ve spouštěném
souboru a vždy před spuštěním je přečíst. Spouštěný skript by mohl vypadat třeba
takto: .key FILE/A
; »Arguments SYS:Disk.info
List „<File>“ LFORMAT %1 Tento skript (vypisuje délku souboru) by se pak spustil s parametrem
„SYS:Disk.info“. Vymyšlené to máme pěkně, teď to ještě nějak přidat do Runneru.
Na místo, ve kterém už je známa proměnná „path“ (u nás je to třeba řádek 15)
vsuňte toto: OPEN(F,path,READ)
DO FOR 10 WHILE ((~EOF(F)) & (PARAM = ))
A=ReadLN(F)
W=Words(A)
IF W>1 THEN
DO I=1 TO W
IF Word(A,I)= »Arguments THEN DO
param = Right(A,Length(A)-WORDINDEX(A,I+1)+1)
LEAVE
END
END
END
CLOSE(F) V této smyčce se přečte prvních deset řádků souboru a pokud obsahují slovo
„»Arguments“ zleva i zprava ohraničené mezerou, dosadí se zbytek řádku do
proměnné param, kterou použijeme jako parametr při spouštění skriptu.
Ti, kteří četli minulý díl tohoto seriálu možná tuší, co dalšího mám
přichystané. Do našeho Runneru přidám schopnost si pamatovat, se kterým souborem
jsme naposledy pracovali a schopnost si vlastni CEd otevřít, pokud ještě není.
Při otevíráni CEdu do něj samozřejmě nahrajeme ten zapamatovaný soubor. Toto by
možná bylo jednodušší udělat v AmigaDOS skriptu, ale spouštění takového scriptu
by Runner podstatně zpomalilo. Napíšu to tedy jako další kus v ARexxu.
Zapamatování si, se kterým souborem vlastně pracujeme, je jednoduché. OPEN(F,ENVARC:Project,WRITE)
WriteLN(F,path)
CLOSE(F) Toto vložte hned za řádek „path = RESULT“. Do adresáře ENVARC: se zapíše
jméno souboru v aktivním okně CEdu, což je vlastně to, co zrovna prohlížíme.
Kus, který nám zajistí otevření tohoto zdrojáku, pokud Ced není spuštěný, dejte
hned od pátého řádku, čili za „OPTIONS FAILAT 21“. AddLib(rexxsupport.library,0,-30,0)
a = OpenPort(rexx_ced)
ClosePort(rexx_ced)
IF a ~= 0 THEN DO
IF ~EXISTS(ENVARC:Project) THEN a=
ELSE DO
OPEN(F,ENVARC:Project,READ)
a = ReadLN(F)
CLOSE(F)
END
Shell Command CEd „ || a || „
EXIT
END Jak to vůbec funguje? Funkcí AddLib musíme nejdříve otevřít knihovnu
rexxsupport, bez které bychom nemohli použít funkci OpenPort a ClosePort. Těmito
funkcemi totiž zjišťuji přítomnost CEdu. Systém totiž nemůže otevřít dva porty
stejného jména. Pokud funkce OpenPort selže, s největší pravděpodobností to
znamená, že ten port existuje a že ho vlastní CEd. ClosePort na dalším řádku je
neškodný, protože CEd si svůj port zavřít nenechá a pokud jsme ten port otevřeli
my, tak je to vlastně v pořádku. Načež se zařídíme podle toho, jak dopad!
OpenPort. Jestli uspěl, vrátil nenulové číslo a my otevřeme nový CEd. Pokud
selhal, tak v této fázi neděláme nic.
Všimněte si příkazu EXIT těsně před koncem. Při prvním spuštění Runneru, když
ještě CEd neběží, nejen otevře editor s naším dokumentem, při spuštění podruhé
se již dokument spustí, nebo ukáže. Kdybyste ho chtěli spustit, ať CEd běží,
nebo ne, příkaz „EXIT“ prostě vymažte.
Vypadá to, že se náš vylepšený Runner příliš nepodobá svému pradědečkovi,
kterého jsem napsal na začátku. Abyste z toho neměli v hlavě mišmaš, přečtěte si
jeho konečnou verzi: /* $VER:Runner.rexx 1.0 */
OPTIONS RESULTS
OPTIONS FAILAT 21
AddLib(rexxsupport.library,0,-30,0)
a = OpenPort(rexx_ced)
ClosePort(rexx_ced)
IF a ~= 0 THEN DO
IF ~EXISTS(ENVARC:Project) THEN a=
ELSE DO
OPEN(F,ENVARC:Project,READ)
a = ReadLN(F)
CLOSE(F)
END
Shell Command CEd „ || a || „
EXIT
END
ADDRESS rexx?ced
STATUS 18
IF RESULT ~= 0 THEN Save
STATUS 21
file = RESULT
STATUS 20
dir = RESULT
STATUS 19
path = RESULT
OPEN(F,ENVARC:Project,WRITE)
WriteLN(F,path)
CLOSE(F)
PARAM=
OPEN(F,path,READ)
DO FOR 10 WHILE ((~EOF(F)) & (PARAM = ))
A=ReadLN(F)
W=Words(A)
IF W>1 THEN
DO I=1 TO W
IF Word(A,I)= »Arguments THEN DO
PARAM = Right(A,Length(A)-WORDINDEX(A,I+1)+1)
LEAVE
END
END
END
CLOSE(F)
IF RIGHT(file,6) = .guide THEN
DO
Shell command MultiView >NIL: „ || path || „
EXIT
END
IF RIGHT(file,5) = .rexx THEN
DO
Shell command RX >CON:/50//200/ARexx/WAIT/CLOSE/AUTO path
EXIT
END
OPEN(F,T:Com-00,WRITE)
WriteLN(F,ECho „*ec“ NOLINE)
WriteLN(F,Execute S:Shell-Startup)
WriteLN(F,CD „ || dir || „)
WriteLN(F,Execute „ || file || „ PARAM)
CLOSE(F)
Shell Command NewShell FROM T:Com-00 CON:/50//200/ Amigados/CLOSE
EXIT Abyste měli Runner na čem testovat, tak si jako obvykle neodpustím jeden
žert. Je to kratičký prográmek v ARexxu, který jsem ukazoval všem počítače
znalým návštěvám, které chtěly vidět multitaskové možnosti Amigy. Prográmek se
jmenuje Hodinářství a hádejte, co asi dělá... /* Hodinářství */
DO a=0 TO 200 BY 40
DO b=0 TO 540 BY 100
Shell command RUN <>NIL: SYS:Utilities/Clock b a 100 40 SECONDS
END
END Pro testování DOSovských skriptů jsem pro vás připravil šikovný prográmek,
který umí zkopírovat textový výstup příkazu do clipboardu. Ten potom můžete
pomocí PraváAmiga-v vypsat třeba do okna textového editoru. Dejte si ho do
adresáře S: třeba pod jménem clip a nastavte mu flag „s“. Když potom napíšete
„clip dir“, tak se vám do clipboardu uloží výpis aktuálního adresáře. . key Command/F
;$VER: Clip 0.1 Kopíruje výstup do clipboardu
FailAt 21
Alias pom <Command>
pom >T:Temp-{$$}
RUN >NIL: MultiView T:Temp-{$$} BACKDROP PORTNAME CLIPUSE
RX >NIL: „Address CLIPUSE COPY;Address CLIPUSE QUIT“
UnAlias pom
UnSetENV T:Temp-{$$} Pro účely testování můžete připsat na druhý řádek
; »Arguments type S:Startup-Sequence
aby se při spouštění pomocí Runneru dosadily nějaké argumenty. Tak to bychom
měli pomalu všechno. Tedy... ještě pro vás něco mám. Skulte si v Shellu někdy
napsat
Prompt „*n* date* *n%S>„
Myslím, že na to přijdete... 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
|