UNSTRING 文

UNSTRING 文は、送り出し側フィールド内の連続するデータを分解して、複数の受け取り側フィールドに配置する。

一般形式

UNSTRING Statement

構文規則

  1. 各定数は文字定数とする。各定数は表意定数でもよい (補助語 ALL は指定しない)。
  2. identifier-1、identifier-2、identifier-3、および identifier-5 は、英数字データ項目として明示的または暗黙的に記述する。
  3. identifier-4 は、英字 (記号「B」は PICTURE 文字列で使用できない)、英数字、または数値 (記号「P」は PICTURE 文字列で使用できない) として記述でき、USAGE IS DISPLAY として記述する必要がある。
  4. MF 構文規則 2 および 3 は該当しない。代わりに、以下の規則が該当する。
    1. identifier-1 は英数字とする。
    2. identifier-2 および identifier-3 は用途を DISPLAY とし、編集できない。
    3. identifier-5 の用途は DISPLAY とする。
    4. identifier-4 の用途は DISPLAY でもよい。
    5. identifier-4 は、数値データ項目を定義する任意の用途を指定できるが、そのデータは有効な転記処理を行えるものとする。
  5. OSVSVSC2MF identifier-4 は、浮動小数点数項目として定義できない。
  6. identifier-6 および identifier-8 は整数のデータ項目を参照するものとする (ただし、この PICTURE 文字列では記号文字「P」は使用できない)。
  7. identifier-7 は、整数の基本データ項目として記述する。その大きさは、identifier-1 が参照するデータ項目のサイズに 1 を加えた値を収められるサイズとする。identifier-7 の PICTURE 文字列には、「P」を使用できない。
  8. いずれの一意名も、88 レベルの記述項は指定できない。
  9. DELIMITER IN および COUNT IN 指定は、DELIMITED BY を指定した場合にのみ指定できる。
  10. ANS85 identifier-1 は部分参照できない。
  11. ISO2002MFOS390 identifier-1 は部分参照できる。

一般規則

  1. identifier-2 および literal-1 に関するすべての記述は、それぞれ identifier-3 および literal-2 に同様に適用され、そのすべての再帰についても同様に適用される。
  2. identifier-1 は送り出し側領域を表す。
  3. identifier-4 はデータ受け取り側領域を表す。identifier-5 は、区切り文字用の受け取り側領域を表す。
  4. literal-1、または identifier-2 が参照するデータ項目は、区切り文字を指定する。
  5. identifier-6 が参照するデータ項目は、identifier-1 が参照するデータ項目内の文字数のうち、identifier-4 が参照するデータ項目に転記するための区切り文字によって分離された文字数を表す。この値には、区切り文字の数は含まれない。
  6. identifier-7 が参照するデータ項目は、identifier-1 が定義する領域内の相対文字位置を示す値を含む。
  7. identifier-8 が参照するデータ項目は、UNSTRING 文の実行中に処理対象となったデータ項目の数を記録するカウンターである。
  8. 表意定数を区切り文字として指定する場合、1 文字の文字定数として扱われる。

    ALL を指定すると、literal-1 (表意定数またはそれ以外) または identifier-2 が参照するデータ項目の内容を単体または複数で連続して使用しても、それらは単体として扱われ、一般規則 13d の規則に従って、その内容が受け取り側項目に転記される。

  9. 2 つの連続した区切り文字を検出した場合、現在の受け取り側領域は、その記述に従って、空白またはゼロで埋められる。
  10. literal-1、または identifier-2 が参照するデータ項目の内容には、コンピューターの文字集合内の任意の文字を含められる。
  11. literal-1、または identifier-2 が参照するデータ項目はそれぞれ、1 つの区切り文字を表す。1 つの区切り文字に複数の文字が含まれている場合に、それらを単一の区切り文字として認識させるには、すべての文字を、送り出し側項目内の連続した文字位置に、所定の順番で配置する必要がある。
  12. DELIMITED BY で複数の区切り文字を指定すると、各区切り文字は論理和条件「OR」で結ばれる。各区切り文字は、送り出し側フィールドの文字列と比較される。双方が一致すると、送り出し側フィールドの文字列のその部分が、単一の区切り文字と見なされる。送り出し側フィールドの文字は、複数の区切り文字の一部と見なされることはない。

    各区切り文字は、UNSTRING 文で指定した順番で送り出し側フィールドに適用される。

  13. UNSTRING 文の起動時は、現在の受け取り側領域は、identifier-4 が参照するデータ項目である。データは、以下の規則に従って、identifier-1 が参照するデータ項目から、identifier-4 が参照するデータ項目に転記される。
    1. POINTER を指定した場合、identifier-1 が参照するデータ項目の文字列が検査される。この検査は、identifier-7 が参照するデータ項目の内容によって示される相対文字位置から開始する。POINTER を指定しない場合、左端の文字位置から文字列の検査が開始する。
    2. DELIMITED BY を指定した場合、送り出し側文字列の検査は左から右に進められ、literal-1 の値によって、または identifier-2 が参照するデータ項目によって指定した区切り文字を検出するまで処理が続行する。一般規則 11 を参照。DELIMITED BY を指定しない場合、検査される文字数は、現在の受け取り側領域のサイズと等しくなる。ただし、受け取り側項目の符号が独立した文字位置を占めるものとして定義されている場合、検査される文字数はその際の受け取り側領域のサイズよりも 1 つ小さくなる。

      区切り条件を検出する前に identifier-1 が参照するデータ項目の末尾に達すると、最後の文字を検査した時点で検査が終了する。

    3. その結果、対象と判定された文字列 (区切り文字がある場合、それは含まれない) が、MOVE 文の規則に従い、英数字の基本項目として、現在の受け取り側領域に転記される。「MOVE 文」セクションを参照。
    4. DELIMITER IN を指定した場合、区切り文字 (列) が英数字の基本データ項目として扱われて、MOVE 文の規則に従って identifier-5 が参照するデータ項目に転記される。「MOVE 文」のトピックを参照。区切り条件が、identifier-1 が参照するデータ項目の末尾に達することである場合、identifier-5 が参照するデータ項目は空白で埋められる。
    5. COUNT IN を指定した場合、検査の対象となった文字 (区切り文字がある場合、それは含まれない) の数に等しい値が、基本項目転記の規則に従って、identifier-6 が参照する領域に転記される。
    6. DELIMITED BY を指定した場合、文字列の検査は、区切り文字の右隣の文字から再開する。DELIMITED BY を指定しない場合、文字列の検査は、転記された最後の文字の右隣の文字から再開する。
    7. データが、identifier-4 が参照するデータ項目に転送された後、現在の受け取り側領域は、identifier-4 の次の反復が参照するデータ項目になる。規則 13b から 13f に記述された動作は、identifier-1 が参照するデータ項目ですべての文字の検査が完了するか、受け取り側領域がなくなるまで繰り返される。
  14. POINTER 指定または TALLYING 指定に関連付けたデータ項目の内容を初期化することは、プログラマーの責任である。
  15. identifier-7 が参照するデータ項目の内容は、identifier-1 が参照するデータ項目で検査された文字ごとに 1 つずつ増分される。POINTER を指定した UNSTRING 文の実行完了時に、identifier-7 が参照するデータ項目の値は、identifier-1 が参照するデータ項目で検査した文字数に初期値を加えた値になる。
  16. TALLYING を指定した UNSTRING 文の実行完了時に、identifier-8 が参照するデータ項目の値は、処理の対象となった受け取り側項目の数に初期値を加えた値になる。
  17. 以下のいずれかの状況で、あふれ条件が発生する。
    1. UNSTRING 文の開始時に、identifier-7 が参照するデータ項目の値が 1 未満であるか、identifier-1 が参照するデータ項目のサイズよりも大きい場合。
    2. UNSTRING 文の実行中に、受け取り側領域がすべて処理されたが、identifier-1 が参照するデータ項目内にまだ検査されていない文字が残っている場合。
  18. あふれ条件が発生した際の UNSTRING 文の終了処理は以下のとおり。

    ANS85 NOT ON OVERFLOW 指定 (ある場合) は無視され、

    制御は UNSTRING 文の最後に移るか、ON OVERFLOW が指定されている場合は imperative-statement-1 に移る。制御が imperative-statement-1 に移ると、imperative-statement-1 で指定した各文に関する規則に従って実行処理が続けられる。制御を明示的に移す手続き分岐文または条件文を実行すると、その文に関する規則に従って制御が移る。これ以外の場合は、imperative-statement-1 の実行が終了すると、UNSTRING 文の末尾に制御が移る。

  19. ANS85 END-UNSTRING 指定は、UNSTRING 文の範囲を区切る。「COBOL 言語の概念」の章の「明示範囲符および暗示範囲符」のセクションを参照。
  20. UNSTRING 文を実行する際に、一般規則 17 に記載の条件が検出されない場合は、他の一般規則に従ってデータ転送が完了した後に、ON OVERFLOW (指定されている場合) は無視され、制御が UNSTRING 文の末尾に移る。

    ANS85 NOT ON OVERFLOW を指定した場合、制御は imperative-statement-2 に移る。制御が imperative-statement-2 に移ると、imperative-statement-2 で指定した各文の規則に従って、実行が継続される。制御を明示的に移す手続き分岐文または条件文を実行すると、その文に関する規則に従って制御が移る。これ以外の場合は、imperative-statement-2 の実行が終了すると、UNSTRING 文の末尾に制御が移る。

  21. 一意名に付けられている添え字および指標は、以下のとおり評価される。
    1. identifier-1、identifier-7、または identifier-8 に関連付けた添え字または指標があれば、UNSTRING 文の実行結果としてデータの転記が行われる直前に 1 回だけ評価される。
    2. identifier-2、identifier-3、identifier-4、identifier-5、または identifier-6 に関連付けた添え字または指標があれば、それぞれのデータ項目にデータの転記が行われる直前に評価される。
    3. ANS85 22. DELIMITED BY、INTO、DELIMITER IN、または COUNT IN 一意名に関連付けた添え字があれば、送り出し側フィールドで区切り文字の有無を検査する直前に 1 回だけ評価される。
  22. identifier-1、identifier-2、または identifier-3 が、identifier-4、identifier-5、identifier-6、identifier-7、または identifier-8 のいずれかと同じ記憶領域を共有する場合、あるいは identifier-4、identifier-5、または identifier-6 のいずれかが、identifier-7 または identifier-8 と同じ記憶領域を共有する場合、あるいは identifier-7 および identifier-8 が同じ記憶領域を共有する場合、この文の実行結果は不定となる。これらは同じデータ記述項に定義されていたとしても同様である。

01 WS-INPUT-BUFFER.05 FILLER PIC X(050) VALUE 'AAAAAAAAAAAAAAAAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBB'.01 WS-OUTPUT-UNSTR-1 PIC X(50) VALUE SPACES.01 WS-OUTPUT-UNSTR-2 PIC X(50) VALUE SPACES.01 WS-DELIMITER1 PIC X(10) VALUE SPACES.01 WS-DELIMITER2 PIC X(10) VALUE SPACES.UNSTRING WS-INPUT-BUFFER DELIMITED BY ':'INTO WS-OUTPUT-UNSTR-1 DELIMITER IN WS-DELIMITER1 WS-OUTPUT-UNSTR-2 DELIMITER IN WS-DELIMITER2 display WS-OUTPUT-UNSTR-1 display WS-OUTPUT-UNSTR-2 display WS-DELIMITER1 display WS-DELIMITER2.