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

Programátorské rozhraní v Cedu

Petr 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


© 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 )