16. PARAMETRY CBL Funkce: Pomocí parametrů CBL může uživatel modifikovat některé funkce překladače, které nemohou být ovlivněny pomocí ostatních klauzulí a příkazů jazyka. Formát: [ CBL parametr ... ] ... Pravidla: 1) Zápis musí začínat reservovaným slovem CBL, uvedeným kdekoliv v poli A nebo B na zdrojovém řádku. Za tímto slovem CBL musí následovat po alespoň jedné mezeře buďto jediný parametr nebo několik parametrů. Jsou přípustné pouze ty parametry, které jsou popsány v jednotlivých odstavcích této kapitoly. Za kterýmkoliv parametrem smí být kterýkoliv z oddělovačů mezera, čárka, středník nebo tečka (případně ampersand nebo přechod na nový zdrojový řádek). 2) Na pořadí parametrů nezáleží (pokud se ovšem navzájem neruší, jako např. CBL CZECH a CBL ENGLISH; v takovém případě platí později zadaný). 3) Je přípustné uvést i několik zápisů CBL, přičemž každý z nich může mít jeden parametr nebo několik parametrů. Nezáleží na tom, jak jsou jednotlivé parametry rozmístěny v jednotlivých zápisech CBL. 4) Všechny zápisy CBL musí být uvedeny na začátku zdrojového cobolského programu, ještě před záhlavím IDENTIFICATION DIVISION. Příklad: Zdrojový cobolský program může začínat třeba takto: CBL FLAGE CBL TALLY ALIGN SUM CBL QUOTE IDENTIFICATION DIVISION. : 16.1. Parametr CBL QUOTE Funkce: Parametr CBL QUOTE způsobí, že figurativní konstanta QUOTE resp. QUOTES bude mít význam jedné nebo několika uvozovek (") namísto standardních apostrofů ('). Poznámka: Ve většině ostatních implementací jazyka COBOL má parametr CBL vliv na způsob zápisu alfanumerických literálů: alfanumerické literály se standardně ohraničují pomocí apostrofů ('PRAHA'), zatímco při zadání parametru CBL QUOTE pomocí uvozovek ("PRAHA"). V COBOLu MX lze používat oba způsoby (i v témže zdrojovém programu) nezávisle na tom, zda je či není zadán parametr CBL QUOTE. Protože figurativní konstanta se v praxi používá velmi zřídka, stává se tím parametr CBL QUOTE prakticky bezvýznamným. 16.3. Parametr CBL NOMUL Funkce: Parametr CBL NOMUL potlačuje kontrolu jednoznačnosti uvedeného jména položky resp. kvalifikační řady; jakmile při prohledávání adresáře překladač najde hledané jméno (resp. kvalifikační řadu) poprvé, použije nalezený objekt a zbytek adresáře již neprohledává (při neuvedení parametru CBL NOMUL se zbytek adresáře vždy prohledává za účelem ohlášení chyby v případě, že by se totéž jméno resp. kvalifikační řada našly ještě jednou). Použití: Při zadání parametru CBL NOMUL tedy uživatel nedostává hlášení o nejednoznačném jméně položky resp. nejednoznačné kvalifikační řadě; překlad se ovšem zrychlí a to u rozsáhlých programů často i velmi výrazně. Lze tedy doporučit používání parametru CBL NOMUL pouze pro částečně odladěné programy, u nichž již byly všechny víceznačnosti odstraněny. I tehdy je však vhodné po několika opravách nechat program pro jistotu přeložit bez parametru CBL NOMUL. U malých a středních programů s nejvýše několika desítkami položek nemá smysl parametr CBL NOMUL používat. 16.4. Parametr CBL TRUNC Funkce: Parametr CBL TRUNC určuje, jakým způsobem bude do příjmové binární položky s maximálně devíti znaky 9 v PICTURE dosazován výsledek aritmetického výrazu resp. aritmetického příkazu, který má více cifer před tečkou než příjmová položka (takže může obsahovat více platných cifer před tečkou než příjmová položka). Bez parametru CBL TRUNC bude výsledek uložen do příjmové položky bez odřezání těchto případných nadbytečných cifer (provede se pouze přesun jednoho "shortu" resp. "longu" do druhého), což je sice velmi rychlé, ovšem dosazená hodnota příjmové binární položky může přesáhnout maximální přípustnou hodnotu odpovídající popisu (dle počtu znaků 9 v PICTURE). Při ukládání hodnoty, která je v absolutní hodnotě větší než 2147483647 může získat příjmová binární položka zcela nedefinovanou hodnotu. Při uvedení parametru CBL TRUNC budou případné nadbytečné cifry výsledku při přesunu do příjmové položky odřezány; toto odřezávání však pochopitelně výrazně zpomaluje přesun. Při dosazování hodnot do binárních položek při provádění příkazů SET, SEARCH (s VARYING), INSPECT (s TALLYING), STRING (s POINTER), UNSTRING (s POINTER nebo s TALLYING), ACCEPT (při naplňování CURSOR-položky), READ a WRITE (při naplňování RELATIVE-položky) se ani při CBL TRUNC ani bez něj odřezávání nadbytečných cifer neprovádí. Použití: Parametr CBL TRUNC zaručuje odřezávání nadbytečných dekadických cifer před desetinnou tečkou. Takovéto cifry však vznikají při výpočtu zcela výjimečně, a to ještě prakticky vždy v důsledku logické chyby uživatele (když binární příjmová položka má nedopatřením příliš málo znaků 9 v PICTURE anebo získá neočekávaně velkou hodnotu). Je pravděpodobné, že uživatel v takovém případě nestojí ani o hodnotu neseříznutou, tím méně pak o hodnotu seříznutou pomocí CBL TRUNC. Přitom parametr CBL TRUNC prodlužuje přeložený program a zpomaluje výpočet. Parametr CBL TRUNC má proto význam snad jen při nějakých neobvyklých akcích anebo při snaze o dosažení naprosté kompatibility např. s COBOLem DOS, jenž má funkci parametru CBL TRUNC jako standardní. Poznámka: Příkaz MOVE provádí odřezání nadbytečných cifer vždy, parametr CBL TRUNC na něj nemá žádný vliv. 16.7. Parametr CBL CALL Funkce: Parametr CBL CALL modifikuje způsob, jímž se překládá příkaz CALL, a to tak, aby se vyvolané funkci předávala i délka a typ každého argumentu. Není-li uveden parametr CBL CALL, bude pro každý argument uvedený za USING v příkazu CALL předáván vyvolané funkci jediný parametr, jenž bude většinou obsahovat adresu zadaného argumentu. Začíná-li externí jméno uvedené za slovem CALL písmeny IC nebo ic, bude za parametry s adresami zadaných argumentů vyvolané funkci předáno ještě jednou tolik parametrů vyjadřujících délky argumentů uvedených za USING (typu "long"; viz 11.1.). Při uvedení parametru CBL CALL budou vyvolané funkci předávány parametry s délkami zadaných argumentů tak jak je popsáno výše (a v 11.1.), a to při každém příkazu CALL nezávisle na tom, zda externí jméno uvedené za slovem CALL začíná písmeny IC resp. ic nebo ne. Za těmito parametry s délkami pak bude vyvolané funkci předáno ještě jednou tolik parametrů vyjadřujících zakódované typy argumentů uvedených za USING (typu "unsigned char"). Každý z těchto parametrů bude mít následující strukturu: a b c d e f g h --------------------------------- a = 0 ... jedná se o první až předposlední argument za USING 1 ... jedná se o poslední argument za USING b = 1 ... jedná se o argument schopný nabývat záporných numerických hodnot (rozpakovaná, pakovaná nebo binární položka se znakem S v PICTURE, dlouhá, krátká nebo znaková exponenciální položka, numerická editovaná položka se znaky +, -, CR nebo DB v PICTURE, položka s USAGE INDEX, speciální index nebo numerický literál se znaménkem + nebo -) 0 ... jedná se o argument neschopný nabývat záporných numerických hodnot (skupinová, alfanumerická nebo alfanumerická editovaná položka, rozpakovaná, pakovaná nebo binární položka bez S v PICTURE, numerická editovaná položka bez +, -, CR, DB v PICTURE, soubor, třídicí soubor, (externí-jméno), komunikační oblast, /položka, argument opatřený *, **, ***, < nebo <<, alfanumerický literál nebo numerický literál bez znaménka + nebo -) c = 1 ... jedná se o alfanumerickou nebo alfanumerickou editovanou položku s klauzulí JUST (JUSTIFIED) 0 ... jedná se o argument bez klauzule JUST (JUSTIFIED) defgh = 00100 .. skupinová položka 00101 .. alfanumerická položka nebo alfanum.literál 00001 .. alfanumerická editovaná položka 01000 .. rozpakovaná položka 01001 .. pakovaná položka (USAGE COMP-3) nebo num. literál (ukládá se v pakovaném tvaru) 01011 .. binární položka (USAGE COMP) 01110 .. exponenciální krátká položka (USAGE COMP-1) 01111 .. exponenciální dlouhá položka (USAGE COMP-2) 01100 .. exponenciální znaková položka 10001 .. numerická editovaná položka 10010 .. položka s USAGE INDEX 10110 .. speciální index 11001 .. soubor (FD) nebo třídicí soubor (SD) 11010 .. externí jméno uzavřené v závorkách 11011 .. argument opatřený *, **, ***, < nebo << 11100 .. komunikační oblast (CD) 11110 .. /položka Parametr CBL CALL je implementován především kvůli přenositelnosti programů z COBOLu DOS-3 obsahujících tento parametr a též programů z COBOLu MOS využívajících předávané délky argumentů. (Upozorňujeme, že typy argumentů se v COBOLu MX předávají jiným způsobem než v COBOLu DOS-3 a délky argumentů se předávají jiným způsobem než v COBOLu MOS, což je nutno respektovat při převodu assemblerovských podprogramů do jazyka C.) Pokud volaný program předávané délky argumentů nevyužívá (jak je tomu vždy, není-li napsán v jazyce C), nemůže být jeho činnost "nadbytečným" předáváním délek a zakódovaných typů argumentů ovlivněna. Parametr CBL CALL způsobuje předávání délek a zakódovaných typů argumentů ve všech příkazech CALL v celém překládaném zdrojovém programu. Chce-li uživatel předávat tyto informace pouze u některých příkazů CALL a u ostatních nikoliv, pak nepoužije parametr CBL CALL a předávané délky a zakódované typy vyjádří dalšími argumenty uvedenými za USING (nejlépe s *, **, < a <<). Příklad: CBL CALL IDENTIFICATION DIVISION. : FD SOUB. : 01 GR. 02 DI PIC 999. 02 AN PIC X(5). 02 PA PIC S99V99 COMP-3 OCCURS 500 INDEXED SI. 02 ED COMP-2 SYNC. : CALL 'LEV' USING SOUB GR DI AN PA(I) ED SI (EXT) '123' -52.38. Tento příkaz CALL bude přeložen do jazyka voláním funkce asi takovéhoto tvaru (kde a,b,c,e,f jsou celá čísla a d je celočíselný výraz): (void)LEV(&F[a],W+b,W+b,W+c,W+d,W+e,&S[f],&EXT,"123", "\x05\x23\x84",0L,1520L,3L,5L,3L,8L,0L,3L,3L, 0X19,0X04,0X08,0X05,0X49,0X4F,0X56,0X1A,0X05,0XC9); 16.7. Parametr CBL CALL Funkce: Parametr CBL CALL modifikuje způsob, jímž se překládá příkaz CALL, a to tak, aby se vyvolané funkci předávala i délka a typ každého argumentu. Není-li uveden parametr CBL CALL, bude pro každý argument uvedený za USING v příkazu CALL předáván vyvolané funkci jediný parametr, jenž bude většinou obsahovat adresu zadaného argumentu. Začíná-li externí jméno uvedené za slovem CALL písmeny IC nebo ic, bude za parametry s adresami zadaných argumentů vyvolané funkci předáno ještě jednou tolik parametrů vyjadřujících délky argumentů uvedených za USING (typu "long"; viz 11.1.). Při uvedení parametru CBL CALL budou vyvolané funkci předávány parametry s délkami zadaných argumentů tak jak je popsáno výše (a v 11.1.), a to při každém příkazu CALL nezávisle na tom, zda externí jméno uvedené za slovem CALL začíná písmeny IC resp. ic nebo ne. Za těmito parametry s délkami pak bude vyvolané funkci předáno ještě jednou tolik parametrů vyjadřujících zakódované typy argumentů uvedených za USING (typu "unsigned char"). Každý z těchto parametrů bude mít následující strukturu: a b c d e f g h --------------------------------- a = 0 ... jedná se o první až předposlední argument za USING 1 ... jedná se o poslední argument za USING b = 1 ... jedná se o argument schopný nabývat záporných numerických hodnot (rozpakovaná, pakovaná nebo binární položka se znakem S v PICTURE, dlouhá, krátká nebo znaková exponenciální položka, numerická editovaná položka se znaky +, -, CR nebo DB v PICTURE, položka s USAGE INDEX, speciální index nebo numerický literál se znaménkem + nebo -) 0 ... jedná se o argument neschopný nabývat záporných numerických hodnot (skupinová, alfanumerická nebo alfanumerická editovaná položka, rozpakovaná, pakovaná nebo binární položka bez S v PICTURE, numerická editovaná položka bez +, -, CR, DB v PICTURE, soubor, třídicí soubor, (externí-jméno), komunikační oblast, /položka, argument opatřený *, **, ***, < nebo <<, alfanumerický literál nebo numerický literál bez znaménka + nebo -) c = 1 ... jedná se o alfanumerickou nebo alfanumerickou editovanou položku s klauzulí JUST (JUSTIFIED) 0 ... jedná se o argument bez klauzule JUST (JUSTIFIED) defgh = 00100 .. skupinová položka 00101 .. alfanumerická položka nebo alfanum.literál 00001 .. alfanumerická editovaná položka 01000 .. rozpakovaná položka 01001 .. pakovaná položka (USAGE COMP-3) nebo num. literál (ukládá se v pakovaném tvaru) 01011 .. binární položka (USAGE COMP) 01110 .. exponenciální krátká položka (USAGE COMP-1) 01111 .. exponenciální dlouhá položka (USAGE COMP-2) 01100 .. exponenciální znaková položka 10001 .. numerická editovaná položka 10010 .. položka s USAGE INDEX 10110 .. speciální index 11001 .. soubor (FD) nebo třídicí soubor (SD) 11010 .. externí jméno uzavřené v závorkách 11011 .. argument opatřený *, **, ***, < nebo << 11100 .. komunikační oblast (CD) 11110 .. /položka Parametr CBL CALL je implementován především kvůli přenositelnosti programů z COBOLu DOS-3 obsahujících tento parametr a též programů z COBOLu MOS využívajících předávané délky argumentů. (Upozorňujeme, že typy argumentů se v COBOLu MX předávají jiným způsobem než v COBOLu DOS-3 a délky argumentů se předávají jiným způsobem než v COBOLu MOS, což je nutno respektovat při převodu assemblerovských podprogramů do jazyka C.) Pokud volaný program předávané délky argumentů nevyužívá (jak je tomu vždy, není-li napsán v jazyce C), nemůže být jeho činnost "nadbytečným" předáváním délek a zakódovaných typů argumentů ovlivněna. Parametr CBL CALL způsobuje předávání délek a zakódovaných typů argumentů ve všech příkazech CALL v celém překládaném zdrojovém programu. Chce-li uživatel předávat tyto informace pouze u některých příkazů CALL a u ostatních nikoliv, pak nepoužije parametr CBL CALL a předávané délky a zakódované typy vyjádří dalšími argumenty uvedenými za USING (nejlépe s *, **, < a <<). Příklad: CBL CALL IDENTIFICATION DIVISION. : FD SOUB. : 01 GR. 02 DI PIC 999. 02 AN PIC X(5). 02 PA PIC S99V99 COMP-3 OCCURS 500 INDEXED SI. 02 ED COMP-2 SYNC. : CALL 'LEV' USING SOUB GR DI AN PA(I) ED SI (EXT) '123' -52.38. Tento příkaz CALL bude přeložen do jazyka voláním funkce asi takovéhoto tvaru (kde a,b,c,e,f jsou celá čísla a d je celočíselný výraz): (void)LEV(&F[a],W+b,W+b,W+c,W+d,W+e,&S[f],&EXT,"123", "\x05\x23\x84",0L,1520L,3L,5L,3L,8L,0L,3L,3L, 0X19,0X04,0X08,0X05,0X49,0X4F,0X56,0X1A,0X05,0XC9); 16.8. Parametr CBL FLAGE Funkce: Je-li uveden parametr CBL FLAGE, pak překladač nehlásí chyby závažnosti 0 (tzv. upozornění) a zdrojový program, jehož všechny syntaktické chyby jsou závažnosti 0, považuje za program bez syntaktických chyb. 16.9. Parametr CBL TALLY Funkce: Parametr CBL TALLY způsobí, že příkazy READ pro soubory s RECORDING V nebo RECORDING U a dále příkazy RETURN pro třídicí soubory s RECORDING V dosadí do položky TALLY délku přečtené logické věty (bez dvoubytového řídicího pole délky). Pokud však při provádění takového příkazu READ resp. RETURN nebyla logická věta přečtena v důsledku mimořádného stavu (např. uplatnění klauzule AT END resp. INVALID KEY nebo vyvolání deklarativní sekce), zůstane původní hodnota položky TALLY nezměněna. Příklad: FD SOUB RECORDING V. 01 VETA. 02 ZNAK PIC X OCCURS 4998 DEPENDING TALLY. Je-li uveden parametr CBL TALLY, příkaz READ SOUB po úspěšném přečtení logické věty a jejím uložení od začátku položky VETA ještě uloží (čistou) délku přečtené logické věty do položky TALLY. Tím ovšem položka VETA získá délku právě rovnou délce přečtené logické věty, takže bude obsahovat právě tuto logickou větu a žádné jiné byty. Poznámka: Pro soubory s RECORDING F se parametr CBL TALLY neuplatní, takže příkazy READ nebudou ukládat délku logické věty do TALLY. Přesto se může stát, že uživatel délku logické věty nezná (např. při zařazování popisu 01 pomocí COPY nebo když očekává, že se délka věty tohoto souboru při pozdějších změnách koncepce změní) a v programu ji potřebuje. Může ji pak získat příkazem INSPECT VETA TALLYING TALLY = CHARACTERS nebo příkazem UFO *TALLY '='