6.3. Příkaz UNSTRING Formát: - - - | | položka | UNSTRING položka | DELIMITED BY [ALL] < alfanum.literál > | | fig.konstanta | - - - - - - - | položka | - | | OR [ALL] < alfanum.literál > | ... | - | fig.konstanta | - | - - - INTO { položka [DELIMITER IN položka] [COUNT IN celočíselná-položka] [OCCURS {celé-číslo|cel.položka} TIMES] } ... [ WITH POINTER { celé-číslo | celočíselná-položka } ] - - | LENGTH celé-číslo | | LENGTH celočíselná-položka | - - [ TALLYING IN celočíselná-položka ] [ ON OVERFLOW příkaz ... ] Funkce: Příkaz UNSTRING rozděluje vysílající text obsažený v jedné vysílající položce do několika příjmových položek. Vysílající položkou je položka uvedená za slovem UNSTRING. Může mít libovolný typ i délku, zpracovává se však vždy alfanumericky. Tato položka musí na začátku provádění příkazu UNSTRING obsahovat vysílající text, přičemž klauzule POINTER určuje, od kterého bytu vysílající položky tento vysílající text začíná: a) Není-li klauzule POINTER vůbec uvedena, začíná vysílající text od začátku (tj. od prvního bytu) vysílající položky. b) Je-li uvedena klauzule POINTER s celočíselnou numerickou položkou, musí programátor před začátkem provádění příkazu UNSTRING dosadit do této položky nějakou hodnotu. Je-li tato hodnota větší než délka vysílající položky, přičemž není uvedena klauzule LENGTH s nezápornou hodnotou, nebude příkaz UNSTRING vůbec prováděn. Je-li tato hodnota nejvýše rovna délce vysílající položky anebo je-li uvedena klauzule LENGTH s nezápornou hodnotou, pak příkaz UNSTRING prováděn bude, přičemž hodnota položky uvedené v klauzuli POINTER určuje pořadové číslo toho bytu vysílající položky, od kterého začíná vysílající text (prvnímu bytu vysílající položky odpovídá hodnota 1). Předcházející byty vysílající položky jsou bezvýznamné a nebudou nijak využity. Navíc po ukončení provádění příkazu UNSTRING bude do celočíselné položky uvedené za slovem POINTER dosazeno pořadové číslo toho bytu vysílající položky, který bezprostředně následuje za posledním bytem vysílajícího textu, který se ještě využil (při práci s omezovači to bude až za příslušným omezovačem). (Pokud se tedy jako poslední využil k-tý byte vysílající položky, bude do této celočíselné položky dosazena hodnota k+1. Pokud se využila celá vysílající položka až do konce, bude do této celočíselné položky dosazena délka vysílající položky zvětšená o jednu.) Tato celočíselná položka musí mít v PICTURE dostatečný počet znaků 9, aby byla schopna pojmout tu hodnotu, která bude do ní ukládána. c) Je-li uvedena klauzule POINTER s celým číslem (jež musí být kladné), je účinek stejný, jako kdyby se jednalo o celočíselnou numerickou položku s takovouto hodnotou. Rozdíl je pouze v tom, že uvedené celé číslo se samozřejmě během výpočtu nemění a po ukončení provádění příkazu UNSTRING nedostává uživatel k dispozici pořadové číslo bytu vysílající položky bezprostředně následujícího za posledním využitým bytem. Poznámka: Za normálních okolností by měla být hodnota argumentu uvedeného za slovem POINTER kladná a nejvýše rovná délce vysílající položky, není to však vyžadováno ani kontrolováno. V případě uvedení položky s nekladnou hodnotou se bude přesunovat úsek paměti začínající příslušný počet bytů před začátkem vysílající položky. V případě uvedení celého čísla resp. položky s hodnotou převyšující délku vysílající položky se buďto příkaz UNSTRING vůbec neprovádí (není-li uvedena klauzule LENGTH) anebo bude vysílající úsek paměti začínat až někde za koncem vysílající položky (je-li uvedena klauzule LENGTH s kladnou hodnotou). Dále může být v příkazu UNSTRING uvedena ještě klauzule LENGTH s tímto významem: a) Není-li v příkazu UNSTRING uvedena klauzule LENGTH, sahá vysílající text až do konce vysílající položky. b) Je-li v příkazu UNSTRING uvedena klauzule LENGTH, určuje hodnota argumentu v ní uvedeného "opravenou" délku vysílajícího textu (počínaje prvním bytem vysílající položky resp. bytem s pořadovým číslem určeným klauzulí POINTER). Jak je vidět z formátu, lze v případě celého čísla v klauzuli LENGTH vynechat slovo LENGTH a uvést tedy pouze toto celé číslo. Je-li délka vysílajícího textu nekladná, příkaz UNSTRING se vůbec neprovádí (avšak klauzule ON OVERFLOW se neuplatní). Nekladná délka vysílajícího textu nastává v těchto případech: - Vysílající položka má nekladnou délku, klauzule POINTER a LENGTH nejsou uvedeny. - Je uvedena klauzule LENGTH s celým číslem 0 nebo s celočíselnou numerickou položkou, jejíž hodnota je nekladná. - Není uvedena klauzule LENGTH, avšak je uvedena klauzule POINTER s argumentem, jehož hodnota je větší než délka vysílající položky. Při provádění příkazu UNSTRING se obsah vysílající položky nezmění. Příjmové položky jsou určené částí příkazu UNSTRING za slovem INTO. Ve formátu je za slovem INTO uvedena svorková závorka, která se může opakovat. Každé opakování této svorkové závorky obsahuje vždy na prvním místě povinně jednu příjmovou položku a dále pak nepovinné klauzule DELIMITER, COUNT a OCCURS patřící k této příjmové položce. Příjmové položky smí být jakéhokoliv typu i délky (nejvýše 32767 bytů). Příkaz UNSTRING může provádět rozdělování vysílajícího textu dvěma principiálně odlišnými způsoby: dle délek příjmových položek a dle omezovačů. A) Rozdělování dle délek příjmových položek Tento typ rozdělování se provádí tehdy, když v příkazu UNSTRING není uvedena klauzule DELIMITED. Pak je též zakázáno, aby u jednotlivých příjmových položek byly uvedeny klauzule DELIMITER a COUNT. Příkaz UNSTRING má v tomto případě formát: UNSTRING položka INTO {položka [OCCURS {cel.číslo|cel.položka} TIMES]}... [ WITH POINTER { celé-číslo | celočíselná-položka } ] [ LENGTH celé-číslo | LENGTH celočíselná-položka ] [ TALLYING IN celočíselná-položka ] [ ON OVERFLOW příkaz... ] Rozdělování vysílajícího textu probíhá takto: Označme d1, d2, d3, ... délky (tj. počty bytů) jednotlivých příjmových položek (v témže pořadí, v jakém jsou uvedeny v příkazu UNSTRING). Z vysílajícího textu se vezme prvních d1 bytů a přesune se bez jakékoliv změny do první příjmové položky, následujících d2 bytů se přesune do druhé příjmové položky atd. Provádění příkazu UNSTRING se ukončí, jakmile nastane některá z těchto situací: a) Jsou již naplněny všechny zadané příjmové položky. V tom případě se zbytek vysílajícího textu nevyužije. b) Už se rozdělil a přesunul celý vysílající text až do konce. Do příjmové položky, která se uplatnila jako poslední, se přitom přeneslo jen tolik bytů, kolik jich ještě pro ni zbývalo na konci vysílajícího textu; tyto byty se uložily do zmíněné příjmové položky odleva a případný zbytek této příjmové položky zůstal beze změny. Případné další uvedené příjmové položky se již neuplatní; jejich původní obsahy zůstanou beze změny. Příklad: 77 A PIC X(10) VALUE 'ABCDEFGHIJ'. 77 B PIC X(4). 77 C PIC X(4). 77 D PIC X(4). 77 E PIC X(4). 77 I PIC S999 COMP-3. a) UNSTRING A INTO B C Bude B = ABCD, C = EFGH; znaky IJ se nevyužijí. b) MOVE ALL '7' TO D E UNSTRING A INTO B C D E Bude B = ABCD, C = EFGH, D = IJ77, E = 7777 (nezměněno). c) MOVE 2 TO I UNSTRING A INTO B C WITH POINTER I Bude B = BCDE, C = FGHI, I = 10; znaky A, J se nevyužijí. d) MOVE 5 TO I MOVE ZERO TO C UNSTRING A INTO B C POINTER I Bude B = EFGH, C = IJ00, I = 11. e) MOVE 6 TO I MOVE ALL '8' TO B C UNSTRING A INTO B C LENGTH I Bude B = ABCD, C = EF88. f) MOVE ALL '5' TO C D UNSTRING A INTO B C D POINTER 4 LENGTH 5 BUde B = DEFG, C = H555, D = 5555 (nezměněno). Poznámka: Rozdělování dle délek příjmových položek má rozumný smysl při jakémkoliv typu příjmových položek (tedy i pro položky pakované, binární, exponenciální apod.), pokud ovšem již vysílající text má odpovídající strukturu. Poznámka: Příkaz UNSTRING bez klauzule DELIMITED se v praxi používá jen vyjímečně (např. když při čtení děrné pásky má celá děrná páska anebo každá logická věta na začátku jeden nebo několik úseků pevné délky). Používání pro obyčejné přesuny je velmi nevýhodné, protože i takovýto příkaz UNSTRING je realizován odskokem do dlouhého a pomalého podprogramu, takže je daleko výhodnější použít místo něj příkazy MOVE. B) Rozdělování dle omezovačů Tento typ rozdělování se provádí tehdy, když v příkazu UNSTRING je uvedena klauzule DELIMITED. V klauzuli DELIMITED je pak uveden jeden omezovač nebo několik omezovačů (oddělených povinnými slovy OR). Omezovačem smí být položka libovolného typu (srovnává se vždy alfanumericky) s pevnou nebo proměnnou délkou, která musí být kladná a nejvýše rovná 32767, alfanumerický literál nebo figurativní konstanta (zpracovává se jako alfanumerický literál o délce 1 znak). Každý z omezovačů může mít před sebou uvedeno ještě slovo ALL. Při tomto typu zpracování je vysílající text rozdělen na úseky naprosto nezávisle na počtu příjmových položek a na jejich typech a délkách, a to podle těchto pravidel: a) Postupujeme vysílajícím textem od jeho prvního bytu zleva doprava tak dlouho, až v něm najdeme první omezovač (hledání omezovače se provádí alfanumericky na každé pozici vysílajícího textu). První úsek je pak tvořen byty vysílajícího textu od prvního až do toho, který stojí bezprostředně před tímto omezovačem. b) Pokud u nalezeného omezovače není ve formátu uvedeno slovo ALL, začne další prohledávání vysílajícího textu prvním bytem stojícím bezprostředně za tímto omezovačem. c) Pokud u nalezeného omezovače je ve formátu uvedeno slovo ALL, zjišťuje se, zda se tento omezovač neopakuje ve vysílajícím textu několikrát bezprostředně (bez přerušení!) za sebou. Pokud ano, tak další prohledávání vysílajícího textu začne až prvním bytem stojícím bezprostředně až za posledním opakováním tohoto omezovače. d) Takto máme určen první byte druhého úseku a opět prohledáváme a rozdělujeme vysílající text dle bodů a), b), c) až do konce vysílajícího textu. e) Pokud na konci vysílajícího textu stojí omezovač, pak posledním úsekem je ten úsek, který byl bezprostředně před ním. pokud však mezi posledním omezovačem a koncem vysílajícího textu jsou ještě nějaké byty, tvoří právě tyto byty poslední úsek, který tedy začíná prvním bytem stojícím za posledním omezovačem a končí posledním bytem vysílajícího textu. f) Je-li v klauzuli DELIMITED uvedeno více omezovačů, mohou se tyto omezovače ve vysílajícím textu libovolně střídat, přičemž konec úseku je určen vždy tím omezovačem, na nějž se narazilo nejdříve. Klauzule ALL se však týká opakování pouze toho omezovače, jímž je zprava ohraničen předcházející úsek vysílajícího textu. g) Jsou-li ve vysílajícím textu umístěny dva omezovače bezprostředně za sebou (s výjimkou případu, že se jedná o týž omezovač, a přitom tento omezovač má ve formátu uvedeno slovo ALL) nebo stojí-li omezovač hned na začátku vysílajícího textu, vznikne úsek o nulové délce. S takovýmto úsekem se pracuje jako s každým jiným úsekem - podle pořadí je mu přidělena jedna příjmová položka, která se pak (jak bude vidět z dalšího) vymezeruje nebo vynuluje. h) Byty vysílajícího textu, které patří některému z omezovačů vymezujících úseky, se nepočítají do žádného úseku. i) U figurativních konstant v roli omezovačů se nepředpokládá, že by snad měly "implicitně" uvedeno ALL; tedy zápisy ZERO a ALL ZERO jsou oba přípustné a mají odlišný význam. j) Neobsahuje-li vysílající text ani jeden omezovač, vzniká jediný úsek obsahující celý vysílající text. Takto vzniklé úseky vysílajícího textu se postupně přesunují do příjmových položek (první úsek do první příjmové položky, druhý úsek do druhé příjmové položky atd.) podle těchto pravidel: |příslušný | je-li úsek kratší typ příjmové položky | úsek se | než příjmová položka, | ukládá | doplňuje se (hexadec.) -------------------------|----------|----------------------- skupinová | odleva | 20 (mezera) alfanum.(edit.) bez JUST | odleva | 20 (mezera) alfanum.(edit.) s JUST | odprava | 20 (mezera) numerická rozpakovaná | odprava | 30 (znaková nula) numerická pakovaná | odprava | 00 (binární nuly) numerická binární | odleva* | 00 (binární nuly) exponenc. krátká/dlouhá | odprava* | 00 (binární nuly) exponenciální znaková | odprava* | 00 (binární nuly) numerická editovaná | odprava | 20 (mezera) s USAGE INDEX | odleva* | 00 (binární nuly) Na počítačích typu PC, na nichž jsou nejnižší řády u "shortů" a "longů" v prvním bytu a u "floatů" a "doublů" v posledním bytu položky, se úsek ukládá do binárních položek a do UI-položek odleva a do exponenciálních položek odprava, tedy stejně, jak ukazuje výše uvedená tabulka. Naproti tomu na počítačích typu IBM, na nichž jsou nejnižší řády u "shortů" a "longů" v posledním bytu a u "floatů" a "doublů" v prvním bytu položky, se úsek ukládá do binárních položek a do UI-položek odprava a do exponenciálních položek odleva, tedy obráceně, než jak ukazuje výše uvedená tabulka. Je-li uvedeno, že úsek se ukládá odleva (odprava), rozumí se tím, že úsek se uloží do příjmové položky tak, že první (poslední) byte úseku přijde na první (poslední) byte příjmové položky. Je-li úsek delší než příjmová položka, přebývající byty na konci (na začátku) úseku se odříznou a neuplatní. Je-li úsek kratší než příjmová položka, zbývající byty na konci (na začátku) příjmové položky se vyplní znakem uvedeným ve třetím sloupci tabulky. Je-li délka úseku shodná s délkou příjmové položky, vyjdou všechny zmíněné způsoby nastejno - žádné byty se neodřezávají ani nedoplňují. V tom případě může mít příjmová položka jakýkoliv typ a bude správně naplněna dle záměrů programátora. Je-li délka úseku kratší než délka příjmové položky, budou zřejmě nesprávně naplněny binární položky se zápornými hodnotami a exponenciální znakové položky - ovšem i v ostatních případech si musí programátor rozmyslet, zda způsob ukládání a doplňování je právě ten, který potřebuje. Provádění příkazu UNSTRING se ukončí, jakmile nastane některá z těchto situací: a) Jsou již naplněny všechny zadané příjmové položky. V tom případě se zbývající úseky nevyužijí. b) Jsou již využity všechny úseky vysílajícího textu. Případné další uvedené příjmové položky se již neuplatní; jejich původní obsahy zůstanou beze změny. Klauzule DELIMITER a COUNT Při rozdělování podle omezovačů může (ale nemusí) každá z příjmových položek mít u sebe uvedeny klauzule DELIMITER, COUNT a OCCURS. Do položky uvedené za slovem DELIMITER bude přesunut ten omezovač, který stojí bezprostředně za tím úsekem, který je přesunován do příslušné příjmové položky. (Při ALL se přesunuje jen jeden "exemplář" omezovače.) Omezovač se do této položky ukládá odleva dle pravidel alfanumerického přesunu bez JUST; je-li omezovač kratší než položka, bude zbytek položky (vpravo) doplněn mezerami, je-li omezovač delší než položka, bude do položky uložen jen začátek omezovače, zatímco jeho konec se nepřesunuje. Jedná-li se o poslední úsek vysílajícího textu, který je zprava ohraničen koncem vysílajícího textu a nikoliv omezovačem, bude celá položka uvedená za slovem DELIMITER vymezerována. Zřejmě má smysl uvádět klauzuli DELIMITER především tehdy, když v klauzuli DELIMITED je uvedeno více omezovačů (anebo když programátor chce podle vymezerování položky rozpoznat poslední úsek ohraničený koncem vysílajícího textu). Mají-li tyto omezovače různé délky, měly by být položky uvedené za DELIMITER dostatečně dlouhé, aby obsáhly nejdelší omezovač. Do celočíselné položky uvedené za slovem COUNT bude uložen počet bytů toho úseku, který je přesunován do této příjmové položky (počítají se i ty byty úseku, které byly při přesunu do příjmové položky odříznuty, nikoliv však byty omezovače). Používá se ke kontrole, zda délka úseku nepřesáhla délku příjmové položky (pokud odřezávání bytů úseku znamená chybu). Příklad: 77 A PIC X(15) VALUE 'ABCAABCABABCCAB'. 77 B PIC X(3). 77 C PIC X(3). 77 D PIC X(3). 77 E PIC X(3). 77 F PIC X(3). 77 I PIC 99. 77 J PIC 99. a) UNSTRING A DELIMITED 'C' INTO B C D E F Bude B = ABb, C = AAB, D = ABA, E = bbb, F = ABb. b) UNSTRING A DELIMITED ALL 'C' INTO B C D E F Bude B = ABb, C = AAB, D = ABA, E = ABb, F beze změny. c) UNSTRING A DELIMITED ALL 'AB' INTO B C D E F Bude B = bbb, C = CAb, D = Cbb, E = CCb, F beze změny. d) UNSTRING A DELIMITED 'ABA' INTO B C D E Bude B = ABC, C = BCC, D a E beze změny. e) UNSTRING A DELIMITED ALL 'CA' OR ALL 'BC' INTO B C D E F Bude B = Abb, C = AAb, D = ABA, E = bbb, F = Bbb. (Omezovač CA na 3.-4. bytu a omezovač CA na 7.-8. bytu se neuplatní, neboť překrývají předcházející omezovač BC.) f) MOVE 5 TO I UNSTRING A DELIMITED ALL 'CA' INTO B C D WITH POINTER I Bude B = ABb, C = BAB, D = Bbb, I = 16. g) MOVE 4 TO I UNSTRING A DELIMITED BY 'BC' INTO B C POINTER I Bude B = AAb, C = ABA, I = 13. h) UNSTRING A DELIMITED 'BCA' OR 'CAB' INTO B DELIMITER E COUNT I C DELIMITER F D COUNT J Bude B = Abb, E = BCA, I = 1, C = Abb, F = BCA, D = BAB (příslušný úsek je BABC, znak C se odřezává), J = 4. i) MOVE 7 TO I J UNSTRING A DELIMITED 'B' INTO B C D POINTER I LENGTH J Bude B = CAb, C = Abb, D = CCb, I = 14. Příklad: 77 A PIC X(14) VALUE '15=1234E=70=NE'. 77 B PIC 9(4)V9. 77 C PIC S9(4). 77 D PIC 9V999. 77 E PIC XXX JUST. ... UNSTRING A DELIMITED '=' INTO B C D E Bude B = 0015 (tj. hodnota = 1.5), C = 234E (tj. hodnota = -2345; aby uživatel poznal, že byl odříznut znak 1, musel by u příjmové položky C uvést klauzuli COUNT a po provedení příkazu UNSTRING testovat, zda hodnota položky uvedené za slovem COUNT je nejvýše 4), D = 0070 (tj. hodnota = 0.070), E = bNE. Klauzule OCCURS Při obou způsobech rozdělování lze u kterékoliv příjmové položky splňující následující podmínky a), b), c) uvést klauzuli OCCURS: a) Příjmová položka musí být indexována. b) Klauzule DELIMITER buďto nesmí být u této příjmové položky uvedena vůbec anebo položka v ní uvedená musí být indexována. c) Klauzule COUNT buďto nesmí být u této příjmové položky uvedena vůbec anebo položka v ní uvedená musí být indexována. V klauzuli OCCURS musí být uvedeno celé číslo nebo celočíselná numerická položka, jejíž hodnota by měla být nezáporná (při nekladné hodnotě se celá příjmová položka ignoruje). Pak se příkaz UNSTRING chová tak, jako kdyby místo této příjmové položky byl uveden takový počet příjmových položek, kolik činí hodnota argumentu uvedeného v klauzuli OCCURS (jejich naplňování se ovšem provádí cyklem). První z nich bude ta příjmová položka, která je v příkazu UNSTRING explicitně uvedena, a ostatní budou opět vždy tato příjmová položka, ale s jiným indexem: jejich indexy porostou po jedné od toho indexu, který je u příjmové položky explicitně uveden. Jsou-li u příjmové položky uvedeny klauzule DELIMITER a COUNT, budou připojeny i ke každé z těchto dalších příjmových položek, přičemž i v nich budou používány stále tytéž položky, avšak s indexy rostoucími po jedné od těch indexů, které jsou u položek uvedených za DELIMITER resp. COUNT explicitně uvedeny. Poznámka: Je-li u příjmové položky resp. u položky uvedené za DELIMITER resp. u položky uvedené za COUNT uvedeno více indexů, zvětšuje se pouze poslední z nich, zatímco předcházející indexy se přenášejí beze změny. Příklad: Příkaz UNSTRING A DELIMITED '/' OR ALL '?' INTO B (5) DELIMITER C (J K) COUNT D (3 L M + 4) OCCURS 4 má přesně stejný význam jako příkaz UNSTRING A DELIMITED '/' OR ALL '?' INTO B (5) DELIMITER C (J K) COUNT D (3 L M + 4) B (6) DELIMITER C (J K + 1) COUNT D (3 L M + 5) B (7) DELIMITER C (J K + 2) COUNT D (3 L M + 6) B (8) DELIMITER C (J K + 3) COUNT D (3 L M + 7) Příklad: Klauzule OCCURS umožňuje místo zdlouhavého rozepisování UNSTRING PAVEL DELIMITED ')' OR ';' INTO PETR (1) DELIMITER JAKUB (1) COUNT JAN (1) PETR (2) DELIMITER JAKUB (2) COUNT JAN (2) ... PETR (100) DELIMITER JAKUB (100) COUNT JAN (100) napsat pouze UNSTRING PAVEL DELIMITED ')' OR ';' INTO PETR (1) DELIMITER JAKUB (1) COUNT JAN (1) OCCURS 100. Příklad: Problém z předešlého příkladu lze však jednoduše vyřešit i bez použití klauzule OCCURS. Využijeme toho, že při uvedení klauzule POINTER s celočíselnou numerickou položkou si příkaz UNSTRING automaticky sám zvětšuje hodnotu této položky tak, aby neustále obsahovala pořadové číslo toho bytu vysílající položky, jímž bude začínat následující úsek. Zpracování pak provádíme cyklem, přičemž v každé otáčce cyklu provedeme příkaz UNSTRING pouze s jedinou příjmovou položkou PETR (I): MOVE 1 TO I P. CYKL. UNSTRING PAVEL DELIMITED ')' OR ';' INTO PETR(I) DELIMITER JAKUB(I) COUNT JAN(I) POINTER P. IF I < 100 ADD 1 TO I GO TO CYKL. Bylo by nutné ještě vhodným způsobem ošetřit případ, že vysílající text PAVEL obsahuje méně než 100 úseků (např. testem položky P po provedení příkazu UNSTRING). V praxi většinou v takovémto případě uvádíme v příkazu UNSTRING neindexované položky PETR, JAKUB a JAN a po každém příkazu UNSTRING následuje bezprostředně kontrola a zpracování právě získaného úseku. Klauzule TALLYING Při obou způsobech rozdělování může být v příkazu UNSTRING uvedena klauzule TALLYING. V této klauzuli je třeba uvést celočíselnou numerickou položku, jejíž počáteční hodnota je bezvýznamná. Po ukončení provádění příkazu UNSTRING bude do této položky dosazen počet příjmových položek, které byly skutečně využity, tj. jejichž obsah se měnil. Tato celočíselná položka musí mít v PICTURE dostatečný počet znaků 9, aby byla schopna pojmout tu hodnotu, která bude do ní ukládána. Příklad: Ve výše uvedeném příkladě s body a) až i) by při uvedení klauzule TALLYING byl obsah v ní uvedené celočíselné položky po ukončení provádění příkazu UNSTRING postupně 5, 4, 4, 2, 5, 3, 2, 3, 3. Poznámka: Při zpracování dle omezovačů je vhodné používat klauzuli TALLYING vždy; pokud nevíme předem, kolik bude úseků, tak pro zjištění jejich počtu (a pro kontrolu, zda tento počet nepřekročil nejvyšší přípustnou hodnotu), a pokud víme předem, kolik má být úseků, tak pro kontrolu, zda je jich skutečně právě tolik (tj. zda při pořizování dat nebyl omylem přidán nebo vypuštěn nějaký omezovač). Poznámka: V některých jiných implementacích jazyka COBOL způsobuje klauzule TALLYING nikoliv dosazení počtu použitých příjmových položek do položky za TALLYING, nýbrž přičtení tohoto počtu k původní hodnotě této položky. (Stejnou funkci v obou typech implementací tedy dosáhneme vynulováním této položky před každým provedením příkazu UNSTRING.) Klauzule ON OVERFLOW Při obou způsobech rozdělování může být v příkazu UNSTRING uvedena klauzule ON OVERFLOW, k jejímuž uplatnění dojde v případě, že již jsou naplněny všechny uvedené příjmové položky, a ve vysílajícím textu ještě zbývají na konci nějaké neuplatněné byty (při rozdělování dle délek příjmových položek) resp. neuplatněné úseky (při rozdělování dle omezovačů). Při uplatnění klauzule ON OVERFLOW se budou provádět příkazy uvedené za ON OVERFLOW, jinak se příkazy uvedené za ON OVERFLOW přeskočí a jako další se bude provádět první příkaz za tečkou. Není-li klauzule ON OVERFLOW uvedena, bude se po provedení příkazu UNSTRING provádět vždy ten příkaz, který za ním následuje.