OVERLAY(名前 {: 開始位置 | *NEXT })

変更の始まり OVERLAY キーワードは、1 つのサブフィールドの記憶域を別の記憶域によってオーバーレイするか、 または、固定形式定義では、データ構造自体の記憶域によってオーバーレイします。 このキーワードを使用することができるのは、データ構造サブフィールドの場合 だけです。 変更の終わり

名前パラメーターで指定された記憶域が、開始位置パラメーターで指定された位置で、 「名前」記入項目のサブフィールドによってオーバーレイされます。開始位置が 指定されていない場合、1 にデフォルト設定されます。
注: サブフィールドのタイプに関係なく、開始位置パラメーターはバイト 単位です。

OVERLAY(名前:*NEXT) を指定すると、サブフィールドを、オーバーレイされたフィールド 内の次に使用可能な位置に置きます。 (これは、このサブフィールドより前にあり、同じサブフィールドをオーバーレイ する他のすべてのサブフィールドを過ぎた後の、最初のバイトです。)

キーワード OVERLAY には次の規則が適用されます。
  1. 変更の始まり 名前パラメーターは、現行データ構造内の前に定義済みのサブフィールドの名前か、 または、固定形式定義では現行データ構造の名前でなければなりません。 自由形式定義では、POS キーワードを 使用して、データ構造内のサブフィールドの位置を指定します。 変更の終わり
  2. データ構造が修飾されている場合は、OVERLAY キーワードに対する最初のパラメーターは、データ構造名を修飾せずに指定する必要があります。 以下の例では、サブフィールド MsgInfo.MsgPrefix がサブフィールド MsgInfo.MsgId をオーバーレイします。
    D MsgInfo         DS                  QUALIFIED
    D   MsgId                        7
    D     MsgPrefix                  3    OVERLAY(MsgId)
  3. 開始位置パラメーターは (指定される場合は)、小数点以下の桁を持たない 0 より大きい 値でなければなりません。これは、数値リテラル、数値を戻す組み込み関数、または数値定数とすること ができます。開始位置が名前付き定数の場合、この指定の前にその定数が定義されている必要があります。
  4. OVERLAY キーワードは「開始位置」記入項目がブランクでない時には使用す ることができません。
  5. 名前パラメーターがサブフィールドである場合、定義中のサブフィールドは、 名前パラメーターによって指定されたサブフィールドの中に完全に含まれていなければなりません。
  6. OVERLAY キーワードを使用して定義したサブフィールドの位置合わせは、手操 作で行なわなければなりません。 正しく位置合わせされなかった場合には、警告メッセージが出されます。
  7. OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド が配列の場合には、OVERLAY キーワードは配列の各要素に適用されます。 すなわち、定義中のフィールドは同じ要素数を持つ配列として定義されます。 この配列の最初の要素は オーバーレイされる配列の最初の要素にオーバーレイし、この 配列の 2 番目の要素はオーバーレイされる配列の 2 番目の要素にオーバーレイ し、以下同様となります。 この状況では、OVERLAY キーワードを持つサブフィールドに配列キーワードを指 定することはできません。(図 1 を参照 してください) SORTA (配列の分類)も参照してください。

    OVERLAY キーワードの最初のパラメーターとして指定されたサブフィールド名が 配列で、その要素の長さが定義中のサブフィールドの長さより長い場合には、定 義中のサブフィールドの配列要素は連続して記憶されません。 このような配列は、PARM 命令の結果のフィールドとして、または MOVEA 命令の 演算項目 2 または結果のフィールドの中では使用することができません。

  8. データ構造に ALIGN キーワードを指定する と、OVERLAY(名前:*NEXT) を指定して定義されたサブフィールド は、その任意の位置に位置合わせされます。 ポインター・サブフィールドは、常に 16 バイト境界に位置合わせされます。
  9. オーバーレイしているサブフィールド をもつサブフィールドが定義されていない場合、そのサブフィールド は次のように暗黙的に定義されます。
    • 開始位置は、データ構造内で最初に使用可能な位置です。
    • 長さは、オーバーレイしているサブフィールドをすべて含むことが できる最低の長さです。 そのサブフィールドが配列として定義されている 場合、オーバーレイしているサブフィールドがすべて適切に位置合わせされる ように、長さが延長されます。

図 1. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++
D DataStruct      DS
D   A                           10    DIM(5)
D     B                          5    OVERLAY(A)
D     C                          5    OVERLAY(A:6)
記憶域でのフィールドの割り振り:
A(1) A(2) A(3) A(4) A(5)
B(1) C(1) B(2) C(2) B(3) C(3) B(4) C(4) B(5) C(5)
図 2. キーワード DIM および OVERLAY を持つサブフィールドの記憶域割り振り
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D DataStruct      DS
D   A                            5
D     B                          1    OVERLAY(A) DIM(4)
記憶域でのフィールドの割り振り:
A
B(1) B(2) B(3) B(4)  
次の例は、サブフィールドのオーバーレイ位置を定義するための等価の方法を 2 つ示しています。 1 つは (名前:開始位置) を使用して明示的に行う方法で、もう 1 つは (名前:*NEXT) を使用して暗黙的に行う方法です。
図 3. NEXT を使用したサブフィールド・オーバーレイ位置の定義
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
 * Define subfield overlay positions explicitly
D DataStruct      DS
D   PartNumber                  10A
D     Family                     3A   OVERLAY(PartNumber)
D     Sequence                   6A   OVERLAY(PartNumber:4)
D     Language                   1A   OVERLAY(PartNumber:10)
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
 * Define subfield overlay positions with *NEXT
D DataStruct      DS
D   PartNumber
D     Family                     3A   OVERLAY(PartNumber)
D     Sequence                   6A   OVERLAY(PartNumber:*NEXT)
D     Language                   1A   OVERLAY(PartNumber:*NEXT)