*** SHOTY MUSZÂ IÔÊ NA STRONIE KOLOROWEJ I W MIEJSCACH ZAZNACZONYCH *** W TEKÔCIE System na talerzu (cz. 13.) --------------------------- AMIGA DOS Marek Pampuch DPAT (D[ouble argument command] PAT[tern] -- wzorzec dla rozkazów dwuargumentowych) skîadnia dla systemów 1.3, 2.0, 2.1 3.0 i 3.1: DPAT [COM=] >rozkaz< [PAT=] >wzorzec< [DIR=] >katalog< [>opt1<] [>opt2<] [>opt3<] [>opt4<] (w systemie 1.2 rozkaz ten nie wystëpuje) gdzie: rozkaz to nazwa rozkazu z dwoma argumentami, do jakiego chcemy zastosowaê DPAT, wzorzec -- okreôla szablon, wedîug którego bëdâ znajdowane nazwy, katalog to katalog docelowy, na który ma dziaîaê skrypt wraz ze ôcieûkâ dostëpu, opt1...opt4 -- îaïcuchy z opisem parametrów, jakie majâ byê przekazane do rozkazu. wzorzec dla systemów 1.3, 2.0, 2.1 i 3.0 i 3.1: COM/A, PAT/A, DIR/A, OPT1, OPT2, OPT3, OPT4 DPAT jest rozkazem w postaci skryptu i znajduje sië w katalogu S. Moûna go uûywaê tylko z poziomu Shella. Pozwala na dodanie do innych, dwuargumentowych rozkazów, dodatkowych opcji wedîug ustalonego wzorca (rozkaz dwuargumentowy to na przykîad COPY z parametrami FROM i TO). Skâd wziëîo sië takie dziwactwo? Podczas pracy nad systemem 1.3 programiôci wymyôlili sobie, ûe dobrze sië stanie, jeôli system zostanie wyposaûony w tak zwane zmienne "ôrodowiskowe". Niestety, brak czasu (lub ochoty) spowodowaî, ûe rozkazy dotyczâce tych zmiennych nie zostaîy dopracowane i skrypty DPAT oraz SPAT (o którym bëdziemy mówiê, gdy nadejdzie jego kolej) sâ protezâ umoûliwiajâcâ emulacjë tych nie dokoïczonych zadaï. Zrozumienie zasad dziaîania takiego skryptu wymaga jednak pewnej dawki (tfu!) teorii. Poniewaû jednak teoria taka mogîaby dodatkowo zamâciê w gîowie, spróbujë przedstawiê jâ w formie przykîadów. Teoretycznie DPAT ma byê skryptem, który w poîâczeniu z rozkazem ALIAS umoûliwia stosowanie jokera (wildcard) do rozkazów, z którymi wczeôniej nie mógî dziaîaê. Na przykîad: alias ren "execute s:DPAT rename []" pozwoli nam na stosowanie jokera w rozkazie RENAME. Bez skorzystania z DPAT moûemy zmieniê nazwë zbiorom o nazwach podanych w caîoôci, z DPAT-em natomiast bëdziemy mogli, na przykîad, wszystkim zbiorom o nazwie zaczynajâcej sië na "rek" zmieniê nazwë przez: ren df0:rek#? Wbrew pozorom nie jest to takie maîo przydatne, jak by sië mogîo wydawaê. Wyobraú sobie, ûe napisaîeô ksiâûkë, â poszczególne jej rozdziaîy umieôciîeô w katalogach Rozdz1, Rozdz2, i tak dalej, aû do Rozdz55. Z jakichô powodów, w które nie wnikam, postanowiîeô je wszystkie umieôciê w nowym katalogu nazwanym "Kniga". Pomyôl, ile czasu zajëîaby Ci ta operacja, gdybyô jâ robiî "na piechotë". A korzystajâc z tego, ûe masz DPAT, wystarczâ dwa rozkazy: makedir df0:kniga DPAT rename df0:Roz#? df0:kniga Jak to wyglâda od strony systemowej? Aby to zrozumieê, najlepiej przyjrzeê sië dokîadnie systemowemu skryptowi DPAT zamieszczonemu w sekwencji startowej. Dla systemu 3.1 wyglâda on nastëpujâco (wszelkie zmiany w stosunku do wczeôniejszych wersji DPAT sâ w listingu zaznaczone): .key COM/A,PAT/A,DIR/A,OPT1,OPT2,OPT3,OPT4 .bra { .ket } ; $VER: DPat 40.3 (23.2.93) ;uwaga! to jest numer wersji dla systemu 3.1, dla innych systemów numery sâ inne ;Do wildcards for double argument commands FailAt 21 Echo >ENV:qw{$$} "{DIR}" FIRST 256 ;uwaga! Fragment pomiëdzy gwiazdkami jest tylko w systemie 3.1 ;************************************************************* IF "$qw{$$}" EQ "" List >T:qw{$$} {PAT} LFORMAT "{COM} *"%s%s*" *"%s*" {OPT1} {OPT2} {OPT3} {OPT4}" Skip doit EndIF ;************************************************************* IF $qw{$$} EQ ":" List >T:q{$$} {PAT} LFORMAT "{COM} *"%s%s*" *"{DIR}%s*" {OPT1} {OPT2} {OPT3} {OPT4}" Skip doit EndIF IF $qw{$$} EQ "/" List >T:q{$$} {PAT} LFORMAT "{COM} *"%s%s*" *"{DIR}%s*" {OPT1} {OPT2} {OPT3} {OPT4}" Skip doit EndIF IF EXISTS {DIR} List >T:q{$$} {PAT} LFORMAT "{COM} *"%s%s*" *"{DIR}/%s*" {OPT1} {OPT2} {OPT3} {OPT4}" Else List >T:q{$$} {PAT} LFORMAT "{COM} *"%s%s*" *"{DIR}*" {OPT1} {OPT2} {OPT3} {OPT4}" EndIF Lab doit IF NOT FAIL Execute T:q{$$} Else Echo "{PAT} not found" EndIF Delete >NIL: ENV:qw{$$} T:q{$$} QUIET FailAt 10 Zostaîo nam zatem jeszcze tylko omówienie parametrów rozkazu. Sâ nimi: COM -- nazwa rozkazu, na jaki ma zadziaîaê skrypt DPAT. Bez tego argumentu skrypt DPAT nie zadziaîa. PAT -- wzorzec obejmujâcy zbiory z katalogu "úródîowego", które bëdâ objëte dziaîaniem "poprawionego" przez DPAT rozkazu. UWAGA: W skrypcie DPAT, zgodnie z "wytycznymi Commodore" nie powinno sië uûywaê wzorca "" na katalog aktualny ani jokera w postaci gwiazdki ("*"). Aby jednak byîo ômieszniej, rzut oka na dostarczany wraz z systemem skrypt DPAT pozwala stwierdziê, ûe w tym wypadku Commodore nie przestrzega wydanych przez siebie zaleceï. DIR -- katalog "docelowy". Parametr ten moûe zawieraê ôcieûkë dostëpu i musi byê uûyty w rozkazie DPAT. Jeôli chcesz uûyê i tutaj wzorca, musi on byê umieszczony w apostrofach, na przykîad w naszym przykîadzie z "knigâ" naleûy napisaê: DPAT rename df0:Roz#? df0:kniga'/roz#?' Przypominam, ûe na klawiaturach, na których nie ma apostrofu, na przykîad na klawiaturze niemieckiej, moûna go uzyskaê naciskajâc jednoczeônie klawisze [Alt] i [A "umlaut"] OPT1, OPT2, OPT3, OPT4 to îaïcuchy alfanumeryczne, zawierajâce opis parametrów dodawanych do rozkazu, na jaki ma dziaîaê DPAT. Przewaûnie sâ tu cztery takie îaïcuchy, niektóre (nieliczne) rozkazy wymagajâ zaô mniejszej lub wiëkszej liczby parametrów. Nie wolno jednak stosowaê mniej niû dwóch. Jeôli zamierzamy uûyê liczby argumentów róûnej od czterech, wówczas argumenty te muszâ byê umieszczone w cudzysîowie, na przykîad: DPAT rename df0:Roz#? df0:kniga "start=1 end=10" UWAGA: Podane wyûej parametry sâ fikcyjne. Nie chciaîem jednak stosowaê tu innego rozkazu, który mógîby, przy nieumiejëtnym zastosowaniu parametrów, spowodowaê komplikacje. ********* ARTUR!!!! W ROZKAZIE ECHO UWAÛAJ NA TAGI, BO JEST TAM REDYREKCJA (">" i ">>") ***************************************** ECHO (odbicie, tu wypisz) skîadnia dla systemu 1.2: >tekst< skîadnia dla systemu 1.3: >tekst< [NOLINE] [FIRST >nn<] [LEN >mm<] skîadnia dla systemów 2.0, 2.1 3.0 i 3.1 : >tekst | zmienna< [NOLINE] [FIRST= >nn<] [LEN= >mm<] [TO= >zbiór<] gdzie: tekst -- jest îaïcuchem, który ma byê wypisany, nn -- okreôla znak îaïcucha od jakiego ma byê wypisany tekst, mm -- dîugoôê drukowanego fragmentu îaïcucha, zbiór zaô to nazwa zbioru, do jakiego chcemy zapisaê wynik dziaîania rozkazu. wzorzec dla systemu 1.2: /M wzorzec dla systemu 1.3: /M, NOLINE/S, FIRST/K/N, LEN/K/N wzorzec dla systemu 2.0, 2.1, 3.0 i 3.1: /M, NOLINE/S, FIRST/K/N, LEN/K/N, TO/K Rozkaz ten sîuûy gîównie do wypisywania tekstu na ekranie, odpowiada zatem rozkazowi PRINT z Amiga BASIC czy SAY z ARexxa. ECHO jest rozkazem bardzo elastycznym. Oprócz typowych znaków alfanumerycznych, jak na przykîad: ECHO "Amiga to najlepszy komputer - Commodore zaô to najgorsza firma" w îaïcuchu, który wystëpuje w cudzysîowach moûna umieôciê wiele innych znaków (zwanych kodami "escape" ANSI), które bëdâ miaîy wpîyw na wyglâd ekranu. Sekwencja taka skîada sië z gwiazdki, litery "e" i nawiasu kwadratowego "[". Na przykîad wprowadzenie rozkazu: ECHO " *e[3m to jest kursywa *e[42m a to na biaîym tle" spowoduje, ûe caîy tekst bëdzie napisany pochyîymi literami, a druga czëôê zdania znajdzie sië dodatkowo na biaîym tle. Zobaczmy teraz, jakie kody "escape" moûna stosowaê w rozkazie ECHO. *e[0m -- przywraca ustawienie domyôlne (zwykîy topaz i kolory podstawowe) *e[1m -- pogrubia tekst *e[2m -- zmienia kolor liter na biaîy *e[3m -- pochyla tekst *e[4m -- podkreôla tekst *e[7m -- bierze tekst "w negatyw" *e[8m -- usuwa tekst *e[22m -- wyîâcza pogrubienie tekstu *e[23m -- wyîâcza pochylenie tekstu *e[24m -- wyîâcza podkreôlenie tekstu *e[31m - *e[39 -- zmienia kolor napisu *e[41m - *e[49 -- zmienia kolor tîa UWAGA: W zaleûnoôci od ustawionej palety Workbencha kolory zmieniane parametrami o numerach od 31 do 39 i od 41 do 49 mogâ byê róûne (na przykîad w systemie 1.3 "zadziaîajâ" jedynie cztery pierwsze, chyba ûe wczeôniej uruchomimy program umoûliwiajâcy korzystanie z oômiokolorowego Workbencha). Niestety, nawet przy ustawieniu (na Amigach z ukîadami AGA) ekranu WB na wiëkszâ liczbë kolorów inne parametry przy ECHO nie pokaûâ nam ich. Rozkaz ten bowiem od wersji 2.0 pozostaî nie zmieniony. Pozostaîe cyferki w powyûszych sekwencjach nie bëdâ miaîy ûadnego znaczenia. Wszystkie powyûsze kody mogâ mieê zastosowanie takûe przy wydruku na drukarce. W tym celu po przejôciu do CLI/Shella wpisujemy: copy * to prt a nastëpnie wpisujemy rozkaz ECHO wraz z odpowiednim tekstem i wybranymi kodami ANSI. UWAGA: Jeôli nasza drukarka nie potrafi wykonaê jakiejô operacji (na przykîad wydruku kolorowego), podany kod sterujâcy zostanie zignorowany. Drukarka moûe takûe "przenieôê" z rozkazu ECHO nastëpujâce kody ANSI, których dziaîanie na ekranie nie bëdzie widoczne (z uwagâ jak wyûej): *e[0w -- druk "normalny" (pica) *e[1w -- wyîâczenie druku "elite" *e[2w -- wîâczenie druku "elite" *e[3w -- wîâczenie druku zagëszczonego *e[4w -- wîâczenie druku zagëszczonego NLQ *e[5w -- wyîâczenie druku powiëkszonego *e[6w -- wîâczenie druku powiëkszonego *e[1p -- wyîâczenie druku proporcjonalnego *e[2p -- wîâczenie druku proporcjonalnego *e[0v -- przeîâczenie z druku indeksów na druk normalny *e[1v -- wyîâczenie druku indeksów górnych *e[2v -- wîâczenie druku indeksów górnych *e[3v -- wyîâczenie druku indeksów dolnych *e[4v -- wîâczenie druku indeksów dolnych ********************************************************************* ***** tutaj powinny byê rysunki oznaczone jako DOS_1 i DOS_2 (po przeróbce Rafaîa to bëdzie xxx_1.pcx i xxx_2.pcx, gdzie xxx to numer nadany tekstowi ************* ******************************************************************** Pozostaîych 52 kodów ANSI odnoszâcych sië do drukarki rozkaz ECHO nie przeniesie. Wróêmy zatem do "normalnego", ekranowego, dziaîania tego rozkazu. Kolejnâ literkâ, jakâ moûemy umieôciê w powyûszych sekwencjach, jest "t". Kody z tâ literâ pozwolâ nam na uzyskanie nastëpujâcych efektów: *e[0t -- usuwa tekst i wyîâcza prompt *e[1t -- usuwa tekst i przenosi prompt do pozycji HOME *e[2t -- przesuwa tekst w oknie o 1 wiersz w górë *e[45t -- przenosi prompt na koniec tekstu na ekranie No to huzia dalej po alfabecie. Co my tam mamy? "u"? Proszë bardzo: *e[1u -- wypisuje prompt wraz z rozkazem ... w pionie *e[2u -- jak wyûej, ale w dwóch rzâdkach *e[3u -- jak îatwo sië domyôliê, w trzech pionowych rzâdkach, i tak dalej I to wszystkie literki "grajâce rolë" w rozkazie ECHO, a przynajmniej wszystkie, jakie udaîo mi sië wykryê (na Amidze 1200 z Workbenchem 3.0). Jeôli ktoô z Czytelników znalazî jeszcze jakieô inne sekwencje ANSI wspóîpracujâce z rozkazem ECHO, proszë go o list do redakcji (na moje nazwisko). Wróêmy jednak do naszego rozkazu. Wiemy juû, jak (nawet w doôê fikuôny sposób) przedstawiê normalny tekst. Sprawa nieco sië skomplikuje w momencie, gdy zechcemy na przykîad nazwë Commodore, znajdujâcâ sië w naszym przykîadzie, umieôciê w cudzysîowie. Jest na to jednak rada. Wystarczy, jeôli powyûszy przykîadowy tekst zmienimy nastëpujâco: ECHO "Amiga to najlepszy komputer - *" Commodore *" zaô to najgorsza firma" Gwiazdka umieszczona przed cudzysîowem spowoduje, ûe wystëpujâcy po niej cudzysîów zostanie wydrukowany. No piëknie, ale co zrobiê, jeôli w tekôcie zechcemy umieôciê nie cudzysîów, a gwiazdkë wîaônie? Nic prostszego -- wystarczy jâ poprzedziê drugâ gwiazdkâ. To jeszcze nie wszystko. Rozkaz ECHO ma kilka parametrów zmieniajâcych dziaîanie rozkazu: NOLINE -- uûycie tego parametru spowoduje usuniëcie wstawianego domyôlnie przez rozkaz ECHO przeskoku do nastëpnego wiersza po zakoïczeniu îaïcucha w cudzysîowie. Przykîad: echo "wszystko co tu napiszemy znajdzie sië " noline echo "w jednym wierszu" UWAGA: Powyûszego przykîadu nie moûemy wprowadziê z rëki. Jeôli bowiem naciôniemy klawisz [Return] po wpisaniu pierwszego wiersza, wówczas na ekranie zobaczymy tekst, a zaraz za nim prompt Shella. Sâ dwa sposoby rozwiâzania tego problemu: * albo napisaê przykîad edytorem, zapisaê jako zbiór i nastëpnie uruchomiê * albo skorzystaê z redyrekcji, na przykîad: echo >RAM:test "wszystko co tu napiszemy znajdzie sië " noline echo >>RAM:test "w jednym wierszu" lub skorzystaê z opcji TO FILE (patrz opis niûej). UWAGA: Opisana wyûej redyrekcja nie zadziaîa w systemie 1.3. Ponadto bëdzie ona ograniczona do dwóch wierszy. Próba uûycia redyrekcji >>>RAM: spowoduje bowiem pojawienie sië komunikatu, mówiâcego o niewîaôciwoôci takiego postëpowania. Przeciwieïstwem parametru NOLINE jest umieszczenie w tekôcie symbolu "*n". Jeôli na przykîad napiszemy: echo "Commodore Amiga *nto jedyny dobry komputer *ntej firmy" to w efekcie otrzymamy: Commodore Amiga to jedyny dobry komputer tej firmy FIRST i LEN pozwalajâ wydrukowaê fragment îaïcucha, na przykîad: ECHO "Amiga to najlepszy komputer - Commodore zaô to najgorsza firma" FIRST=19 LEN=20 spowoduje wydruk "komputer -- Commodore". W systemach od 2.0 w górë w miejscu tekstu moûna umieôciê zmiennâ. Nie moûe to byê jednak zmienna dowolna. Musi to byê zmienna "ôrodowiskowa". Zmiennâ të omówimy dokîadniej przy opisie rozkazu GETENV. Na razie spróbujmy tylko wpisaê nastëpujâcy skrypt: .key process .bra { .ket } status >env:qve{$$} {process} echo "$qve{$$}" first 31 Naleûy go wpisaê dowolnym edytorem i zapisaê w RAM-ie (na przykîad pod nazwâ "test"), a nastëpnie uruchomiê przez execute RAM:test >n< gdzie n jest numerem zadania. Na przykîad dla A1200 i n=3 otrzymamy Workbench czyli nazwë aktualnie "zaangaûowanego" w tym Shellu zadania. UWAGA: Uûytkownicy systemu 1.3, chcâcy uzyskaê podobny efekt, muszâ sië posîuûyê metodâ zastosowanâ w skrypcie DPAT, pozwalajâcâ ominâê nie stosowane w tym systemie zmienne ôrodowiskowe. A zatem skrypt znajdujâcy nazwë bieûâcego zadania bëdzie nieco bardziej rozbudowany i bëdzie wyglâdaî jak poniûej: .key process,s1,s2,s3,s4,s5,s6,s7 .bra { .ket } if "{s1}" EQ "" ECHO >ram:qwe{$$} "{process} " NOLINE status >>RAM:qve{$$} {process} execute NIL:test ? endif if "{s1}" NOT EQ "" echo "{s1} {s1} {s1} {s1} {s1} {s1} {s1}" FIRST=16 ENDIF Powyûszy skrypt zapisujemy i uruchamiamy tak jak skrypt podany wczeôniej dla systemu 2.0. TO (FILE) -- ten parametr umoûliwia "wydrukowanie" naszego napisu do zbioru. Jeôli chcemy tak potraktowaê podany wyûej przykîad, wówczas wpisujemy: echo "wszystko co tutaj napiszemy znajdzie sië" noline to=df0:test echo "w jednym wierszu" to file df0:test Teraz wystarczy tylko (na przykîad za pomocâ edytora systemowego lub rozkazu TYPE) zobaczyê zawartoôê zbioru "test". ed df0:test W systemie 2.0 i wyûszych moûna nieco uproôciê ten zapis, pamiëtajâc jednakûe o tym, aby koniecznie umieôciê ôcieûkë dostëpu do zbioru. Nasz przykîad dla "wyûszych" systemów moûe wyglâdaê zatem nastëpujâco: echo >df0:test "wszystko co tu napiszemy znajdzie sië " noline echo >>df0:test "w jednym wierszu" takûe i tu naleûy pamiëtaê, ûe redyrekcja moûe zawieraê maksimum dwa znaczki ">>".