COPY 文の処理

制約事項: この統合プリプロセッサはネイティブ COBOL 用にのみサポートされます。

プリプロセッサがコピーブックの内容を検査しない場合は、COPY 文をそのままコンパイラに渡すことができます。渡された COPY 文は、コンパイラで展開されます。

この方法で渡すことができるのは、有効な COBOL データ構造のみです。COBOL 以外のデータ構造はコメント化され、有効な COPY 文で置き換えられてコンパイラで展開されます。

いずれの場合も、プリプロセッサ側ではコピーブックの読み取りや処理は行われません。

コンパイラは、変更されることなく返された行なのか、置き換えられて返された行なのかに関係なく、プリプロセッサを介さずにあらゆる形態の COPY 文を展開することになります。次に示す COPY 文が展開されます。

プリプロセッサがコピーブックの内容を検査する場合は、コピーブック自体を展開するか、CP プリプロセッサを使用する必要があります。展開したコピーブックの内容は、プログラム本体のソース ファイル内の行と同様にコンパイラに返されます。ただし、COPY 文には、他の内容とは異なる処理が施されます。

最も単純な場合、つまり COPY 文が 1 つ以上の行に含まれる唯一の文であり、しかも同文で完全にファイルが特定できる (必要な拡張子やパスが指定されている) 場合は、resp-main を 3 に設定して 1 行目がコンパイラに返されます。resp-more には、COPY 文の開始位置の列番号が格納されます。2 行目以降の各行は、resp-main を 4 に設定してコンパイラに渡されます。

COPY 文で指定されたファイル名に拡張子やパスを追加することでファイルの場所が明確になる場合や、1 つの COPY 文だけで行が構成されているのではない場合、または正規の COBOL の COPY 文ではない場合には、COPY 文が含まれているすべての行はコメント化され (resp-main に 2 を設定してマーキングされます)、そしてそれ以外の行はすべて挿入された行として読み飛ばされます。プリプロセッサによって展開されて挿入される COPY 文は、COBOL の通常の構文規則に従っている必要があります。そこで、次のようにマーキングされます。

たとえば、ソースに次の行が含まれている場合について考えてみます。

01 item-a. copy "cpy-fil.cpy".

最初は resp-main が 2 に設定されて返され、置き換えられる側の行であることが示されます。次の呼び出しでは、プリプロセッサは次の行を返します。

01 item-a.

このとき resp-main が 1 に設定され、置き換える側の行であることが示されます。次の呼び出しでは、プリプロセッサは次の行を返します。

copy "copy-fil.cpy".

今回は resp-main が 11 に設定され、COPY 文のみを含む、置き換える側の行であることを示します。 resp-more は 20 に設定されており、元のソース行における COPY という語の位置を表します。

COPY 文がコンパイラに返されるときは、プリプロセッサとコンパイラのどちらが展開するかに関係なく、コンパイラが文を解析して、REPLACING が含まれているかどうか検査します。この REPLACING は、このコピーブックおよび入れ子になっているコピーブックのすべての行に影響します。この COPY 文に指定されている名前は、デバッガーで使用するために読み取られて格納されます。この名前は、引用符で囲んでおくことを推奨します。名前を読み取る際に予期しない大文字変換が実行され、大文字と小文字を区別するプラットフォームでデバッガーがファイルを見つけられないという事態を避けるためです。
基本レベル外: resp-main=++INCLUDE や -INC のように、元の語が COBOL の COPY 文ではなかった場合、14 が使用されます。一部のコンパイラ指令では COBOL ソースの前に $SET 文を指定できますが、指定できないものもあります。そのような文が ++INCLUDE に続くことはあっても、COPY に続くことはありません。resp-main=14 を使用することで、++INCLUDE を展開すると同時に、このような指令をそれ以降に設定できます。

resp-main の値 128 は、プリプロセッサがコピーブックの展開を完了している場合にのみ使用します。完了していない場合に使用すると、コンパイラはコンパイルを中止します。ソース ファイル本体の末尾に到達したときは、resp-main を 0 に設定する必要があります。

見出し部のコメント エントリに含まれる COPY 文は、必ずしも展開されるとは限りません。プリプロセッサがコピーブックを展開することを通知 (resp-main を 3 または 11 に設定) したが、その時点でその操作が有効でない場合、コンパイラは次のプリプロセッサの呼び出しで response-status をゼロ以外の値に設定します。プリプロセッサはそのコピーブックを即座に破棄し、コピーブックが空であったかのように、コピーブックの終わりを示すマーカーを送信します (resp-main を 128 に設定)。

CP プリプロセッサによりコピーブックが展開されると、他のプリプロセッサが展開する必要がなくなります。CP プリプロセッサも、前述と同じ方法で行を生成します。