9.4. Příkaz ACCEPT Funkce: Příkaz ACCEPT ve formátu 1 čte ze standardního vstupního souboru stdin, ve formátu 2 čte z klávesnice v řádkovém režimu a ve formátu 3 čte z klávesnice v obrazovkovém režimu. Formát 4 příkazu ACCEPT neprovádí čtení, nýbrž slouží ke získání data resp. času. Poznámka: Je-li (v kterémkoliv formátu) uvedena klauzule "FROM 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 STDIN, SYSIPT, SYSIN, CONSOLE nebo CRT. Výsledek je stejný, jako kdyby bylo za FROM uvedeno přímo toto funkční jméno. A) Čtení ze standardního vstupního souboru stdin Formát 1: - - - - | | STDIN | | | | SYSIPT | | ACCEPT položka | FROM < SYSIN > | [ AT END příkaz ... ] | | spec.jméno | | - - - - Příjmová položka (uvedená za slovem ACCEPT) smí mít libovolný typ i délku; pracuje se s ní vždy tak, jako kdyby byla alfanumerická. Čtení ze standardního vstupu stdin se provádí tehdy, není-li klauzule FROM uvedena vůbec anebo je-li uvedena ve tvaru FROM STDIN nebo FROM SYSIPT nebo FROM SYSIN. Neuvedení klauzule FROM je ekvivalentní s uvedením FROM STDIN. Volby FROM STDIN, FROM SYSIPT a FROM SYSIN se liší ve způsobu čtení ze vstupu stdin a naplňování příjmové položky: a) Při volbě FROM STDIN (resp. při vynechání klauzule FROM) se předpokládá, že standardní vstup stdin obsahuje textový soubor složený z logických vět oddělených znakem "konec řádku" (v jazyce C znak '\n', hexadecimálně 0A; za poslední logickou větou v souboru znak "konec řádku" již být nemusí). Příkaz ACCEPT čte právě jednu logickou větu, tj. posloupnost znaků začínající "aktuálním" znakem souboru stdin a končící posledním znakem před nejbližším "koncem řádku" resp. posledním znakem souboru stdin (pokud se dosáhne konce souboru, aniž by se předtím našel "konec řádku"). Tuto logickou větu uloží příkaz ACCEPT do příjmové položky odleva. Je-li logická věta kratší než příjmová položka, bude zbytek (tj. konec) příjmové položky vyplněn mezerami (i v případě, že logická věta byla ukončena "koncem souboru"!). Logická věta může mít i nulovou délku (následují-li v stdin dva znaky "konec řádku" bezprostředně za sebou nebo je-li posledním znakem souboru stdin znak "konec řádku"); v takovém případě se celá příjmová položka vymezeruje. Je-li logická věta delší než příjmová položka, bude do příjmové položky uložen pouze začátek logické věty (v délce příjmové položky) a zbytek logické věty se zahodí (neuplatní se ani při tomto příkazu ACCEPT ani při následujícím; tyto znaky budou ze souboru stdin přečteny "naprázdno"). Znak "konec řádku" se přečte též (do příjmové položky se ovšem neukládá!), takže pro příští čtení bude "aktuálním" znakem znak následující za "koncem řádku". Dosáhne-li se konce souboru stdin, vzniká normální logická věta tvořená znaky od posledního znaku "konec řádku" po poslední znak souboru stdin, která se normálně uloží do příjmové položky; pak se uplatní klauzule AT END, je-li v tomto příkazu ACCEPT uvedena. b) Při volbě FROM SYSIN se předpokládá, že standardní vstup stdin obsahuje textový soubor složený z logických vět oddělených znakem "konec řádku" (stejně jako při volbě FROM STDIN). Příkaz ACCEPT přečte logickou větu a uloží ji odleva do příjmové položky. Je-li logická věta delší nebo stejně dlouhá jako příjmová položka, proběhne čtení přesně stejně jako při volbě FROM STDIN (tzn. příkaz ACCEPT přečte právě tuto jedinou logickou větu a její případný zbytek zahodí; "aktuálním" znakem se stane první znak za nejbližším "koncem řádku"). Je-li však logická věta kratší než příjmová položka, přečte příkaz ACCEPT ze souboru stdin další logickou větu a uloží ji do příjmové položky bezprostředně za konec první logické věty (znak "konec řádku" se do příjmové položky neukládá); tak pokračuje tak dlouho, až zaplní celou příjmovou položku. Případný zbytek poslední z těchto logických vět (jejíž začátek byl uložen na konec příjmové položky) se zahodí. "Aktuálním" znakem souboru stdin se stane první znak za "koncem řádku" ukončujícím tuto poslední větu. Dosáhne-li se při čtení konce souboru stdin, budou do příjmové položky uloženy pouze logické věty přečtené před dosažením konce souboru a její zbytek (konec) zůstává nezměněn (není tedy mezerován!); pak se uplatní klauzule AT END, je-li v tomto příkazu ACCEPT uvedena. c) Při volbě FROM SYSIPT se předpokládá, že standardní vstup stdin obsahuje binární (netextový) soubor. Jinými slovy: případný znak "konec řádku" (hex. 0A) se považuje za normální datový znak, jenž se normálně přesune do příjmové položky a nezpůsobí ukončení provádění příkazu ACCEPT. Ze souboru stdin tedy příkaz ACCEPT přečte právě tolik znaků, kolik činí délka příjmové položky (včetně případných znaků "konec řádku"), a uloží je odleva do příjmové položky. Dosáhne-li se při tomto čtení konce souboru, budou do příjmové položky odleva uloženy pouze znaky přečtené před dosažením konce souboru a konec příjmové položky zůstane nezměněn (není tedy mezerován!); pak se uplatní klauzule AT END, je-li v tomto příkazu ACCEPT uvedena. Přesuny logických vět resp. znaků souboru stdin do příjmové položky probíhají bez jakýchkoliv úprav a kontrol (jakoby příjmová položka byla alfanumerická). Uživatel sám zodpovídá za případné dosazení obsahu neodpovídajícího popisu do příjmové položky nebo do některé její podřízené. Příklad: Předpokládejme, že všechny logické věty souboru stdin mají délku 80 bytů (tzn. 80 bytů textu, znak "konec řádku", 80 bytů textu, znak "konec řádku" atd.). a) Má-li položka ALFA PIC S9(4), pak příkaz ACCEPT ALFA s volbou FROM STDIN nebo FROM SYSIN nebo bez volby FROM přečte jednu logickou větu ze stdin, obsah jejích prvních čtyř bytů přesune beze změny do položky ALFA a jejích zbylých 76 bytů včetně následujícího znaku "konec řádku" přeskočí (takže následující příkaz ACCEPT bude číst počínaje prvním znakem za tímto znakem "konec řádku"). Příkaz ACCEPT ALFA FROM SYSIPT by naplnil položku ALFA stejně, avšak nedočetl by logickou větu až do "konce řádku", nýbrž "aktuálním" znakem souboru stdin by se stal pátý znak této logické věty. b) Má-li položka BETA 32000 bytů, pak příkaz ACCEPT BETA s volbou FROM STDIN nebo bez volby FROM přečte ze stdin pouze jednu logickou větu a uloží ji odleva do položky BETA; zbylých 31920 bytů položky BETA vymezeruje a "aktuálním" znakem učiní první znak za znakem "konec řádku" ukončujícím tuto logickou větu. Příkaz ACCEPT BETA FROM SYSIN přečte ze stdin 400 logických vět (tedy včetně znaků "nový řádek" celkem 32400 bytů) a uloží je bezprostředně za sebe (ovšem bez znaků "nový řádek"!) do položky BETA; pokud by v souboru stdin 400 logických vět nezbývalo, zůstane zbytek položky BETA za poslední logickou větou nezměněn a uplatní se případná klauzule AT END. Příkaz ACCEPT BETA FROM SYSIPT přečte ze stdin 32000 bytů bez ohledu na znaky "konec řádku" a uloží je (včetně těchto "konců řádku") do položky BETA; "aktuálním" znakem se stane 6. znak v 396. logické větě. Pokud by v souboru stdin 32000 bytů nezbývalo, zůstane zbytek položky BETA nezměněn a uplatní se případná klauzule AT END. c) Má-li položka GAMA délku 161 bytů, pak příkaz ACCEPT GAMA FROM SYSIN přečte ze stdin tři logické věty; do položky GAMA uloží odleva celé první dvě z nich a první byte třetí přečtené logické věty. Zbývajících 79 bytů třetí logické věty se neuplatní ani při tomto ACCEPT ani při následujícím. Klauzule AT END Pokud se při provádění příkazu ACCEPT dosáhne konce vstupního souboru stdin, budou do příjmové položky přesunuty všechny logické věty resp. byty přečtené ze souboru stdin před dosažením konce souboru (při FROM STDIN resp. FROM SYSIN samozřejmě s výjimkou znaků "nový řádek"). Případný zbytek příjmové položky zůstává při FROM SYSIN resp. FROM SYSIPT nezměněn, zatímco při FROM STDIN je vymezerován. Uživatel by neměl po dosažení konce souboru provádět další příkazy ACCEPT pro čtení ze souboru stdin (učiní-li tak přece, bude výsledek závislý na vlastnostech použitého operačního systému). Je-li uvedena klauzule AT END a dosáhne-li se při provádění tohoto příkazu ACCEPT konce souboru, přejde se na provádění příkazů uvedených za AT END. Je-li uvedena klauzule AT END a konce souboru se při provádění tohoto příkazu ACCEPT nedosáhne, příkazy uvedené za AT END se přeskočí a přejde se na první příkaz za tečkou. Poznámka: Uvažujme příkaz ACCEPT s volbou FROM STDIN resp. FROM SYSIN, přičemž při FROM SYSIN předpokládejme, že příjmová položka není delší než nejkratší logická věta, takže každý příkaz ACCEPT čte právě jednu logickou větu. Stojí-li za poslední logickou větou v souboru stdin ještě znak "konec řádku", pak čtení této logické věty proběhne ještě normálně, aniž by se dosáhlo konce souboru a uplatnila se klauzule AT END. Při provádění dalšího příkazu ACCEPT pak bude příjmová položka při FROM STDIN vymezerována a při FROM SYSIN nezměněna a uplatní se klauzule AT END. Pokud za poslední logickou větu v souboru stdin již znak "konec řádku" nestojí, pak se při čtení této logické věty přesune tato logická věta do příjmové položky a současně se uplatní klauzule AT END. Uživatel musí sám vědět, jak je soubor stdin zakončen a zda se tedy při uplatnění klauzule AT END ještě předává nebo nepředává poslední logická věta. Poznámka: Klauzule AT END u příkazu ACCEPT není přenositelná do většiny implementací jazyka COBOL. Příkaz ACCEPT bez klauzule AT END je ovšem v praxi použitelný pouze tehdy, ví-li uživatel předem, kolik logických vět resp. bytů se má číst, anebo umí-li rozpoznat poslední logickou větu např. podle jejího obsahu. Uživatel by měl zajistit, aby nedošlo k dosažení konce souboru stdin při provádění příkazu ACCEPT bez klauzule AT END (snad jedině v případě, jedná-li se o poslední příkaz ACCEPT během výpočtu). B) Čtení z klávesnice v řádkovém režimu Formát 2: ACCEPT položka FROM { CONSOLE | speciální-jméno } Příjmová položka (uvedená za slovem ACCEPT) smí mít libovolný typ i délku; pracuje se s ní vždy tak, jako kdyby byla alfanumerická. Čtení z klávesnice v řádkovém režimu se provádí tehdy, je-li uvedena klauzule FROM CONSOLE (nebo FROM speciální-jméno, kde speciální jméno je v paragrafu SPECIAL-NAMES přiděleno k funkčnímu jménu CONSOLE). Příkaz ACCEPT způsobí, že se na obrazovce vypíše hlášení AWAITING REPLY (česky: očekává se odpověď) a výpočet se dočasně přeruší. Operátor musí být předem informován o tom, že k tomuto hlášení dojde, a musí vědět, co má nyní napsat nebo udělat. (Neobsluhuje-li autor programu svůj výpočet sám, může instruovat operátora ústně, písemně nebo nejlépe předběžným provedením příkazu DISPLAY s klauzulí UPON CONSOLE.) Operátor tedy nyní napíše na klávesnici patřičný text (smí používat datové znaky a klávesu "zpět o znak") a ukončí jej stiskem klávesy "konec zprávy" (ENTER). Tento text bude přesunut bez jakékoliv změny nebo kontroly (malá písmena se tedy nenahrazují velkými!) odleva do příjmové položky, načež bude výpočet pokračovat prováděním příkazu následujícího za příkazem ACCEPT. Má-li text napsaný operátorem na klávesnici méně znaků než příjmová položka, bude přesunut na začátek příjmové položky (odleva) a zbytek příjmové položky zůstane nezměněn. (V takovém případě by měl uživatel příjmovou položku před provedením příkazu ACCEPT např. vymezerovat.) Pokouší-li se operátor napsat více znaků, než kolik činí délka příjmové položky, nadbytečný znak se již nepřijme, předchozí znaky se přesunou do příjmové položky a výpočet bude pokračovat, aniž by se čekalo na operátorův stisk klávesy "konec zprávy" (ENTER). Poznámka: Je prakticky nemožné umístit pomocí příkazu ACCEPT s klauzulí FROM CONSOLE rozumný obsah do položky, která má USAGE jiné než DISPLAY. Příklad: Nechť položka ROZDIL má PIC S999V99. Chceme jí přidělit hodnotu až během výpočtu z klávesnice. Do programu zařadíme příkaz ACCEPT ROZDIL FROM CONSOLE. Chce-li operátor přidělit položce ROZDIL hodnotu 3.7, musí na klávesnici napsat 00370. Při hodnotě -6.47 by musel napsat 0064G a při hodnotě -6.4 by musel napsat 0064@. C) Čtení z klávesnice v obrazovkovém režimu Formát 3: - - - - - - - - | | celé-číslo | | | | CRT | | ACCEPT položka | AT < > | | FROM < > | | | cel.položka | | | |spec.jméno| | - - - - - - - - Příkaz ACCEPT ve formátu 3 čte z klávesnice do zadané položky, přičemž se používá obrazovkový režim. Položka uvedená za slovem ACCEPT (budeme ji dále nazývat hlavní 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. Za touto položkou musí následovat alespoň jedna z klauzulí AT (slovo AT následované celým číslem nebo celočíselnou numerickou položkou) a FROM (slovo FROM 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 FROM CRT již nadbytečná a při neuvedení se předpokládá implicitně; tedy např. příkaz ACCEPT A AT B bez klauzule FROM je "obrazovkový" ACCEPT ekvivalentní s příkazem ACCEPT A AT B FROM CRT. Naopak při uvedení klauzule FROM CRT je klauzule AT nepovinná a při neuvedení se přijímá implicitně ve tvaru "AT 101"; tedy např. příkaz ACCEPT A FROM CRT je "obrazovkový" ACCEPT ekvivalentní s příkazem ACCEPT A AT 101 FROM 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 položky uvedené za slovem ACCEPT. Další byty této položky 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 položky uvedené za slovem ACCEPT 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, jinak bude činnost příkazu ACCEPT ukončena s indikací chyby.. Není-li v příkazu ACCEPT uvedena klauzule AT, avšak je uvedena klauzule FROM CRT, přijímá se implicitně klauzule AT 101, tzn. prvnímu bytu položky uvedené za ACCEPT bude odpovídat levý horní roh stínítka. Nejčastějším případem je, že položka uvedená za slovem ACCEPT je skupinová položka. Pak bude možno z klávesnice naplňovat nikoliv tuto skupinovou položku jako celek, 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 ACCEPT, a současně - nemají číslo úrovně 66 a současně - nemají USAGE jiné než DISPLAY. Takovéto podřízené elementární položky budeme zde nazývat vybrané podřízené položky. Každé vybrané podřízené položce přísluší úsek stínítka určený stejně jako u "obrazovkového" příkazu DISPLAY: jeho začátek je od místa určeného argumentem uvedeným za AT vzdálen právě o vzdálenost začátku této podřízené položky od začátku položky uvedené za slovem ACCEPT. Takto přidělený úsek stínítka smí přecházet z řádku na řádek, nesmí však zasahovat za konec stínítka. Do tohoto úseku stínítka bude nastaven kurzor při naplňování této položky a rovněž v případě zobrazování obsahu této položky (viz dále) bude tento obsah zobrazován do tohoto úseku stínítka. Ostatní podřízené elementární položky jsou při činnosti tohoto příkazu ACCEPT ignorovány; nemohou tedy být naplňovány a nebudou zobrazovány na stínítku. Není-li takováto vyloučená položka spojena pomocí klauzule REDEFINES s některou vybranou položkou, nebude během provádění příkazu ACCEPT změněna, kurzor nebude nikdy nastaven do úseku stínítka, který jí odpovídá, přičemž tento úsek stínítka bude během celého provádění příkazu ACCEPT zobrazovat tytéž znaky jako na začátku provádění tohoto příkazu ACCEPT. (Totéž platí i pro případné výplňkové byty.) Skupinová položka uvedená za slovem ACCEPT 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í vybrané podřízené elementární položky by však měly padnout dovnitř stínítka, jinak bude činnost příkazu ACCEPT ukončena s indikací chyby. Mezi vybranými 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 existovat takový pevný nebo proměnný počet vybraných položek, jak to odpovídá klauzulím OCCURS. Je-li za slovem ACCEPT 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 považována za jedinou vybranou položku a bude jí přidělen úsek stínítka určený pomocí klauzule AT. (Postupuje se stejně, jako kdyby se jednalo o skupinovou položku s jedinou podřízenou položkou.) Příkaz ACCEPT bude tedy naplňovat právě tuto elementární položku. Činnost příkazu ACCEPT: 1) Příkaz ACCEPT na začátku své činnosti (ani nikdy později) nemaže celou obrazovku, nýbrž na obrazovce zůstávají zobrazeny tytéž znaky jako před začátkem provádění příkazu ACCEPT. (Očekává se, že před příkazem ACCEPT provede uživatel "obrazovkový" příkaz DISPLAY, jímž nastaví stínítko tak, jak to bude vhodné pro operátora při naplňování vybraných položek při provádění příkazu ACCEPT.) 2) Příkaz ACCEPT na začátku své činnosti nastaví kurzor takto: Není-li ve SPECIAL-NAMES uvedena klauzule "CURSOR IS položka", bude kurzor nastaven na první byte úseku stínítka odpovídajícího první vybrané položce. Je-li ve SPECIAL-NAMES uvedena klauzule "CURSOR IS položka", bude kurzor nastaven na ten znak stínítka, jenž odpovídá hodnotě položky uvedené v této klauzuli (dále ji nazývejme CURSOR-položka) - platí zde přesně stejná pravidla jako pro položku uvedenou za slovem AT. Pokud však hodnota CURSOR-položky určuje znak stínítka ležící mimo všechny úseky odpovídající vybraným položkám (tedy např. do úseku odpovídajícího vyloučené položce nebo před začátek úseku odpovídajícího hlavní položce), bude kurzor nastaven na začátek nejblíže následujícího takového úseku. Pokud má CURSOR-položka nulovou hodnotu nebo ukazuje až za poslední z těchto úseků, bude kurzor nastaven na začátek úseku stínítka odpovídajícího první vybrané položce). Po úvodním vystavení kurzoru se výpočet přeruší a operátor nyní může zadávat obsah té vybrané položky, do jejíhož úseku stínítka ukazuje kurzor. 3) Při zadávání obsahu vybrané položky smí operátor zadávat datové znaky (jsou to všechny tisknutelné znaky, tzn. znaky s ASCII-kódem hexadecimálně 20-7E, tedy malá a velká písmena, číslice, interpunkční znaky atd.) a používat následující řídící klávesy: - klávesy pro posun kurzoru (šipka vpravo, šipka vlevo, šipka dolů, šipka nahoru), - klávesu "zpět o znak" (BS, hexadecimálně 08), - klávesu "zruš znak" (DEL, hexadecimálně 7F), - klávesu horizontální tabelátor (HT, hexadecimálně 09), - klávesu "návrat vozu" neboli ENTER (CR, hexadec. 0D), - klávesu "nový řádek" (LF, hexadecimálně 0A), - klávesu ESCAPE (ESC, hexadecimálně 1B). Datové znaky se zobrazí vždy na tom bytu stínítka, na němž právě stojí kurzor, načež se kurzor automaticky posune o jednu pozici vpravo. 4) Klávesa pro posun kurzoru vpravo se používá pro změnu polohy kurzoru uvnitř úseku stínítka odpovídajícího vybrané položce o jeden znak vpravo. Stiskne-li operátor tuto klávesu v okamžiku, kdy kurzor ukazuje na poslední byte vybrané položky, je zpracování této vybrané položky ukončeno (viz dále) a kurzor se přesune na první byte následující vybrané položky (všechny vyloučené položky popsané mezi nimi se přeskočí). (Za následující vybranou položku k poslední vybrané položce se považuje první vybraná položka - přejde se tedy na její začátek.) 5) Klávesa pro posun kurzoru vlevo se používá pro změnu polohy kurzoru uvnitř úseku stínítka odpovídajícího vybrané položce o jeden znak vlevo. Stiskne-li operátor tuto klávesu v okamžiku, kdy kurzor ukazuje na první byte vybrané položky, je zpracování této vybrané položky ukončeno (viz dále) a kurzor se přesune na poslední byte předcházející vybrané položky (všechny vyloučené položky popsané mezi nimi se přeskočí). (Za předcházející vybranou položku k první vybrané položce se považuje poslední vybraná položka - přejde se tedy na její konec.) 6) Klávesa pro posun kurzoru dolů ukončí zpracování právě zpracovávané vybrané položky a přesune kurzor na první byte následující vybrané položky. (Téhož účinku lze dosáhnout i pomocí několika šipek vpravo; šipka dolů však účinkuje rychleji.) 7) Klávesa pro posun kurzoru nahoru ukončí zpracovávání právě zpracovávané vybrané položky a přesune kurzor na první byte předcházející vybrané položky. (Téhož účinku lze dosáhnout i pomocí několika šipek vlevo; šipka nahoru však účinkuje rychleji.) 8) Při zadávání hodnoty pro určitou vybranou položku postupuje uživatel tak, že do úseku stínítka odpovídajícího položce nejdříve nechá (jakýmkoliv způsobem) nastavit kurzor, zadá v něm žádný, jeden nebo několik datových znaků a pak zpracování této položky ukončí některým z dále popsaných způsobů. Jednu a touž vybranou položku smí v rámci jednoho provádění příkazu ACCEPT zpracovat i vícekrát (přičemž každé takové zpracování je nezávislé na předcházejících zpracováních), některé položky přitom nemusí zpracovat vůbec. 9) Při zadávání hodnot do vybraných položek se rozlišují dva režimy práce. První z nich se nazývá volný formát, druhý pevný formát. Režim práce se určuje pro každou zpracovávanou položku zvlášť. (I v případě, že je v rámci jednoho provádění příkazu ACCEPT táž položka zpracovávána opakovaně, mohou být používány různé formáty.) 10) Volný formát je vhodný v případě, že operátor chce do položky zapsat zbrusu novou hodnotu, která má dosavadní starou hodnotu zcela přepsat. Při zápisu hodnoty do položky musí operátor dodržet tento postup: - Poté, co nechá do úseku stínítka odpovídajícího položce nastavit kurzor, smí se v něm sice pomocí kláves pro posun kurzoru vpravo nebo vlevo jakkoliv pohybovat, ale první datový znak musí zapsat na první pozici. - Každý další datový znak musí zapsat bezprostředně za předcházející datový znak (tedy druhý znak zapíše bezprostředně za první, n-tý bezprostředně za (n-1)-ní). Mezi zápisy jednotlivých datových znaků se však smí jakkoliv pohybovat v úseku pomocí kláves pro posun kurzoru vpravo nebo vlevo a smí též opravovat dosud zapsané datové znaky pomocí kláves BS a DEL (viz dále). Navíc smí vkládat datové znaky mezi doposud zadané datové znaky (viz dále). - Zrušit znak pomocí klávesy BS smí operátor pouze tehdy, ukazuje-li kurzor na kterýkoliv z dosud zapsaných datových znaků s výjimkou prvního nebo bezprostředně za dosud poslední zapsaný datový znak (při jiné pozici kurzoru nebo při pevném formátu je klávesa BS neúčinná). Klávesa BS pak způsobí zrušení znaku stojícího bezprostředně nalevo od kurzoru, posunutí všech následujících datových znaků o jeden byte vlevo a posun kurzoru o jeden byte vlevo (tedy na to místo, na němž stál rušený znak). - Zrušit znak pomocí klávesy DEL smí operátor pouze tehdy, ukazuje-li kurzor na kterýkoliv z dosud zapsaných datových znaků (při jiné pozici kurzoru nebo při pevném formátu je klávesa DEL neúčinná). Klávesa DEL pak způsobí zrušení toho znaku, na nějž ukazoval kurzor a posunutí všech následujících datových znaků o jeden byte vlevo (poloha kurzoru se nezmění). - Zruší-li operátor pomocí kláves BS a DEL všechny dosud zadané datové znaky, vzniká stejná situace, jako kdyby dosud nezadal žádný datový znak (kurzor zůstává nastaven na první byte položky). Ukončí-li nyní zpracovávání této vybrané položky, zůstane její obsah nezměněn. - Zadá-li operátor datový znak v případě, že kurzor ukazuje na některý z dosud zadaných datových znaků, tento datový znak se vloží na to místo, na něž ukazoval kurzor, a všechny následující datové znaky se posunou o jeden byte vpravo. (Pokud je tím úsek odpovídající položce zcela zaplněn, postupuje se stejně, jako kdyby k jeho zaplnění došlo normálním způsobem (viz dále).) - Operátor se tedy může kurzorem vrátit kamkoliv do dosud zadaných datových znaků, pomocí klávesy BS nebo DEL kterýkoliv z nich zrušit a pomocí datových kláves na kterékoliv místo libovolný počet datových znaků vložit; tím ještě neporušuje pravidla pro volný formát. Po provedení všech těchto oprav by měl buďto přesunout kurzor bezprostředně za dosud poslední zadaný datový znak a pokračovat v zadávání dalších datových znaků, anebo ukončit zpracování této vybrané položky. - Chce-li operátor obsah vybrané položky skutečně změnit, musí pro ni zadat alespoň jeden datový znak. (Nezadá-li ani jeden datový znak případně všechny zadané datové znaky zruší a opustí položku pomocí kterékoliv řídicí klávesy, zůstane obsah zpracovávané vybrané položky nezměněn.) - Operátor musí zadat méně datových znaků, než kolik činí délka položky. (Pokud operátor naplní úsek odpovídající položce zcela, předpokládá se většinou pevný formát. Výjimka nastává pouze u rozpakované numerické položky v případě, že zadaný text obsahuje tečku (při klauzuli DECIMAL-POINT IS COMMA čárku) nebo některý ze znaků + nebo -; pak se i při úplném zaplnění položky předpokládá volný formát.) - Operátor ukončí zadávání nové hodnoty stisknutím klávesy HT (horizontální tabelátor), čímž zároveň ukončuje zpracovávání této položky. V případě alfanumerické nebo alfanumerické editované položky se zadaná posloupnost datových znaků považuje za vnitřek alfanumerického literálu; tento literál bude přesunut do položky dle pravidel příkazu MOVE, přičemž se respektuje případná klauzule JUST a v případě alfanumerické editované položky se provádí edice. Takto vzniklá nová hodnota vybrané položky se okamžitě zobrazí na stínítku a kurzor se automaticky nastaví na první byte následující vybrané položky. V případě numerické položky musí mít zadaná posloupnost datových znaků tvar numerického literálu (viz 1.3.1.; navíc je přípustná i desetinná tečka na konci literálu, např. 325., a formát s E resp. e bez desetinné tečky, např. 12E5 nebo 12e-5; při DECIMAL-POINT IS COMMA je třeba místo desetinné tečky uvádět desetinnou čárku). Tento literál bude přesunut do položky dle pravidel příkazu MOVE. Takto vzniklá nová hodnota vybrané položky se okamžitě zobrazí na stínítku a kurzor se automaticky nastaví na první byte následující vybrané položky. Pokud však zadaná posloupnost datových znaků nepředstavuje přípustný numerický literál anebo pokud při přesunu do položky dochází k odřezávání nenulových cifer nebo záporného znaménka literálu, výsledný obsah položky bude nedefinován, na stínítku se na místě úseku odpovídajícího položce zobrazí samé otazníky a kurzor se přesune na první byte této vybrané položky (tzn. nepřechází se na další), čímž je operátor vybídnut, aby znovu a lépe zadal hodnotu této položky. Poznámka: Úsek stínítka přidělený položce je vždy přesně stejně dlouhý jako tato položka sama. Posloupnost datových znaků tvořící "literál" ve volném formátu, jenž má být přesunován do položky, musí být tedy kratší než položka (v případě rozpakované položky smí být i stejně dlouhý, obsahuje-li desetinnou tečku resp. čárku anebo znaménko). Je zřejmé, že toto omezení může znemožnit zadání určitých hodnot pomocí volného formátu: Např. při PIC S9V9 jsou přípustné "literály" jednoznakové (5) nebo na základě výjimky též dvojznakové s tečkou nebo se znaménkem (-5, .5, 5.); ostatní dvojznakové se zpracovávají v pevném formátu (zápis 56 tedy znamená hodnotu 5.6, zápis 5F znamená hodnotu -5.6, zápis 5@ znamená hodnotu -5.0) a víceznakové zápisy (5.6, -.6, -5.6, 6e-1, -56.E-1) jsou zcela nepřípustné. Pomocí pevného formátu lze ovšem zadat jakoukoliv hodnotu. 11) Pevný formát je vhodný v případě, že operátor nechce dosavadní hodnotu položky zcela přepsat novou hodnotou, nýbrž ji chce zachovat a pouze jeden nebo několik jejích znaků opravit. Pevný formát je použit, když operátor poruší některou z podmínek volného formátu: - První datový znak po začátku zpracování této vybrané položky zapíše jinam než na její první pozici. - Prvních n datových znaků sice zapsal postupně do první až n-té pozice, další datový znak však zapíše na pozici s pořadovým číslem vyšším než n+1. (Zapíše-li jej na pozici s pořadovým číslem menším než n+1, jedná se o vložení datového znaku mezi dosavadní datové znaky, jímž se ještě volný formát neporušuje.) - Zadá pro položku tolik datových znaků, kolik činí délka této položky, tzn. vyplní úsek stínítka odpovídající položce zcela (ať už postupně nebo vkládáním), takže zapíše datový znak i do posledního bytu tohoto úseku. Pak se (s jedinou výjimkou, viz výše) předpokládá pevný formát a po naplnění vybrané položky kurzor automaticky přejde na začátek následující vybrané položky. - Úsek stínítka odpovídající položce opustí jakýmkoliv jiným způsobem než stiskem klávesy horizontální tabelátor HT (tedy z ní vyjede kurzorem vlevo nebo vpravo nebo nahoru nebo dolů anebo ukončí provádění příkazu ACCEPT některou z kláves CR, LF nebo ESC). (Tento způsob opuštění úseku je nutno použít tehdy, když operátor chce opravit pouze první znak položky a tedy zapsal první datový znak v první pozici. Ukončení znakem HT by totiž znamenalo zadání ve volném formátu a tedy nikoliv opravu pouze prvního znaku, ale naplnění celého obsahu položky novou hodnotou!) Při začátku zpracovávání určité vybrané položky (tj. po nastavení kurzoru do jí odpovídajícího úseku stínítka) nejsou dosud porušeny podmínky pro volný formát. Dokud operátor tyto podmínky neporuší, je stále zachována možnost volného formátu, a proto se všechny zadávané datové znaky ukládají nikoliv přímo do vybrané položky, nýbrž do určitého pracovního pole. Ukončí-li operátor zpracovávání této položky, aniž podmínky pro volný formát porušil, bude položka naplněna dle výše uvedených pravidel volného formátu. Jakmile operátor podmínky pro volný formát poprvé poruší, přesunou se všechny předtím zadané datové znaky (byly-li jaké) z pracovního pole na začátek položky a veškeré další zpracovávání položky již probíhá v pevném formátu, aniž by se operátor mohl vrátit k volnému formátu (leda opuštěním úseku odpovídajícího položce a novým vstupem do něj). Při zpracovávání položky v pevném formátu je každý zadaný datový znak okamžitě přesunut na odpovídající pozici v položce a též zobrazen na stínítku; opravování položky se tedy provádí průběžně a nikoliv až na konci zpracovávání položky. Při pevném formátu nejsou prováděny žádné kontroly, zda obsah položky vzniklý opravami operátora odpovídá popisu této položky; lze tedy dát i numerické položce nenumerický obsah, je však pochopitelně nepřípustné s takto naplněnou položkou dále numericky pracovat. 12) Provádění příkazu ACCEPT končí, jakmile operátor stiskne klávesu "návrat vozu" (ENTER resp. CR) nebo "nový řádek" (LF) (tyto dvě klávesy jsou zde rovnocenné) anebo klávesu ESC. Stiskne-li operátor některou z těchto kláves při zpracovávání vybrané položky, pro niž již zadal nějaké datové znaky, bude tato položka naplněna v pevném (!) formátu, i kdyby dosud nebyly porušeny podmínky pro volný formát. Chce-li operátor naplnit poslední zpracovávanou položku ve volném formátu, musí její zpracovávání ukončit klávesou "tabelátor" (HT) a teprve potom stisknout klávesu ENTER (CR), LF nebo ESC. 13) Je-li v paragrafu SPECIAL-NAMES uvedena klauzule "CURSOR IS položka", přičemž na začátku provádění příkazu ACCEPT byla hodnota CURSOR-položky nenulová, bude po ukončení provádění příkazu ACCEPT do CURSOR-položky uložena hodnota odpovídající pozici kurzoru (dle vzorečku 100x+y resp. 1000x+y podle počtu znaků 9 v popisu CURSOR-položky; viz výše), jaká byla v okamžiku, kdy operátor příkaz ACCEPT ukončil. CURSOR-položka musí mít v PICTURE dostatečný počet znaků 9, aby mohla tuto hodnotu pojmout. Byla-li na začátku provádění příkazu ACCEPT hodnota CURSOR-položky nulová, zůstává i po ukončení provádění příkazu ACCEPT beze změny. 14) Je-li v paragrafu SPECIAL-NAMES uvedena klauzule "CRT STATUS IS položka", bude po ukončení provádění příkazu ACCEPT do prvního bytu této položky uložen znak '0' v případě ukončení činnosti příkazu ACCEPT klávesou ENTER (CR) nebo LF, znak '1' v případě ukončení činnosti příkazu ACCEPT klávesou ESC a znak '9' v případě ukončení činnosti příkazu ACCEPT v důsledku chyby (pokud neexistuje ani jedna vybraná položka nebo pokud hodnota argumentu uvedeného za AT ukazuje mimo stínítko anebo pokud zpracovávaná vybraná položka leží celá nebo částečně mimo stínítko). Příklad: Mějme skupinovou položku 01 A. 03 B PIC XXX. 03 FILLER PIC X(77). 03 C. 05 D PIC 9(6). 05 FILLER PIC X(10). 05 E PIC 999.99. a proveďme příkaz ACCEPT A AT 401. Pak položka A bude umístěna na stínítku od začátku 4. řádku (401 = 4 * 100 + 1, počítá se od jedné) asi takto: - - 1 | | 2 | | 3 | | 4 |XXX........................................| B,FILLER 5 |999999..........999.99 | D,FILLER,E 6 | | Pokud není v paragrafu SPECIAL-NAMES uvedena klauzule CURSOR, bude při zahájeni provádění příkazu ACCEPT kurzor nastaven na první "X" na 4.řádku. D) Získání data resp. času Formát 4: ACCEPT položka FROM { DATE | DAY | TIME } Funkce: Rezervované slovo DATE resp. DAY resp. TIME představuje vlastně rozpakovanou celočíselnou numerickou položku definovanou překladačem, která má tuto délku a obsah: 1) DATE: Má implicitní popis PIC 9(6) a obsahuje datum ve tvaru rrmmdd, kde rr jsou poslední dvě číslice roku, mm je měsíc, dd je den. (Např. 14. září 1991 bude mít DATE obsah 910914.) 2) DAY: Má implicitní PIC 9(5) a obsahuje datum ve tvaru rrttt, kde rr jsou poslední dvě číslice roku a ttt je pořadové číslo dne v roce. (Např. 7. března 1991 bude mít DAY obsah 91066.) 3) TIME: Má implicitní PIC 9(8) a obsahuje okamžitý čas (tzn. čas provádění tohoto příkazu ACCEPT) ve tvaru hhmmvvss, kde hh jsou hodiny, mm jsou minuty, vv jsou vteřiny a ss jsou setiny vteřiny. (Např. v 16 hodin 55 minut 7 vteřin 84 setin vteřiny bude mít TIME obsah 16550784.) Uvedená fiktivní položka DATE resp. DAY resp. TIME bude přesunuta do příjmové položky uvedené za slovem ACCEPT dle pravidel příkazu MOVE. Tato příjmová položka smí být zcela libovolná, nesmí však mít USAGE INDEX. Poznámka: Rezervovaná slova DATE, DAY a TIME jsou sice v jistém smyslu položkami definovanými překladačem (srv. 4.11.), smí však být uvedena výhradně v tomto formátu příkazu ACCEPT, nikoliv tedy v příkazu MOVE nebo CALL, v klauzuli SOURCE atd.