9.2. Příkaz DISPLAY Funkce: Příkaz DISPLAY ve formátu 1 resp. 2 provádí zápis do standardního výstupního souboru stdout resp. stderr, ve formátu 3 přechází na novou stránku v souboru stdout, ve formátu 4 provádí výstup na obrazovku v obrazovkovém režimu. Poznámka: Je-li (v kterémkoliv formátu) uvedena klauzule "UPON speciální-jméno", musí být toto speciální jméno přiřazeno v paragrafu SPECIAL-NAMES k některému z funkčních jmen STDOUT, SYSLST, SYSOUT, PRINTER, STDERR, CONSOLE, SYSLOG nebo CRT. Výsledek je stejný, jako kdyby bylo za FROM uvedeno přímo toto funkční jméno. A) Zápis do standardního výstupního souboru stdout/stderr Formát 1 (zápis do souboru stdout): - - - - - - | položka | | | STDOUT | | | speciální-index | | | SYSLST | | DISPLAY < literál > ... | UPON < SYSOUT > | | figur.konstanta | | | PRINTER | | - - | | speciální-jméno | | - - - - Formát 2 (zápis do souboru stderr): - - - - | položka | | STDERR | | speciální-index | | CONSOLE | DISPLAY < literál > ... UPON < SYSLOG > | figur.konstanta | | speciální-jméno | - - - - Argumenty uvedené za slovem DISPLAY se mají zapsat do příslušného standardního souboru. Tyto argumenty se po případné úpravě přesunou bezprostředně za sebe (bez mezer resp. jiných oddělovačů) do určité výstupní oblasti, jejíž délka bude tedy rovna součtu délek upravených argumentů. Přesun probíhá podle těchto pravidel: a) Skupinové, alfanumerické, alfanumerické editované, exponenciální znakové a numerické editované položky a dále alfanumerické literály se přesunují beze změny v plné délce. b) Numerické položky s pevnou řádovou tečkou se převádějí do rozpakovaného tvaru o délce rovné počtu dekadických řádů (tj. znaků 9) v PICTURE. (Tedy rozpakovaná položka se bere beze změny, pakovaná položka se rozpakuje, binární položka se převede do rozpakovaného dekadického tvaru). Desetinná tečka se nezařazuje. Je-li hodnota položky nezáporná, bude levý půlbyte posledního znaku vždy obsahovat hexadecimální 3, takže poslední tisknutý znak upravené hodnoty položky bude vždy číslice 0 až 9. Je-li však hodnota položky záporná, bude levý půlbyte posledního znaku obsahovat hexadecimální 4, takže místo číslice 0 bude znak @ a místo číslice 0 až 9 budou písmena A až I. c) Exponenciální krátká položka se převede do exponenciálního znakového tvaru odpovídajícího PIC +.9(9)E+99, exponenciální dlouhá položka se převede do exponenciálního znakového tvaru odpovídajícího PIC +.9(18)E+99. d) Položka s USAGE INDEX a speciální index se upraví stejně jako binární položka s PIC S9(9) USAGE COMP. (U speciálního indexu se tedy tiskne jeho hodnota a nikoliv pořadí odpovídající této hodnotě.) e) Numerický literál se přesune do výstupní oblasti přesně v tom tvaru, v jakém je uveden ve zdrojovém programu. f) Figurativní konstanta se zpracovává jako jednoznakový alfanumerický literál. Příklad: 77 ALFA PIC X(3) VALUE 'BUM'. 77 BETA PIC S99V99 COMP-3 VALUE +2.4. 77 GAMA PIC S999V9 COMP VALUE -7.5. 77 DELTA COMP-1 VALUE 564.73. : DISPLAY ALFA '/=/' BETA 52 GAMA -7.42E+8 DELTA ZEROS QUOTE Pak bude výstupní oblast naplněna takto: BUM/=/024052007E-7.42E+8+.564730000E+030' Pravidla: Výstupní zařízení, na které se obsah připravené výstupní oblasti zapíše, je určeno takto: a) Je rovnocenné neuvést klauzuli UPON vůbec nebo uvést UPON STDOUT nebo UPON SYSLST nebo UPON SYSOUT nebo UPON PRINTER (volba PRINTER je povolena pouze kvůli kompatibilitě); data pak budou z výstupní oblasti zapsána do standardního výstupního souboru stdout. b) Volby UPON STDERR, UPON CONSOLE a UPON SYSLOG jsou rovnocenné; data budou z výstupní oblasti zapsána do standardního výstupního souboru stderr, což většinou znamená, že budou vypsána v řádkovém režimu na obrazovce. Má-li připravená výstupní oblast nejvýše 80 bytů, zapíše se do příslušného souboru ve své plné délce a za ni se zapíše ještě znak "nový řádek" (v jazyce C znak '\n', hexadecimálně 0A); nejsou tedy doplňovány mezery do nějaké pevné délky, takže se zapisují věty obecně různých délek. Má-li tato výstupní oblast více než 80 bytů, zapíše se několik vět (řádků) po 80 bytech zakončených znakem "nový řádek" až do vyčerpání celé výstupní oblasti; poslední věta může mít ovšem opět délku menší než 80 bytů (např. při délce výstupní oblasti 342 bytů budou zapsány 4 věty po 80 bytech a jedna věta s 22 byty). Poznámka: Obsahuje-li některý z argumentů uvedených za slovem DISPLAY binární nulu (hexadecimálně 00), dojde k narušení tisku: následující byty tohoto argumentu (nejvýše však do konce řádku) se netisknou a řádek se zkrátí ("scvrkne doleva") o všechny vynechané byty. (U položek s délkou proměnnou nebo větší než 800 bytů se vynechává pouze nulový byte, nikoliv však následující byty téže položky.) Doporučujeme se nulovým bytům dle možnosti vyhnout. Poznámka: Příkazy DISPLAY a EXHIBIT standardně zapisují své řádky stejně jako příkaz WRITE s klauzulí "BEFORE 1". Při zadání parametru CBL AFTER budou zapisovat své řádky jako příkaz WRITE s "AFTER 1", ovšem stále bude naposledy připravený řádek nevytisknut (vždy se vytiskne až při dalším příkazu DISPLAY/EXHIBIT, jenž ovšem zase připraví další řádek). Poslední řádek (připravený posledním prováděným příkazem DISPLAY/EXHIBIT) nebude vytištěn vůbec, takže by jej měl uživatel vytisknout příkazem DISPLAY SPACE provedeným bezprostředně před ukončením výpočtu. (Jak vidět, zadání parametru CBL AFTER klade na uživatele značné nároky, a proto má tento parametr smysl jen v případě, že se příkazy DISPLAY střídají s jinými tisky, při nichž se tiskne způsobem "AFTER 1".) Formát 3: DISPLAY NEWPAGE Funkce: Příkaz DISPLAY NEWPAGE způsobí přechod na novou stránku v souboru stdout bez tisku; zapíše do tohoto souboru znak "nová stránka" (v jazyce C znak '\f', hexadecimálně 0C). Poznámka: Tisk na tiskárně může programátor provádět dvěma odlišnými způsoby: a) Deklarovat sekvenční soubor a používat příkazy WRITE. Pak může využívat bohaté možnosti klauzule AFTER/BEFORE a klauzule AT END-OF-PAGE pro řízení posuvu papíru. b) Nedeklarovat vůbec soubor a používat jen příkazy DISPLAY bez UPON nebo s UPON SYSLST atd. (a případně též příkazy EXHIBIT). Pro přechod na novou stránku lze použít příkaz DISPLAY NEWPAGE, který však není přenositelný do většiny implementací jazyka COBOL. Používání příkazů DISPLAY je poněkud rychlejší, klade menší nároky na paměť a vyžaduje značně méně psaní než používání souboru, které zase skýtá bohatší možnosti. B) Zápis na obrazovku (v obrazovkovém režimu) Formát 4: - - - - -- - - -- | položka | | | celé-číslo || | | CRT || DISPLAY < literál > | AT < >| | UPON < >| | f.konst.| | | cel.položka|| | |sp.jméno|| - - - - -- - - -- Příkaz DISPLAY ve formátu 4 zobrazuje zadanou položku nebo literál počínaje tím místem stínítka, které je určeno argumentem uvedeným za slovem AT. Za slovem DISPLAY se uvádí jediná položka (musí být skupinová, alfanumerická, alfanumerická editovaná, numerická rozpakovaná, exponenciální znaková nebo numerická editovaná; nesmí tedy mít USAGE jiné než DISPLAY) nebo literál (smysl má především alfanumerický literál; numerický literál se zobrazí v tom tvaru, v jakém je uveden ve zdrojovém programu) nebo figurativní konstanta (zpracovává se jako jednoznakový alfanumerický literál s výjimkou příkazu DISPLAY SPACE UPON CRT, jenž způsobí vymazání celé obrazovky). Za touto položkou, literálem nebo figurativní konstantou musí následovat alespoň jedna z klauzulí AT (slovo AT následované celým číslem nebo celočíselnou numerickou položkou) a UPON (slovo UPON následované slovem CRT nebo speciálním jménem, jemuž bylo v paragrafu SPECIAL-NAMES přiděleno funkční jméno CRT), případně obě tyto klauzule. Při uvedení klauzule AT je klauzule UPON CRT již nadbytečná a při neuvedení se předpokládá implicitně; tedy např. příkaz DISPLAY A AT B bez klauzule UPON je "obrazovkový" DISPLAY ekvivalentní s příkazem DISPLAY A AT B UPON CRT. Naopak při uvedení klauzule UPON CRT je klauzule AT nepovinná a při neuvedení se přijímá implicitně ve tvaru "AT 101"; tedy např. příkaz DISPLAY A UPON CRT je "obrazovkový" DISPLAY ekvivalentní s příkazem DISPLAY A AT 101 UPON CRT. Je-li uvedena klauzule AT, pak hodnota celého čísla resp. celočíselné numerické položky uvedené za slovem AT určuje souřadnice na stínítku pro první byte argumentu uvedeného za slovem DISPLAY. Další byty tohoto argumentu pak následují za tímto prvním bytem a v případě potřeby přecházejí na následující řádky na stínítku (nejvýše však do konce stínítka). Má-li prvnímu bytu argumentu uvedeného za slovem DISPLAY odpovídat průsečík x-tého řádku a y-tého sloupce stínítka (počítáno od 1), musí být hodnota argumentu uvedeného za slovem AT rovna 100x+y. (Tedy AT 101 znamená první sloupec na prvním řádku, tzn. levý horní roh stínítka, AT 523 znamená 23.sloupec na 5.řádku stínítka.) Výše uvedený vzoreček "100x+y" by ovšem neumožňoval plně pracovat se stínítky, která mají více než 99 sloupců. Proto se vzoreček "100x+y" používá pouze tehdy, má-li argument uvedený za AT nejvýše 4 cifry (v případě celého čísla) resp. více než 4 znaky 9 v PICTURE (v případě celočíselné položky). Při více než 4 cifrách resp. znacích 9 musí být hodnota argumentu uvedeného za AT rovna 1000x+y. (Tedy AT 001001 nebo AT 01001 znamená první sloupec na prvním řádku stejně jako AT 101 nebo AT 0101. Naproti tomu AT 1001 znamená první sloupec na 10. řádku, zatímco zápis AT 00101 je chybný.) Souřadnice x a y určené argumentem uvedeným za AT musí být obě kladné a nejvýše rovné počtu řádků resp. sloupců na stínítku. Není-li v příkazu DISPLAY uvedena klauzule AT, avšak je uvedena klauzule UPON CRT, přijímá se implicitně klauzule AT 101, tzn. prvnímu bytu argumentu uvedeného za DISPLAY bude odpovídat levý horní roh stínítka. Pravidla: 1) Je-li za slovem DISPLAY uvedena skupinová položka, bude na stínítku zobrazena nikoliv celá tato skupinová položka, nýbrž pouze ty její podřízené elementární položky, které - mají jméno jiné než FILLER a současně - nemají klauzuli REDEFINES ani nejsou podřízeny takové položce s klauzulí REDEFINES, která by byla sama podřízena položce uvedené za DISPLAY, a současně - nemají číslo úrovně 66 a současně - nemají USAGE jiné než DISPLAY. Každá takováto podřízená elementární položka se zobrazí na tom místě stínítka, které je od místa určeného argumentem uvedeným za AT vzdáleno právě o vzdálenost začátku této podřízené položky od začátku položky uvedené za slovem DISPLAY, a to bez jakýchkoliv změn a úprav. Vyloučené podřízené elementární položky a případné výplňkové byty zobrazovány nebudou a místa na stínítku jim odpovídající si tedy zachovají ten obsah, který měla před provedením tohoto příkazu DISPLAY. Skupinová položka uvedená za slovem DISPLAY smí mít klauzuli REDEFINES nebo být podřízena položce s klauzulí REDEFINES, smí mít i indexy. Její délka smí být pevná nebo proměnná, všechny její zobrazované podřízené elementární položky by však měly padnout dovnitř stínítka, jinak bude činnost příkazu DISPLAY předčasně ukončena. Mezi podřízenými elementárními položkami smí být i položky s klauzulí OCCURS (i OCCURS DEPENDING a rovněž i vícerozměrné tabulky); bude zobrazen takový pevný nebo proměnný počet podřízených položek, jak to odpovídá klauzulím OCCURS. 2) Je-li za slovem DISPLAY uvedena elementární položka, nesmí mít jiné USAGE než DISPLAY, smí však mít klauzuli REDEFINES nebo být podřízena položce s klauzulí REDEFINES a rovněž smí mít číslo úrovně 66. Tato položka bude zobrazena počínaje místem stínítka určeným pomocí klauzule AT. (Postupuje se stejně, jako kdyby se jednalo o skupinovou položku s jedinou podřízenou položkou.) 3) Je-li za slovem DISPLAY uveden literál nebo figurativní konstanta, bude tento argument zobrazen počínaje místem stínítka určeným pomocí klauzule AT. (Postupuje se stejně, jako kdyby se jednalo o alfanumerickou položku s takovouto hodnotou.) 4) Příkaz DISPLAY SPACE UPON CRT (lze uvést i SPACES místo SPACE a speciální jméno místo CRT, nikoliv však klauzuli AT ani alfanumerický literál ' ' místo SPACE) způsobí, že se celé stínítko vymaže (vymezeruje). (Výjimka se tedy nevztahuje na příkaz DISPLAY ' ' UPON CRT, jenž vypíše pouze jedinou mezeru do levého horního rohu stínítka, ani na příkaz DISPLAY SPACE AT 1748, jenž vypíše pouze jedinou mezeru do 48.sloupce 17.řádku stínítka.)