UNSTRING(分解)文は、送出し側項目の連続するデータを分解していくつかの受取り側項目に入れる。
一般形式
構文規則
各定数は文字定数とする。各定数は表意定数であってもよい。ただし、ALLは除く。
一意名-1、一意名-2、一意名-3、一意名-5は、明示的または暗黙的に、項類が英数字のデータ項目として記述されていなければならない。
一意名-4は、英字でも英数字でも数字でもよい。ただし、英字の場合、PICTURE文字列の中に記号文字"B" を含めることはできない。数字の場合は、PICTURE文字列の中に記号文字"P" を含めることはできない。一意名-4の用途は、DISPLAYとする。
構文規則 2 および 3は適用しない。代わって、下記の規則を適用する。
一意名-1は、英数字とする。
一意名-2と一意名-3は、用途をDISPLAYとし、編集されていてはならない。
一意名-5の用途は、DISPLAYとする。
一意名-4の用途は、DISPLAYにしてもよい。
一意名-4は、数字として定義されており正しく転記できるならば、どのような用途のものであってもよい。
一意名-4は、浮動小数点数項目であってはならない。
一意名-6と一意名-8は、整数項目とする。このPICTURE文字列の中に、記号文字" P" を含めることはできない。
一意名-7は整数の基本項目とし、一意名-1のデータ項目の文字数に1を加えた値をもつことができなければならない。このPICTURE文字列の中に、記号文字"P" を含めることはできない。
どの一意名も、88レベルの記述項を指すことはできない。
DELIMITER IN指定およびCOUNT IN指定は、DELIMITED BY指定を書いたときだけ指定できる。
一意名-1は部分参照できない。
一意名-1は部分参照できる。
一般規則
一意名-2と定数-1に関する記述はすべて、それぞれ一意名-3と定数-2およびそれらを反復指定したものに、等しく当てはまる。
一意名-1は、送出し側を表わす。
一意名-4は、受取り側を表わす。一意名-5は、区切り文字用の受取り側を表わす。
一意名-2が参照するデータ項目または定数-1は、区切り文字を指定する。
一意名-6のデータ項目は、一意名-1のデータ項目のうちで、区切り文字によって分離されて一意名-4のデータ項目に転記された文字数を表わす。区切り文字は、この文字数に入らない。
一意名-7のデータ項目は、一意名-1のデータ項目中の相対文字位置を表わす。
一意名-8のデータ項目は、UNSTRING文の実行中に処理の対象となった受取り側データ項目の数を記録するカウンタである。
区切り文字に表意定数を使用した場合、1文字の文字定数として扱われる。
ALL指定を書くと、定数-1(文字定数または表意定数)または一意名-2のデータ項目の内容が一意名-1の文字列中に連続して何回か現れても、それが1つのものとして扱われる。そして、一般規則13dの規則に従って、その内容が受取り側に転記される。
検査中に区切り文字が2つ連続して検出されると、このときの受取り側の項目はそのデータ記述に従って、英字または英数字ならば空白で、数字ならばゼロで満たされる。
一意名-2が参照するデータ項目の内容、または定数-1には、計算機文字集合中の任意の文字を含めることができる。
一意名-2が参照するデータ項目または定数-1はそれぞれ、1つの区切り文字を表わす。1つの区切り文字が何文字かで構成されている場合、送出し側の文字列の中で区切り文字として認識されるためには、まったく同じに並んでいなければならない。
DELIMITED BY指定に複数の区切り文字を書くと、各区切り文字は論理和条件"OR"で結ばれる。各区切り文字が、送出し側項目中の文字列と比較される。両者が一致すると、送出し側項目中の文字列のその部分が、1つの区切り文字とみなされる。送出し側項目中のどの文字も、2つ以上の区切り文字の一部とみなされることはない。
各分離符はUNSTRING文に指定された順序で送出し側フィールドに適用される。
UNSTRING文の実行が開始されると、下記の規則に従って、送出し側の一意名-1のデータ項目から受取り側の一意名-4のデータ項目に、データが転記される。
POINTER指定を書くと、一意名-7のデータ項目の内容によって示される相対文字位置から、一意名-1のデータ項目の文字列の検査が開始される。POINTER指定を書かないと、一意名-1の左端の文字位置から、データ項目の文字列の検査が開始される。
DELIMITED BY指定を書くと、送出し側の文字列の検査は左から右に進められて、定数-1または一意名-2のデータ項目によって示される区切り文字が出てきたところで終了する(一般規則11を参照)。DELIMITED BY指定を書かないと、検査される文字数はそのときの受取り側の大きさと等しくなる。しかし、受取り側の項目の符号が独立であると定義されている場合は、検査される文字数はそのときの受取り側の大きさよりも1つ小さくなる。
区切り文字が出てくる前に一意名-1のデータ項目の末尾に達すると、最後の文字が検査された時点で検査は終了する。
検査の結果、対象と判定された文字列(区切り文字が指定されている場合それは含まれない)が、MOVE文の規則に従って、英数字の基本項目として、このときの受取り側に転記される。(手続き部 - MERGE - OPEN の章のMOVE(転記)文MOVE(転記)文 節を参照。)
DELIMITER IN指定を書くと、区切り文字(列)が英数字の基本データ項目として扱われて、MOVE文の規則に従って一意名-5のデータ項目に転記される。(手続き部 - MERGE - OPEN の章のMOVE(転記)文MOVE(転記)文 節を参照。) ただし、送出し側の文字列の検査が一意名-1のデータ項目の末尾に達した場合は、一意名-5のデータ項目は空白で埋められる。
COUNT IN指定を書くと、検査の対象となった文字の数(区切り文字が指定されている場合、それは含まれない)が、基本項目転記の規則に従って、一意名-6のデータ項目に転記される。
DELIMITED BY指定を書くと、文字列の検査は区切り文字のすぐ右側の文字から再開される。DELIMITED BY指定を書かないと、文字列の検査は転記の済んだ部分のすぐ右側の文字から再開される。
一意名-4のデータ項目にデータが転記されると、一意名-4の次の繰り返しデータ項目が新たな受取り側となる。そして、上記の13bから13fの処理が繰り返される。一意名-1のデータ項目中の文字がすべて検査され終わるか、または受取り側の項目がなくなった時点で、この繰り返し処理は終了する。
POINTER指定またはTALLYING指定に関連するデータ項目の内容を初期化しておくことは、プログラマの役割である。
一意名-7のデータ項目の内容は、一意名-1のデータ項目中で各文字が検査されるごとに、1繰り上げられる。POINTER指定のあるUNSTRING文の実行が終了した時点では、一意名-7のデータ項目の値は、その初期値に一意名-1のデータ項目の検査の対象となった文字数を加えたものになっている。
TALLYING指定のあるUNSTRING文の実行が終了した時点では、一意名-8のデータ項目の値は、その初期値に処理の対象となった受取り側項目の数を加えたものになっている。
下記のどちらかの場合には、あふれ条件が発生する。
UNSTRING文の実行開始時に、一意名-7のデータ項目の値が1より小さいか、または一意名-1のデータ項目の大きさよりも大きい場合
UNSTRING文の実行中に、受取り側がすべて使われたのに、一意名-1のデータ項目中にまだ検査されていない文字が残っている場合
あふれ条件が発生したときのUNSTRING文の終了処理は、次のようになる。
NOT ON OVERFLOW指定がある場合は、その指定は無視されて、
UNSTRING文の末尾に制御が移される。ON OVERFLOW指定がある場合は、無条件文-1に制御が移される。無条件文-1に制御が移された場合は、その中に記述されている文に関する規則に従って、プログラムの実行が進められる。手続き分岐文あるいは明示的に制御を移行させる条件文が実行されると、その文に関する規則に従って、制御が移される。そうでなければ、無条件文-1の実行が終わると、UNSTRING文の末尾に制御が移される。
END-UNSTRING指定は、UNSTRING文の範囲を区切る。(COBOL言語の概念 の章の明示範囲符と暗黙範囲符 節を参照。)
UNSTRING文の実行中に一般規則17に記述した条件が発生しなかった場合、他の一般規則に従ってデータの転記が済んだ後、UNSTRING文の末尾に制御が移される。ON OVERFLOW指定は、あっても無視される。
NOT ON OVERFLOW指定がある場合は、無条件文-2に制御が移される。無条件文-2に制御が移された場合は、その中に記述されている文に関する規則に従って、プログラムの実行が進められる。手続き分岐文あるいは明示的に制御を移行させる条件文が実行されると、その文に関する規則に従って、制御が移される。そうでなければ、無条件文-2の実行が終わると、UNSTRINGの末尾に制御が移される。
一意名に付けられている添字および指標は下記のように評価される。
一意名-1と一意名-7と一意名-8に関する添字または指標があれば、UNSTRING文を実行した結果としてデータの転記が行われる直前に、1回だけ評価される。
一意名-2、一意名-3、一意名-4、一意名-5、一意名-6に関する添字または指標があれば、それぞれのデータ項目にデータの転記が行われる直前に評価される。
DELIMITED BY, INTO, DELIMITER IN, COUNT INの各指定に関連する一意名に添字付けがされている場合、区切り文字を探して送出し側項目を検査する直前に1回だけ添字が評価される。
一意名-1、一意名-2、一意名-3のいずれかが、一意名-4、一意名-5、一意名-6、一意名-7、一意名-8のいずれかと同じ記憶領域を共有する場合、または一意名-4、一意名-5、一意名-6のいずれかが、一意名-7、一意名-8のいずれかと同じ記憶領域を共有する場合、または一意名-7と一意名-8が同じ記憶領域を共有する場合、UNSTRING文の実行結果はどうなるかわからない。これらのデータ項目が同じデータ記述に項定義されていたとしても、そのことは変わらない。