SYSLIB (または library-name) データ・セットの代わりに出口モジュールが使用されます。 コンパイラーは、COPY または BASIS ステートメントが検出されるたびに、このモジュールを呼び出してコピーブックを入手します。
LIBEXIT を指定する場合は、LIB コンパイラー・オプションが有効でなければなりません。
| コンパイラーのアクション | 出口モジュールによる結果としてのアクション |
|---|---|
| 初期化時に出口モジュール (mod2) をロードします | |
| OPEN 命令コード (op コード) を使用してこの出口モジュールを呼び出します | 指定された library-name を処理のために準備します。OPEN 要求の状況をコンパイラーに渡します。 |
| library-name が正常にオープンされた場合に、FIND 命令コードを使用してこの出口モジュールを呼び出します | 指定された library-name 内の要求された text-name (または basis-name) のところに、位置決めを行います。この場所がアクティブ・コピーブックになります。位置決めが完了したときに、適切な戻りコードをコンパイラーに渡します。 |
| GET 命令コードを使用してこの出口モジュールを呼び出します | アクティブ・コピーブックからコピーされるレコードの長さとアドレス、またはデータの終わり標識のいずれかをコンパイラーに渡します |
| データの終わりが存在するときに、CLOSE 命令コードを使用して出口モジュールを呼び出します | その入力に関連のあるすべてのリソースを解放します |
アクティブ・コピーブックのレコードは COPY ステートメントを含むことができます。 (ただし、ネストされた COPY ステートメントに REPLACING 句を含めたり、REPLACING 句を持つ COPY ステートメントに、ネストされた COPY ステートメントを含めたりすることはできません。)
コンパイラーは、text-name への再帰呼び出しを許可しません。つまり、コピーブックは、そのコピーブックのデータの終わりに達するまでの間、ネストされた一連の COPY ステートメントの中で一度しか指定できません。
次の表は、ネストされていない 1 つ以上の有効な COPY ステートメントが あるときに、LIBEXIT の処理がどのように変わるかを示しています。
| コンパイラーのアクション | 出口モジュールによる結果としてのアクション |
|---|---|
| 初期化時に出口モジュール (mod2) をロードします | |
| OPEN 命令コード (op コード) を使用してこの出口モジュールを呼び出します | 指定された library-name を処理のために準備します。OPEN 要求の状況をコンパイラーに渡します。 |
| library-name が正常にオープンされた場合に、FIND 命令コードを使用してこの出口モジュールを呼び出します | 指定された library-name 内の要求された text-name (または basis-name) のところに、位置決めを行います。この場所がアクティブ・コピーブックになります。位置決めが完了したときに、適切な戻りコードをコンパイラーに渡します。 |
| library-name が正常にオープンされた場合に、FIND 命令コードを使用してこの出口モジュールを呼び出します | 前のアクティブ・コピーブックのところに、位置決めを設定し直します。位置決めが完了したときに、適切な戻りコードをコンパイラーに渡します。 |
| GET 命令コードを使用してこの出口モジュールを呼び出します。 同じレコードが渡されたかどうかを検査します。 |
このコピーブックから前に渡されたものと同じレコードをコンパイラーに渡します。検査後に、アクティブ・コピーブックからコピーされるレコードの長さとアドレス、またはデータの終わり標識のいずれかをコンパイラーに渡します。 |
| データの終わりが存在するときに、CLOSE 命令コードを使用して出口モジュールを呼び出します | その入力に関連のあるすべてのリソースを解放します |
次の表は、ネストされた 1 つの有効な COPY ステートメントを コンパイラーが検出すると、LIBEXIT の処理がどのように変わるかを示しています。
| コンパイラーのアクション | 出口モジュールによる結果としてのアクション |
|---|---|
| ネストされた COPY ステートメントからの要求された library-name が前にオープンされていなければ、OPEN 命令コードを使用してこの出口モジュールを呼び出します | アクティブ・コピーブックに関する制御情報をスタックに押し入れます。 要求されたアクション (OPEN) を完了させます。 新しく要求された text-name (または basis-name) がアクティブ・コピーブックになります。 |
| 要求された新しい text-name のために FIND 命令コードを使用してこの出口モジュールを呼び出します | アクティブ・コピーブックに関する制御情報をスタックに押し入れます。 要求されたアクション (FIND) を完了させます。 新しく要求された text-name (または basis-name) がアクティブ・コピーブックになります。 |
| GET 命令コードを使用してこの出口モジュールを呼び出します | アクティブ・コピーブックからコピーされるレコードの長さとアドレス、またはデータの終わり標識のいずれかをコンパイラーに渡します。データの終わりに、スタックからその制御情報をポップします。 |
コンパイラーはパラメーター・リストを使用して、出口モジュールと連絡します。パラメーター・リストはアドレスが入っている 10 個のフルワードで構成され、レジスター 1 にはパラメーター・リストのアドレスが入ります。戻りコード、データ長、およびデータ・パラメーターは、出口モジュールによってコンパイラーに戻され、他の項目はコンパイラーから出口モジュールに渡されます。
| Offset | 次のもののアドレスが入る | 項目の説明 |
|---|---|---|
| 00 | ユーザー出口タイプ | 操作を実行するユーザー出口を識別するハーフワード。 2=LIBEXIT |
| 04 | 命令コード | 操作のタイプを示すハーフワード。 0=OPEN; 1=CLOSE; 2=GET; 4=FIND |
| 08 | 戻りコード | 出口モジュールによって設定されるフルワードで、要求された操作の成功を示します。 0=操作は成功しました; 4=データの終わり; 12=操作は失敗しました |
| 12 | ユーザー出口作業域 | ユーザー出口モジュールで使用できるように、コンパイラーが提供する 4 フルワードの作業域 |
| 16 | データ長 | 出口モジュールが設定するフルワードで、GET 操作によって戻されるレコードの長さを指定します (80 でなければなりません) |
| 20 | データまたは str2 | 出口モジュールが設定するフルワードであり、GET 操作の際、ユーザー所有のバッファー内のレコードのアドレスが入ります。 str2 は OPEN にのみ適用されます。最初のハーフワード (ハーフワード境界上の) にストリングの長さが入り、その後にストリングが続きます。 |
| 24 | システム library-name | COPY ステートメントの library-name が入れられる 8 文字の区域。プログラム名の処理規則および変換規則が適用されます。必要に応じて、ブランクが埋め込まれます。OPEN、CLOSE、および FIND に適用されます。 |
| 28 | システム text-name | COPY ステートメントの text-name (BASIS ステートメントの basis-name) が入れられる 8 文字の区域。program name の処理規則と変換規則が適用されます。必要に応じて、ブランクが埋め込まれます。FIND にのみ適用されます。 |
| 32 | ライブラリー名 | COPY ステートメントからの完全な library-name が入れられる 30 文字の区域。必要な場合にはブランクが埋め込まれ、そのまま (英大文字に変換されず) で使用されます。OPEN、CLOSE、および FIND に適用されます。 |
| 36 | テキスト名 | COPY ステートメントからの完全な text-name が入れられる 30 文字の区域。必要な場合にはブランクが埋め込まれ、そのまま (英大文字に変換されず) で使用されます。FIND にのみ適用されます。 |