COPY 文の処理

プリプロセッサがコピーファイルの内容を展開する必要がない場合は、COPY 文をそのまま変更を加えずにコンパイラへ渡し、コンパイラで COPY 文を展開することができます。

有効な COBOL の構文のみを、このように変更を加えずにそのままコンパイラに渡すことができます。 COBOL の構文以外はすべてコメントアウトされ、有効な COPY 文に置き換えられてコンパイラで展開されます。

どちらの場合も、プリプロセッサはコピーファイルを読み取ってコピーファイル自体に変更を加えることはありません。

コンパイラは、行が変更されているかどうかに関係なく、すべての形式の COPY 文を展開します。 サポートされている形式を次に示します。

プリプロセッサがコピーファイルの内容を調べる場合は、コピーファイル自体を展開するか、CP プリプロセッサを使用します。 コピーファイル自体の内容は、メインソースファイル内の行と同じ方法でコンパイラに返されます。ただし、COPY 文自体は特別に処理されます。

最も単純なのは、COPY 文が 1 行または複数の行内で唯一の文であり、完全なファイル名 (拡張子と必要に応じてパスを含む) を指定した場合です。これらの複数行の最初の行は、resp-main が 3 に、resp-more が COPY 文の開始位置を示す行番号に設定されて、コンパイラに渡されます。継続行はすべて、resp-main が 4 に設定されて、コンパイラに渡されます。

COPY 文で指定したファイルの場所が拡張子またはパスを付加することで解決される場合、または 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 文がコンパイラに返されたとき、展開するのがプリプロセッサかコンパイラかに関係なく、コンパイラは COPY 文を解析して、REPLACING があるかをチェックします。 この REPLACING は、このコピーファイルと入れ子にされたコピーファイルのすべての行に影響します。 この COPY 文で指定した名前が読み取られ、アニメータで使用するために保存されます。 名前を引用符で囲むことを強くお奨めします。名前を読み取る際に予期しない大文字変換が実行され、大文字小文字を区別するプラットフォームでアニメータがファイルを見つけることができないという事態にならないようにするためです。

 基本レベル外: 元の語が COBOL の COPY 文でない場合、たとえば、 ++INCLUDE や -INC の場合は、resp-main=14 を使用します。コンパイラの指令のいくつかは、COBOL ソースの前の段階で $SET 文で指定できますが、COBOL ソースの後では指定できません。 このような文は ++INCLUDE の前に置くことができますが、COPY の前に置くことはできません。 resp-main=14 を指定することによって、++INCLUDE が展開されると同時に、これ以降このような指令を設定できるようになります。

resp-main の値 128 は、プリプロセッサがコピーファイルの展開を完了したときのみに使用します。 この値を使用しないとコンパイラがコンパイルを中断します。 値 0 はメインソースファイルの終わりに使用します。

見出しの部の注記記述項の COPY 文は必ずしも展開されません。 プリプロセッサが、コピーファイルを展開できない場所でその展開を実行しようとしていることをコンパイラに通知すると (resp-main を 3 または 11 に設定)、コンパイラはプリプロセッサへの次の呼び出しで response-status を 0 以外の値に設定します。 プリプロセッサはコピーファイルの展開をただちに中断し、コピーファイルが空であった場合のように、コピーファイルの終わりを示すマーカーを送信します (resp-main を 128 に設定)。

CP プリプロセッサは、他のプリプロセッサが行わなくてもすむように、これらのプリプロセッサにかわってコピーファイルを展開します。 CP プリプロセッサは上記に示したような行を生成します。