2.2. Driver MXC Jak již bylo uvedeno v odstavci 2.1. je pro překládání a sestavování cobolských programů v MX COBOLu k dispozici driver MXC. Tento driver musí být při zpracování přítomen v cobolském adresáři (viz kap.1 konfigurační soubor), který může být zpřístupněn pomocí příkazu PATH v souboru AUTOEXEC.BAT. Pomocí MXC driveru může uživatel provádět následující akce: - překlad cobolských programů (tj. programů s postfixem "cb"), - překlad programů psaných v jazyce C (tj. programů s postfixem "c"), - sestavení spustitelného programu (tj. programu s postfixem "exe"), který může být sestaven z modulů (tj. programů s postfixem "obj"), vzniklých překladem cobolským zdrojových programů nebo překladem programů v jazyce C, a z knihovních souborů (tj. programových jednotek s postfixem "lib"), které musí obsahovat moduly vzniklé překladem programů v C jazyce, a které jsou pomocí utility TLIB spojeny do knihovního souboru (viz dokumentace TURBO C), - zadat přepínače, kterými lze modifikovat činnost driveru MXC při zpracování zadaných programů. Volání driveru MXC má následující formát: MXC [-a] [-b] [-c] [-g] [-p] [-s] [-t] [-v] [-ojméno1] [zdroj1.cb ...] [zdroj2.c ...] [zdroj3.obj ...] [zdroj4.lib ...] Pravidla: 1) Jméno driveru MXC může být psáno podle konvencí MS-DOS jak velkými tak i malými písmeny. 2) Všechny parametry ve volání driveru MXC jsou volitelné. Zadá-li se pouze jméno driveru MXC, driver vypíše na zařízení stdout kompletní formát svého vyvolání spolu se stručným popisem jednotlivých parametrů. 3) Do první skupiny parametrů, které jsou uvozené znakem "-", patří tzv. přepínače, pomocí kterých lze modifikovat činnost driveru MXC pro daném volání. Všechny uvedené přepínače smí být uváděny za slovem MXC a před prvním parametrem, který neoznačuje přepínač. Jejich vzájemné pořadí je libovolné. 4) Jednoznakové přepínače a, b, c, g, p, s, t, v lze sdružovat do skupin, což je pouze jiná forma jejich zápisu (např. -abc má stejný význam jako -a -b -c). Jméno1 je parametr, který musí následovat vždy za přepínačem -o, od kterého může ale nemusí být oddělen jednou nebo více mezerami. 5) Druhá skupina parametrů, které jsou označeny jako zdroj1, ..., zdroj4, představuje jména programů, které mají být v daném volání driveru MXC zpracovány. Tyto parametry lze uvést v daném volání až za posledním uvedeným přepínačem, přičemž pořadí parametrů v této skupině je až na výsadní postavení prvního parametru zcela libovolné. 6) Parametry patřící do druhé skupiny, které mají postfix "cb" nebo nemají žádný postfix, považuje driver MXC za cobolské programy. Parametry, s postfixem "c" považuje driver za programy v jazyce C, parametry s postfixem "obj" považuje za object moduly, které vznikly překladem programu v jazyce C a konečně parametry s postfixem "lib" považuje driver za knihovny object modulů. Funkce: 1) Driver MXC po svém vyvolání nejprve zpracuje všechny přepínače uvedené na příkazovém řádku a modifikuje podle nich svoji další činnost. Dále postupně zpracovává všechny programové jednotky uvedené v tomto vyvolání v závislosti na jejich druhu. 2) Jednotlivé přepínače mají tyto funkce: -a - cobolské programy uvedené na příkazovém řádku mají být cobolským překladačem překládány tak, aby výsledný spustitelný program byl schopen animace (viz kap.3). -b - cobolské programy uvedené na příkazovém řádku mají být překládány pouze cobolským překladačem a nikoliv již překladačem TCC. V tomto případě je potlačeno také sestavení spustitelného programu. Tento přepínač je určen pro fázi ladění cobolských programů, které obsahují syntaktické chyby. -c - přepínač potlačuje sestavení spustitelného programu. -g - přepínač požaduje vytvoření protokolu o cobolském překladu, který bude uložen do souboru zdroj1.g. -p - programy v C jazyce, které vzniknou cobolským překladem, nebo jsou přímo uvedené na příkazovém řádku, mají být překládány s optimalizací. -s - programy zdroj1.c a zdroj1.d případně i zdroj1.t, které vzniknou cobolským překladem programu zdroj1.cb, mají zůstat zachovány v příslušném adresáři. Standardně se tyto programy ruší. -t - umožní překlad rozsáhlejších cobolských programů, které nelze přeložit překladačem TURBO C, z důvodu nedostatku paměti. Vedle standardně vytvářených souborů zdroj1.c a zdroj1.d vzniká cobolským překladem v tomto případě ještě soubor zdroj1.t. -v - cobolské programy uvedené na příkazovém řádku budou překládány cobolským překladačem tak, že žádný program zdroj1.c, který tímto překladem vznikne, nebude ve výsledném spustitelném programu obsahovat startovací adresu tj. nebude obsahovat funkci main(). Pokud však chceme, aby cobolský program zdroj1.cb obsahoval startovací adresu, musíme tento program uvést na příkazovém řádku jako vůbec první parametr ze druhé skupiny parametrů a zároveň nesmíme uvést parametr -v. Při sestavování výsledného spustitelného programu musí být dodržena zásada, že program, který má obsahovat startovací adresu, musí být cobolský program. Parametr -v současně také potlačuje sestavení spustitelného programu. Je určen pro situace, kdy se spustitelný program bude skládat z více cobolských programů. Každý takový program si můžeme nejprve připravit do tvaru object modulu s tím, že pouze jeden z nich bude obsahovat startovací adresu. -o - přepínač s parametrem jméno1 určuje jednak jméno výsledného spustitelného programu a zároveň také adresář (explicitně nebo implicitně vyjádřený), do kterého bude spustitelný program uložen. Jméno1 musí obsahovat i postfix "exe". Není-li přepínač uveden, jméno spustitelného programu se odvodí ze jména prvního programu uvedeného na příkazovém řádku změnou původního postfixu. 3) Po zpracování všech přepínačů začne driver MXC zpracovávat jednotlivé programy uvedené na příkazovém řádku. Akce prováděné s těmito programy (viz 2.1.) se od sebe liší podle jejich typu. 4) Cobolský program zdroj1.cb bude přeložen cobolským překladačem a pokud nebyly zjištěny syntaktické chyby eventuelně i překladačem jazyka C. Výsledný object modul bude zařazen do seznamu modulů, určených pro sestavení výsledného spustitelného programu. 5) Program zdroj2.c psaný v jazyce C bude přeložen překladačem jazyka C a pokud nebyly zjištěny syntaktické chyby, bude výsledný object modul zařazen do seznamu modulů, určených pro sestavení výsledného spustitelného programu. 6) Object modul zdroj3.obj bude zařazen do seznamu modulů, určených pro sestavení výsledného spustitelného programu. 7) Knihovna object modulů zdroj4.lib bude zařazena do seznamu modulů, určených pro sestavení výsledného spustitelného programu. 8) Je-li požadováno sestavení výsledného spustitelného programu, vyvolá driver MXC po zpracování všech parametrů druhé skupiny spojovací program TCC, který sestaví z předložených object modulů a knihoven object modulů výsledný spustitelný program a uloží ho do příslušného adresáře, jehož jméno je odvozeno ze jména tohoto programu (viz popis přepínačů -v, -o). Pak driver MXC ukončí svoji činnost. Příklady: Uvedeme několik příkladů vyvolání driveru MXC pro případy, které se budou v praxi pravděpodobně nejčastěji vyskytovat. Předpokládáme, že v daném okamžiku pracujeme s nějakým aktuálním adresářem, který obsahuje všechny programy uváděné na příkazových řádcích pouze svým jménem. mxc -b mtz.cb Program mtz.cb má být přeložen překladačem MX COBOL. Eventuální syntaktické chyby jsou hlášeny na zařízení stderr a jsou k dispozici v souboru mtz.f. mxc -cs mtz.cb Program mtz.cb má být přeložen překladačem MX COBOL a překladačem jazyka C. Eventuální syntaktické chyby jsou hlášeny na zařízení stderr a jsou k dispozici v souboru mtz.f. Pokud nebyly zjištěny syntaktické chyby, vytvoří se modul mtz.obj, který obsahuje funkci main(). Soubory mtz.c a mtz.d zůstanou zachovány. mxc -v pps1.cb pps2.cb pps3.cb Programy pps1.cb, pps2.cb a pps3.cb mají být přeloženy překladačem MX COBOL a překladačem jazyka C. Výsledkem činnosti, pokud nebyly zjištěny syntaktické chyby, jsou moduly pps1.obj, pps2.obj a pps3.obj, přičemž žádný z nich neobsahuje funkci main(). mxc -a mtz.cb Program mtz.cb má být přeložen překladačem MX COBOL a překladačem jazyka C a má být sestaven spustitelný program mtz.exe, který bude schopen animace. mxc -p odbyt1.cb odbyt2.cb odbyt3.cb Požaduje sestavení spustitelného programu odbyt1.exe, který se má skládat z modulů odbyt1.obj, odbyt2.obj a odbyt3.obj, přičemž modul odbyt1.obj bude obsahovat funkci main(). Jednotlivé moduly vzniknou překladem cobolských programů odbyt1.cb, odbyt2.cb a odbyt3.cb. Překlady pomocí překladače jazyka C budou prováděny s optimalizací. mxc -s -o faktura.exe faka.c lad\fakb.obj fakc.cb \vod\fakd Požaduje sestavení spustitelného programu faktura.exe, který se bude skládat z modulu faka.obj vzniklého překladem programu faka.c, z modulu lad\fakb.obj a z modulů fakc.obj a \vod\fakd.obj vzniklých překladem z programů fakc.cb a \vod\fakd. Uživatel v tomto případě zodpovídá za to, že jeden z modulů faka.obj nebo lad\fakb.obj obsahuje funkci main(). V příslušných adresářích budou zachovány soubory fakc.c, fakc.d, fakd.c a fakd.d, které vzniknou cobolským překladem programů fakc.cb a fakd.cb. mxc -o\rutina\ucet.exe uc1.obj uc2.obj uc3.obj knih\ucet.lib Požaduje sestavení spustitelného programu ucet.exe, který bude uložen do adresáře \rutina. Má se skládat ze tří modulů uc1.obj, uc2.obj a uc3.obj, které se nacházejí v aktuálním adresáři a dále z modulů, které spojovací program vybere z knihovního souboru ucet.lib z adresáře knih. Uživatel musí zajistit, že některý z modulů uvedených na příkazovém řádku obsahuje funkci main(). 2.3. Protokol o překladu Protokol o překladu je vypisován do souboru, jenž vznikne ze jména zdrojového programu nahrazením přípony cb příponou g (tedy při zdrojovém programu se jménem josef.cb bude vytvořen soubor josef.g obsahující protokol). Tento soubor obsahující protokol se vytváří právě tehdy, je-li ve volání překladače MX COBOL zadán přepínač -g. Protokol o překladu se skládá ze tří částí (protokol o zdrojovém programu, adresář položek a protokol o syntaktických chybách). Není však možné nechat vypsat jen některou z těchto částí; při zadání přepínače -g se vypisuje úplný protokol, při nezadání přepínače -g se nevypisuje žádný protokol. Protokol o překladu není rozdělen do stránek; předpokládá se, že při případném tisku tohoto protokolu na tiskárně zadá sám uživatel vhodné stránkování pro použitý vypisovací program. První řádek protokolu tvoří hlavička obsahující tyto údaje: a) Jméno překladače (MX COBOL) a jeho číslo verse (VERSE=m.n). b) Jméno zdrojového cobolského programu (nikoliv tedy jméno z paragrafu PROGRAM-ID!), např. ZDROJ = josef.cb. c) Datum (dd/mm/rr) a čas (hh:mm:ss) při začátku překladu. Protokol o zdrojovém programu Každému řádku zdrojového programu je věnován jeden řádek protokolu s tímto obsahem: a) Čtyřmístné pořadové číslo zdrojového řádku přidělené překladačem (počínaje 0001). Kdekoliv se dále v protokolu (např. v referencích, v protokolu o syntaktických chybách nebo v cílovém C-programu při CBL ZDROJ) případně ve stopě programu (viz READY TRACE) anebo v jiných hlášeních vypisuje pořadové číslo řádku, vždy se tím rozumí právě toto pořadové číslo řádku přidělené překladačem nezávisle na tom, zda a jak má uživatel očíslovány zdrojové řádky ve sloupcích 1-6 nebo 73-80 (týká se štítkového formátu). Toto pořadové číslo řádku se zvyšuje (po 1) průběžně i přes všechny zdroje zařazené pomocí pseudopříkazů COPY (i kdyby měly klauzuli SUPPRESS, takže by se jimi zařazené řádky v protokolu neotiskly). b) Pokud se jedná o řádek z PROCEDURE DIVISION obsahující tečku ukončující rozsah příkazu IF nebo ON, příkazu PERFORM bez procedury nebo příkazu s některou z klauzulí ON SIZE ERROR, AT END, INVALID KEY, ON OVERFLOW nebo NO DATA, vypíše se bezprostředně za pořadové číslo znak # (cílem tohoto znaku je, aby uživatel mohl rychle a bez nebezpečí omylu najít tečku ukončující rozsah takovéhoto příkazu). c) Vlastní zdrojový řádek. Při terminálovém formátu se bere plný řádek (od prvního do posledního znaku). Při štítkovém (klasickém) formátu se vezme pouze jeho významná část od 7. do 72.sloupce, přičemž se navíc odříznou jeho koncové mezery před 72.sloupcem (s výjimkou případu, že na tomto zdrojovém řádku začíná alfanumerický literál, jenž pokračuje na následujícím řádku). Tento opis zdrojového řádku se liší od skutečného tvaru zdrojového řádku pouze ve slovech změněných účinkem pseudopříkazu REPLACE nebo klauzulí ATTRIBUTE resp. REPLACING z pseudopříkazu COPY. d) Vpravo od opisu zdrojového řádku, na němž je použit jeden nebo více objektů z DATA DIVISION (položek, podmínkových jmen, speciálních indexů, souborů, třídicích souborů, komunikačních oblastí nebo sestav), se vypíše znak | a za ním pořadová čísla těch zdrojových řádků, na nichž jsou tyto objekty popsány. Evidují se takto všechna použití objektů v PROCEDURE DIVISION a dále použití v klauzulích RENAMES, CONTROL, TYPE a RESET (nikoliv SOURCE, SUM a UPON). Při uvedení kvalifikace se vypisuje pořadové číslo pouze pro jméno stojící jako první slovo v kvalifikační řadě, nikoliv pro jména použitá jako kvalifikátory. Vypisují se však pořadová čísla i pro položky uvedené jako indexy. U každého zdrojového řádku se vypisuje až 10 pořadových čísel, případná další pořadová čísla se nevypisují. I kdyby řádek protokolu včetně těchto pořadových čísel přesáhl 80 bytů, nebude rozdělen do několika řádků. Je-li jméno objektu posledním slovem na zdrojovém řádku, přičemž za ním není tečka (nebo je-li takto umístěn poslední člen kvalifikace anebo přechází-li dokonce kvalifikace na následující řádek), vypisuje se odpovídající pořadové číslo řádku až u následujícího zdrojového řádku. Přesněji: Pořadové číslo se vypisuje u toho zdrojového řádku, na němž leží první slovo (což může být i tečka, závorka nebo operátor) nepatřící ke kvalifikaci. Poznámka: V protokolu o zdrojovém programu se nevypisují zdrojové řádky pocházející ze zdrojových textů zařazených pomocí pseudopříkazů COPY s klauzulí SUPPRESS.