データの流れ
STRING ステートメントが実行されると、データが送り出しフィールドから受け入れフィールドに移動されます。
送り出しフィールドが処理される順序は、それらが指定されている順序です。
次の規則が適用されます。
- 送り出しフィールドの文字は、 英数字基本項目間の移動に関する規則に従って受け入れフィールドに転送されます。 ただし、このときにスペースの埋め込みは行われません (MOVE ステートメントを参照してください)。
- DELIMITED BY ID / リテラルを指定した場合には、各送り出し項目の内容は、左端の文字から、次のいずれかになるまで 1 文字ずつ転送されます。
- この送り出しフィールドの分離文字に到達する (分離文字そのものは転送されません)。
- この送り出しフィールドの右端の文字が転送される。
- DELIMITED BY SIZE ID を指定した場合には、それぞれの送り出しフィールド全体が受け入れフィールドへ転送されます。
- 受け入れフィールドが満杯になるかまたはすべての送り出しフィールドの処理が完了すると、操作が終了します。
- POINTER 句を指定した場合には、COBOL ユーザーは受け入れフィールド内のデータの配置を制御するための明示ポインター・フィールドを使用できます。 ユーザーは明示ポインターの初期値を設定しなければなりません。 初期値は、1 より小さいかまたは受け入れフィールドの文字カウントより大きい値であってはなりません。 (ポインター・フィールドは、受け入れフィールドの長さに 1 を加えた値を含むために十分な大きさのフィールドとして定義されていなければなりません。 これは、転送の終了時にシステムがポインターを更新する際に算術オーバーフローが起こらないようにするためです。)
- POINTER 句を指定しない場合には、ユーザーはポインターを使用することができません。 ただし、初期値 1 を持つ概念上の暗黙ポインターがシステムによって使用されます。
- 概念上、STRING ステートメント実行時の (明示または暗黙) ポインターの初期値は、データが転送される受け入れフィールドの先頭の文字位置です。 その位置から始めて、データは左から右へ 1 文字ずつ配置されます。 その位置から始めて、データは左から右へ 1 文字ずつ配置されます。 各文字が配置されるたびに、明示または暗黙ポインターが 1 ずつ増やされます。 ポインター・フィールド中の値はこの方法によってだけ変更されます。 処理の終了時には、ポインター値は必ず、受け入れフィールドに転送された最後の文字の次の文字と等しい値を指します。
添え字付け、参照変更、可変長の計算、または関数の評価は、STRING ステートメントの処理の開始時に 1 回だけ実行されます。 このため、ID-3 または ID-4 が、STRING ステートメント内で添え字、参照修飾子、または関数引数として使用されるか、 または STRING ステートメントの任意の ID の長さまたは位置に影響する場合、 これらの値は STRING ステートメントの始まりにおいて判別され、STRING ステートメントの結果には影響されません。
ID-1 または ID-2 が ID-3 または ID-4 と同じ記憶域を占有している場合、 または ID-3 と ID-4 が同じ記憶域を占有している場合には、STRING ステートメントの実行の結果は未定義です。
STRING ステートメントの実行が完了すると、受け入れフィールドのうち、データが転送された部分だけが変更されます。 受け入れフィールドの残りの部分には、この STRING ステートメントの実行前に入っていたデータがそのまま残っています。
次の STRING ステートメントが実行された場合、得られる結果は 図 1 に示されているようになります。
STRING ID-1 ID-2 DELIMITED BY ID-3
ID-4 ID-5 DELIMITED BY SIZE
INTO ID-7 WITH POINTER ID-8
END-STRING
図 1. STRING ステートメントの実行結果
