COPY ステートメントは、事前に書かれたテキストを COBOL コンパイル単位に入れるライブラリー・ステートメントです。
事前に書かれたソース・コード項目を、コンパイル時にコンパイル単位の中に含めることができます。したがって、インストール先は、標準のファイル記述、レコード記述、 またはプロシージャーを再度コーディングすることなく使用することができます。その後、これらの項目とプロシージャーは、ユーザー作成のライブラリーに保管できます。また、COPY ステートメントによってプログラムおよびクラス定義に組み込むこともできます。
COPY ステートメントを含むソース・コードをコンパイルするのは、すべての COPY ステートメントを処理してから、 その結果として得られるソース・テキストの処理と同じになります。
COPY ステートメントが処理されると、COPY ワードで始まりピリオドで終わる COPY ステートメント全体が論理的に置き換えられ、テキスト名 に関連するライブラリー・テキストがコンパイル単位にコピーされます。REPLACING 句を指定していない場合、ライブラリー・テキストは変更されずにコピーされます。
テキスト名 およびライブラリー名 はユーザー定義語として同一にすることができます。
テキスト名 を修飾する必要はありません。テキスト名 を修飾しない場合には、ライブラリー名は SYSLIB とみなされます。
リテラルは 1 から 160 文字の長さにすることができます。
テキスト名 およびライブラリー名 の固有性は、 システム依存名の形成規則と変換規則が適用された後で判定されます。
処理規則の詳細については、「COBOL for Windows プログラミング・ガイド」を参照してください。
ライブラリー・テキストと疑似テキストには、ソース・テキストに記述可能な任意のワード (COPY ワードを除く)、ID、またはリテラルのいずれでも使用できます。これは、マルチバイト DBCS ユーザー定義語、DBCS リテラル、および国別リテラルを含みます。
マルチバイト・ユーザー定義語は、完全形式でなければなりません。つまり、マルチバイト・ワードを部分語で置き換えることはできません。
マルチバイト文字が含まれているワードおよびリテラルは、行をまたがって続けることはできません。
各 COPY ステートメントは、 前にスペースが 1 つなければならず、 分離文字ピリオドで終わらなければなりません。
文字ストリングまたは区切り文字が使用できるところならばどこでも、ソース・テキストの中で COPY ステートメントを使用することができます。
COPY ステートメントはネストできます。ただし、ネストされた COPY ステートメントでは REPLACING 句を指定することはできません。 また、REPLACING 句の指定のある COPY ステートメントの中にネストされた COPY ステートメントを含めることはできません。
ネストされた COPY ステートメントが再帰することはできません。 すなわち、ある COPY メンバーに関してファイルの終わりに達するまでに、 その COPY メンバーは、 1 組のネストされた COPY ステートメントの中で一度しか指定できません。 例えば、ソース・テキストに COPY X. というステートメントがあり、ライブラリー・テキスト X に COPY Y. というステートメントがあるとします。
この場合、ライブラリー・テキスト Y には COPY X ステートメントまたは COPY Y ステートメントが含まれていてはなりません。
デバッグ行は、 ライブラリー・テキストと疑似テキストの中で使用することができます。デバッグ行の中のテキスト・ワードは、“D” が標識域に 表示されていない場合と同様にマッチング規則の適用対象になります。デバッグ行が疑似テキスト内で指定されるのは、 そのデバッグ行がソース・テキストにおいて、疑似テキスト開始の区切り文字の後、対応する疑似テキスト終了の区切り文字の前で始まる場合です。
COPY ステートメントを実行した結果としてソース・テキストの中に余分な行が入れられると、 その COPY ステートメントがデバッグ行で開始される場合、または挿入されるテキスト・ワードがライブラリー・テキスト中のデバッグ行上にある場合には、 その挿入されるテキスト・ワードはデバッグ行上に置かれることになります。BY 句の中で指定されたテキスト・ワードが挿入されるときには、 そのテキスト・ワードは、 置き換えられるその最初のライブラリー・テキスト・ワードがデバッグ行上で指定されている場合には、 デバッグ行上に置かれます。
COPY ステートメントがデバッグ行上に指定されているときには、コピーされるテキストは、 そのテキスト中のコメント行がその COPY ステートメントの実行結果として得られたソース・テキストの中でコメント行として現れる場合を除き、デバッグ行上に入れられたものとして扱われます。
COPY ワードがコメント項目に置かれているか、またはコメント項目を指定できるところにある場合には、 その COPY ワードはコメント項目の一部とみなされます。
すべての COPY ステートメントと REPLACE ステートメントの処理が終了すると、 デバッグ行は、 SOURCE-COMPUTER 段落の中に WITH DEBUGGING MODE 文節が指定されていない場合には、 コメント行としてのすべての特性を持っているものとみなされます。
コメント行やブランク行は、ライブラリー・テキスト中に置かれることがあります。 ライブラリー・テキストに置かれているコメント行やブランク行は、結果ソース・テキストにそのままコピーされます。ただし、ライブラリー・テキストに置かれているコメント行やブランク行は、 そのコメント行やブランク行がオペランド-1 に一致するテキスト・ワードの並びの中にある場合 はコピーされません (置換と比較に関する規則を参照)。
*CONTROL (*CBL)、EJECT、SKIP1、SKIP2、SKIP3、または TITLE の各ステートメントを含む行を、 ライブラリー・テキストの中に記述することができます。それらの行は、COPY ステートメントの処理中はコメント行として扱われます。
ライブラリー・テキストが構文上正しいかどうかは、別々に判定することはできないので、 すべての COPY ステートメントおよび REPLACE ステートメントの処理が完全に終了するまで、 COBOL ソース・テキスト全体が構文的に正しいかどうかは判定できません。
ライブラリーからコピーされるライブラリー・テキストは、 結果として得られるプログラムの中で、 そのライブラリー・テキストがライブラリーの中にあったときと同じ領域に入れられます。ライブラリー・テキストは、標準の COBOL 85 フォーマットの規則に適合している必要があります。
注: COBOL ワードおよびセパレーター用に定義されるそれらの外側の文字は、コメント 行、コメント項目、英数字リテラル、DBCS リテラル、または国別リテラルである場合 を除いて、ライブラリー・テキストまたは疑似テキストで表示してはいけません。
SUPPRESS 句は、ライブラリー・テキストをソース・リストに印刷させないように指定します。
以下の説明では、各オペランド は、次のいずれかで構成されています。
REPLACING 句を指定すると、ライブラリー・テキストがコピーされ、ライブラリー・テキスト内にあるオペランド-1 は、それが完全に一致するたびに関連するオペランド-2 によって置き換えられます。
疑似テキスト内の個々の文字ストリングは、いずれも最大 322 文字までが可能です。これらの文字ストリングは、ソース・コード形式の通常の継続規則に従って継続させることができます。
文字ストリングは区切り文字によって区切らなければならないことに注意してください。 詳細については、文字を参照してください。
疑似テキスト-1 は、オペランド-1 として使用されるときの疑似テキストを指し、疑似テキスト-2 は、オペランド-2 として使用されるときの疑似テキストを指しています。
疑似テキスト-1 は、区切り文字のコンマまたは区切り文字のセミコロンだけで構成することができます。疑似テキスト-2 は、ヌルであり、スペース文字またはコメント行だけで構成することができます。
疑似テキストに COPY ワードを含めることはできません。
プログラムの中にコピーされる疑似テキスト-2 の中の各テキスト・ワードは、 結果として得られるプログラムの中で、それが疑似テキスト-2 の中にあったときと同じ領域に入れられます。
疑似テキストには、ソース・テキストに記述可能な任意のワード (COPY ワードを除く)、ID、またはリテラルのいずれでも使用できます。これは、マルチバイト・ユーザー定義語、DBCS リテラル、および国別リテラルを含みます。
マルチバイト・ユーザー定義語は、完全形式でなければなりません。つまり、マルチバイト・ワードを部分語で置き換えることはできません。
マルチバイト文字が含まれているワードおよびリテラルは、行をまたがって続けることはできません。
区切り文字以外の COBOL 文字 (例えば +、*、/、$、<、>、および =) は、 REPLACING オペランドとして使用する場合は COBOL ワードの一部として組み込むことができます。さらに、 ハイフンをその語、英数字リテラル、DBCS リテラル、または国別リテラルの最初の文字または最後の文字に使用することもできます。
マッチングを行うために ID-1、リテラル-1、またはワード-1 は、それぞれ ID-1、リテラル-1、またはワード-1 だけを含む疑似テキストとして扱われます。
ライブラリー・テキストに終了引用符が含まれており、 その直後に区切り文字としてスペース、コンマ、セミコロン、 またはピリオドがない場合、その終了引用符は区切り文字の引用符とみなされます。
コロンは区切り文字の役割を果たすため、TAG はスタンドアロンのオペランドになります。
コードの並び (ファイルおよびデータ記述、エラーおよび例外ルーチン) で、複数のプログラムに共通のものは、ライブラリーに保管することができ、COPY ステートメントと共に使用することができます。 そのような共通のコードに関して命名規則が確立されていれば、 REPLACING 句を指定する必要はありません。 プログラムごとに別の名前に変更する場合には、 そのプログラムにとって意味のある名前を与えるために REPLACING 句を使用することができます。
この例では、ライブラリー・テキスト PAYLIB は、 次のようなデータ部の項目から構成されています。
01 A.
02 B PIC S99.
02 C PIC S9(5)V99.
02 D PIC S9999 OCCURS 1 TO 52 TIMES
DEPENDING ON B OF A.
プログラマーは、プログラムのデータ部の中で COPY ステートメントを次のように使用することができます。
COPY PAYLIB.
このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。
01 A.
02 B PIC S99.
02 C PIC S9(5)V99.
02 D PIC S9999 OCCURS 1 TO 52 TIMES
DEPENDING ON B OF A.
例 2
ライブラリー・テキストの中のいくつかの (またはすべての) 名前を変更するために、 プログラマーは REPLACING 句を使用することができます。
COPY PAYLIB REPLACING A BY PAYROLL
B BY PAY-CODE
C BY GROSS-PAY
D BY HOURS.
このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。
01 PAYROLL.
02 PAY-CODE PIC S99.
02 GROSS-PAY PIC S9(5)V99.
02 HOURS PIC S9999 OCCURS 1 TO 52 TIMES
DEPENDING ON PAY-CODE OF PAYROLL.
ここに示された変更は、このプログラムに対してだけ行われます。ライブラリーの中にあるテキストは変更されません。
例 3
ライブラリー・テキストの中で次のような規則に従っている場合、名前の一部 (例えばデータ名の接頭部) を REPLACING 句を使って変更することができます。
この例では、ライブラリー・テキスト PAYLIB は、 次のようなデータ部の項目から構成されています。
01 :TAG:.
02 :TAG:-WEEK PIC S99.
02 :TAG:-GROSS-PAY PIC S9(5)V99.
02 :TAG:-HOURS PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON :TAG:-WEEK OF :TAG:.
プログラマーは、プログラムのデータ部の中で COPY ステートメントを次のように使用することができます。
COPY PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
注: この例で特に注意する点は、ライブラリー・テキストの中で区切り文字としてコロンや括弧を使用する必要があることです。 括弧は、添え字やテーブル・エレメントを参照するインスタンスの場合でも使用されるため、わかりやすさを考慮してコロンを使用してください。
このプログラムでは、ライブラリー・テキストがコピーされます。結果テキストは、次のように書き込まれたものとして扱われます。
01 PAYROLL.
02 PAYROLL-WEEK PIC S99.
02 PAYROLL-GROSS-PAY PIC S9(5)V99.
02 PAYROLL-HOURS PIC S999 OCCURS 1 TO 52 TIMES
DEPENDING ON PAYROLL-WEEK OF PAYROLL.
ここに示された変更は、このプログラムに対してだけ行われます。ライブラリーの中にあるテキストは変更されません。
例 4
この例では、PICTURE 文節の番号を置き換えずに、 レベル番号を選択して置き換える方法を示します。
COPY xxx REPLACING ==(01)== BY ==(01)==
== 01 == BY == 05 ==.