17.26. ICIDENT Funkce: Příkaz CALL 'ICIDENT' ztotožní zadanou položku z LINKAGE SECTION nebo z FILE SECTION se zadaným argumentem. Způsob volání: CALL 'ICIDENT' USING položka argument [VALUE | increment]... Pravidla: První argument "položka" musí být položka z LINKAGE SECTION nebo z FILE SECTION s číslem úrovně 01 nebo 77. Příkaz CALL 'ICIDENT' ztotožní tuto položku s úsekem paměti určeným následujícími argumenty. Druhým argumentem "argument" smí být zcela libovolný argument přípustný v obecném příkazu CALL, jenž vyjadřuje adresu nějakého úseku paměti; tedy položka, speciální index, literál, jméno souboru, jméno třídicího souboru, externí jméno uvedené v závorkách (případně i s *), jméno komunikační oblasti nebo /položka. Nenásleduje-li za druhým argumentem žádný další argument, bude položka uvedená jako první argument ztotožněna s úsekem paměti odpovídajícím druhému argumentu (tzn. adresa tohoto úseku paměti bude uložena do ukazatele přiděleného uvedené položce; srv. 4.9., 4.4. a 17.4.). Za druhým argumentem může následovat libovolná posloupnost reservovaných slov VALUE a tzv. "incrementů", jimiž mohou být celočíselné numerické literály a celočíselné numerické položky (jejich hodnota smí být i záporná). Každý z prvků této posloupnosti se postupně (v tom pořadí, v jakém jsou uvedeny v příkazu CALL) aplikuje na adresu odpovídající druhému argumentu; výsledkem každé této aplikace musí být opět adresa. Výsledná adresa vzniklá aplikací všech těchto prvků pak bude dosazena do ukazatele přiděleného položce uvedené jako první argument; musí to tedy být adresa úseku paměti, s nímž má být tato položka ztotožněna. a) Reservované slovo VALUE vyžaduje, aby na dosud získané adrese (tj. adrese odpovídající druhému argumentu resp. získané předešlými aplikacemi) začínal ukazatel (musí se tedy jednat o tzv. adresu druhého řádu). Aplikací slova VALUE získáváme adresu obsaženou v tomto ukazateli, tzn. adresu toho úseku paměti, na niž tento ukazatel ukazuje. b) Aplikací "incrementu" získáváme adresu rovnou součtu dosud získané adresy (tj. adresy odpovídající druhému argumentu resp. získané předešlými aplikacemi) a hodnoty "incrementu". Po provedení příkazu CALL 'ICIDENT', jenž přidělil položce uvedené za USING vhodný úsek paměti, lze s touto položkou (jakož i s položkami k ní podřízenými a s položkami ji redefinujícími) libovolně pracovat. Poznámka: Příkaz CALL 'ICIDENT' je překládán nikoliv voláním nějaké funkce, nýbrž přiřazovacím příkazem jazyka C, jenž přiřazuje ukazateli příslušnou hodnotu; je tedy maximálně optimalizován. Žádný podprogram ICIDENT neexistuje a není dodáván. Příklady: Nechť A je položka s číslem úrovně 01 nebo 77 z LINKAGE SECTION nebo z FILE SECTION. 1) CALL 'ICIDENT' USING A B. Položka A bude ztotožněna s argumentem B. (Přesněji: s úsekem paměti začínajícím na adrese odpovídající začátku argumentu B. Při zpracovávání položky A bude ovšem tento úsek paměti zpracováván v délce odpovídající popisu položky A nezávisle na popisu argumentu B.) Argument B může být položka, speciální index, jméno souboru, jméno třídicího souboru nebo jméno komunikační oblasti. 2) CALL 'ICIDENT' USING A ALFA(I J K). Položka A bude ztotožněna s položkou ALFA(I J K). Mají-li položky A a ALFA stejné popisy (včetně podřízených položek), můžeme pak až do změny indexů používat položku A namísto položky ALFA(I J K) a položky podřízené k A namísto položek podřízených k ALFA(I J K), čímž zabráníme opakovanému indexování s týmiž hodnotami indexů. Toto indexování se provede pouze jednou, a to při provádění příkazu CALL 'ICIDENT'. Tato taktika je výhodnější než přesun položky ALFA(I J K) do pracovní neindexované položky, neboť je rychlejší, nevyžaduje paměť pro tuto pracovní položku a navíc umožňuje provádět v položce ALFA(I J K) změny bez nutnosti provádět zpětný přesun. 3) CALL 'ICIDENT' USING A (EXTPOLE). Položka A bude ztotožněna s externím polem EXTPOLE, které může ležet v kterémkoliv jiném programu napsaném v jazyce, jenž umí předat adresu pole jakožto "nabídku" pro spojovací program (nejspíše tedy v jazyce C). 4) CALL 'ICIDENT' USING A *(EXTFELD). Uživatel musí (např. pomocí příkazu UFD) zařadit do přeloženého programu takovou deklaraci proměnné EXTFELD, aby tato proměnná byla externím ukazatelem nebo externím polem. Položka A bude ztotožněna s úsekem paměti, jehož adresa je obsažena v tomto externím ukazateli, resp. s tímto externím polem. 5) CALL 'ICIDENT' USING A SOUBOR. Položka A se ztotožní se strukturou "sdtf" souboru SOUBOR. Má-li položka A popsána podřízenou strukturu odpovídající struktuře "sdtf", může pak uživatel využívat i měnit libovolný údaj ve struktuře "stdf" tohoto souboru (takovouto akci by však bylo lépe provádět příkazem UFO). 6) CALL 'ICIDENT' USING A 'PRAHA'. Položka A bude ztotožněna s literálem 'PRAHA' (tj. se šestibytovým úsekem statické paměti obsahujícím literál PRAHA a binární nulu). 7) CALL 'ICIDENT' USING A B VALUE. Argument B musí být (nebo alespoň začínat) ukazatelem obsahujícím adresu vhodného úseku paměti; s tímto úsekem paměti bude položka A ztotožněna. Přitom B může být libovolná alespoň čtyřbytová položka; cobolský program může dopravit adresu argumentu USEK na první čtyři byty položky B např. pomocí příkazu UFO '*(char**)(' B ')=' USEK ';' #A# 8) CALL 'ICIDENT' USING A RETURN-CODE VALUE. Položka A bude ztotožněna s úsekem paměti, jehož adresa je uložena v položce RETURN-CODE. (Zřejmě ji tam uložil nějaký program pracující současně s naším programem nebo před ním. Cobolský program může dopravit adresu argumentu USEK do položky RETURN-CODE např. pomocí příkazů UFO '*(char**)(' TALLY ')=' USEK ';' #0A# MOVE TALLY TO RETURN-CODE. 9) CALL 'ICIDENT' USING A (EXTPOLE) VALUE. Externí pole EXTPOLE musí začínat ukazatelem; položka A bude ztotožněna s úsekem paměti, jehož adresa je uložena v tomto ukazateli. 10) CALL 'ICIDENT' USING A B N. Položka A se ztotožní s úsekem paměti, jehož adresa je rovna součtu adresy argumentu B a hodnoty celočíselné numerické položky N, tzn. s úsekem paměti začínajícím na (N+1)-ním bytu argumentu B. Tento úsek paměti smí ležet zcela nebo částečně mimo argument B (např. je-li hodnota položky N záporná nebo větší resp. rovna délce argumentu B). Místo položky N by mohl být i celočíselný numerický literál, např. 24 nebo -100 apod. 11) CALL 'ICIDENT' USING A A 12. Položka A musela mít už z dřívějška přidělen úsek paměti. Nyní bude ztotožněna s úsekem paměti začínajícím na 13.bytu tohoto dosavadního úseku paměti, takže se vlastně v paměti posune o 12 bytů vpravo (při "USING A A N" by se posunula o N bytů vpravo apod.). Položka A představuje tedy jakési "ukazovátko" resp. "okénko" do nějakého rozsáhlejšího úseku paměti, v němž se můžeme pomocí takovýchto příkazů CALL 'ICIDENT' libovolně pohybovat. Tuto taktiku lze použít k nahrazování indexování (výpočet se tím výrazně zrychlí) nebo při zpracování textových řetězců apod. 12) CALL 'ICIDENT' USING A SOUBOR 40. Položka A bude ztotožněna s úsekem paměti začínajícím na 41.bytu struktury "stdf" odpovídající souboru SOUBOR. 13) CALL 'ICIDENT' USING A (EXTPOLE) N. Položka A bude ztotožněna s úsekem paměti začínajícím na (N+1)-ním bytu externího pole EXTPOLE (a to i v případě, že toto pole není "polem charů"). 14) CALL 'ICIDENT' USING A *(EXTFELD) N. Zde záleží na typu, jenž uživatel přidělil externí proměnné EXTFELD v deklaraci, jejíž zařazení zajistil (např. příkazem UFD). Přidělil-li jí typ "ukazatel na char" resp. "pole charů", dostáváme očekávanou adresu odpovídající *(EXTFELD) zvětšenou o hodnotu položky N. Odpovídá-li však proměnné EXTFELD délka d jiná než 1, jedná se o výjimku: dostáváme adresu odpovídající *(EXTFELD) zvětšenou o d-násobek hodnoty položky N. 15) CALL 'ICIDENT' USING A 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' N. Má-li položka A PIC X, bude ztotožněna s (N+1)-ním písmenem abecedy. 16) CALL 'ICIDENT' USING A B VALUE VALUE. Argument B musí začínat ukazatelem obsahujícím adresu úseku paměti, jenž opět začíná ukazatelem obsahujícím adresu dalšího úseku paměti; s tímto úsekem paměti bude položka A ztotožněna. (Jedná se tedy o adresu třetího řádu; opakováním slova VALUE lze získat adresu libovolného vyššího řádu.) 17) CALL 'ICIDENT' USING A B VALUE N. Argument B musí začínat ukazatelem; adresu v něm obsaženou zvětšíme o N bytů, čímž dostaneme adresu úseku paměti, s nímž bude ztotožněna položka A. 18) CALL 'ICIDENT' USING A RETURN-CODE VALUE 10000. Položka A bude ztotožněna s úsekem paměti, jehož adresa je rovna adrese uložené v položce RETURN-CODE zvětšené o 10000 bytů. 19) CALL 'ICIDENT' USING A B POCET VALUE. Adresu argumentu B zvětšíme o hodnotu celočíselné numerické položky POCET; na získané adrese musí začínat ukazatel obsahující adresu úseku paměti, s nímž bude položka A ztotožněna. 20) CALL 'ICIDENT' USING A (EXTPOLE) 60 VALUE. Položka A bude ztotožněna s úsekem paměti, jehož adresa je obsažena v ukazateli začínajícím na 61.bytu externího pole EXTPOLE. 21) Uvažujme řetězený seznam, v němž každý neposlední článek obsahuje na svém 25.-28.bytu ukazatel na další článek, uložený např. příkazem UFO '*(char**)(' A '+24)=' DALSI-CLANEK ';' #0A# Je-li A ztotožněno s některým neposledním článkem, příkaz CALL 'ICIDENT' USING A A 24 VALUE ztotožní A s následujícím článkem řetězeného seznamu. Přeskočení následujícího článku a ztotožnění s druhým následujícím článkem by provedl příkaz CALL 'ICIDENT' USING A A 24 VALUE 24 VALUE. 22) CALL 'ICIDENT' USING A B VALUE 40 VALUE. Argument B musí začínat ukazatelem; na 41.bytu úseku paměti určeného tímto ukazatelem musí začínat další ukazatel obsahující adresu úseku paměti, s nímž ztotožníme položku A.