EXIT オプションは、SYSIN、SYSLIB (またはコピー・ライブラリー)、 および SYSPRINT の代わりにユーザー提供モジュールをコンパイラーが受け入れることができるようにする場合に使用します。
EXIT モジュールを作成するときには、モジュールが DLL モジュールとしてリンクされていることを確認してから、COBOL コンパイラーで実行してください。EXIT モジュールは、プラットフォームのシステム・リンケージ規約とともに呼び出されます。
デフォルト: NOEXIT
省略形: EX(INX|NOINX,LIBX|NOLIBX,PRTX|NOPRTX,ADX|NOADX)
サブオプションをまったく指定せずに EXIT オプションを指定する (つまり、EXIT() を指定する) と、NOEXIT が有効になります。サブオプションは、コンマまたはスペースで区切って任意の順序で指定することができます。サブオプションの肯定形式と否定形式 (INEXIT|NOINEXT、LIBEXIT|NOLIBEXIT、PRTEXIT|NOPRTEXIT、または ADEXIT|NOADEXIT) の両方を指定した場合は、最後に指定された形式が有効になります。同じサブオプションを複数回指定すると、最後に指定したものが有効になります。
SYSADATA の場合、ADEXIT サブオプションは、SYSADATA レコードごとに、そのレコードがファイルに書き込まれた直後に呼び出されることになるモジュールを提供します。
PROCESS なし: EXIT オプションは、PROCESS(CBL) ステートメントでは指定できません。このオプションは、環境変数 COBOPT を使用するか、または cob2 コマンドのオプションとしてのみ指定することができます。
モジュール名 mod1、mod2、mod3、および mod4 は、同じものを参照することが可能です。
サブオプション 'str1'、'str2'、'str3'、および 'str4' は、ロード・モジュールに渡される文字ストリングです。これらのストリングはオプションです。これらを使用する場合は、64 文字以内の長さにし、単一引用符で囲む必要があります。任意の文字を使用できますが、組み込む単一引用符は二重にしなければならず、小文字は大文字に変換されます。
'str1'、'str2'、'str3'、 または 'str4' が指定された場合、そのストリングは次の形式で、 適切なユーザー出口モジュールに渡されます。ここで、LL は ストリングの長さを含むハーフワード (ハーフワード境界) です。 次の表に、パラメーター・リスト内に使用される文字ストリングの場所を示します。
| LL | ストリング |
出口を使用すると、コンパイラーはユーザー出口作業域を提供します。この作業域を使用して、出口モジュールによって割り振られたストレージのアドレスを保存することができます。 これにより、モジュールは再入可能な状態になります。
ユーザー出口作業域は、フルワード境界に常駐する 4 フルワードです。この作業域が 2 進ゼロに初期設定された後、最初の出口ルーチンが呼び出されます。作業域のアドレスは、パラメーター・リストの出口モジュールに渡されます。初期化後、コンパイラーは作業域に参照を行いません。このため、コンパイル時に複数の出口がアクティブになる場合は、作業域を使用するための独自の規則を確立する必要があります。例えば、INEXIT モジュールは作業域の最初のワードを使用し、LIBEXIT モジュールは 2 番目のワードを使用し、PRTEXIT モジュールは 3 番目のワードを使用します。
EXIT モジュールは、COBOL プログラム間、ライブラリー・ルーチン間、および COBOL プログラムとライブラリー・ルーチン間で標準リンケージ規約を使用します。呼び出しチェーンを正しくトレースするためには、これらの規則を知る必要があります。
次の表に、コンパイラーが出口モジュールとやり取りするために使用するパラメーター・リストの形式を示します。
| オフセット | 内容 | 項目の説明 |
|---|---|---|
| 00 | ユーザー出口タイプ | 操作を実行するユーザー出口を識別するハーフワード。
1=INEXIT; 2=LIBEXIT; 3=PRTEXIT; 4=ADEXIT |
| 02 | 命令コード | 操作のタイプを示すハーフワード。
0=OPEN; 1=CLOSE; 2=GET; 3=PUT; 4=FIND |
| 04 | 戻りコード | 出口モジュールによって設定されるフルワードで、要求された操作の状況を示します。
0=Successful; 4=End-of-data; 12=Failed |
| 08 | データ長 | 出口モジュールが設定するフルワードで、GET 操作によって戻されるレコードの長さを指定します。 |
| 12 | データまたは 'str2' | データは、出口モジュールが設定するフルワードで、GET 操作の際にユーザー所有のバッファー内のレコードのアドレスが入ります。
'str2' は OPEN にのみ適用されます。(ハーフワード境界上の) 最初のハーフワードにストリングの長さが入り、その後にストリングが続きます。 |
| 16 | ユーザー出口作業域 | ユーザー出口モジュールで使用できるように、コンパイラーが提供する 4 フルワードの作業域。 |
| 32 | テキスト名 | 完全修飾テキスト名を含むヌル終了ストリングのアドレスが入るフルワード。FIND にのみ適用されます。 |
| 36 | ユーザー出口パラメーター・ストリング | 4 エレメント配列のアドレスが入るフルワード。各エレメントは、2 バイト長のフィールドの後に、出口パラメーター・ストリングを含む 64 文字のストリングが続く構造になっています。 |
LIBEXIT の場合は、パラメーター・ストリング配列の 2 番目のエレメントだけが使用され、LIBEXIT パラメーター・ストリングの長さと、このパラメーター・ストリング自体が格納されます。
INEXIT を指定すると、コンパイラーは初期化時に出口モジュール (mod1) をロードし、OPEN 命令コードを使用してモジュールを呼び出します。 これにより、モジュールは、処理対象のソースを準備し、OPEN 要求の状況をコンパイラーに戻すことができます。その後は、コンパイラーがソース・ステートメントを要求するたびに、GET 命令コードによって出口モジュールが呼び出されます。出口モジュールは、次のステートメントのアドレスと長さ、または (ソース・ステートメントがそれ以上存在しない場合は) データ終了標識のいずれかを戻します。データ終了が存在する場合、コンパイラーは CLOSE 命令コードを使用して出口モジュールを呼び出し、モジュールがその入力に関係するリソースをすべて解放できるようにします。
コンパイラーはパラメーター・リストを使用して、出口モジュールと連絡します。パラメーター・リストは、10 個のフルワードで構成されます。戻りコード、データ長、およびデータ・パラメーターは、出口モジュールによってコンパイラーに戻され、他の項目はコンパイラーから出口モジュールに渡されます。
パラメーター・リストの内容と各項目の説明については、前述の表を参照してください。
LIBEXIT を指定すると、コンパイラーは初期化時に出口モジュール (mod2) をロードします。 コンパイラーは、COPY または BASIS ステートメントが検出されるたびに、このモジュールを呼び出してコピーブックを入手します。
LIB の使用: LIBEXIT を指定する場合は、LIB コンパイラー・オプションが有効でなければなりません。
最初の呼び出しでは、OPEN 命令コードを使用してモジュールが呼び出されます。これにより、モジュールは指定された library-name を処理対象として準備できるようになります。新規の library-name が初めて指定された場合にも、OPEN 命令コードが発行されます。出口モジュールは、OPEN 要求の状況を戻りコードによってコンパイラーに渡します。
OPEN 命令コードによって呼び出された出口が戻されると、FIND 命令コードによって出口モジュールが呼び出されます。出口モジュールは、指定された library-name 内で要求された text-name (または basis-name) に位置を設定します。この場所が「アクティブ・コピーブック」になります。位置決めが完了すると、終了モジュールは該当する戻りコードをコンパイラーに渡します。
コンパイラーが GET 命令コードを使用して出口モジュールを呼び出すと、出口モジュールは、アクティブ・コピーブックからコピーされるレコードの長さとアドレスをコンパイラーに渡します。GET 操作は、データ終了標識がコンパイラーに渡されるまで繰り返されます。
データ終了が存在する場合、コンパイラーは CLOSE 要求を発行して、出口モジュールがその入力に関係するリソースをすべて解放できるようにします。
ネスト済み COPY ステートメント: アクティブ・コピーブックからの レコードに、COPY ステートメントを含めることができます。 (ただし、ネストされた COPY ステートメントに REPLACING 句を含めたり、REPLACING 句を持つ COPY ステートメントに、ネストされた COPY ステートメントを含めたりすることはできません。)有効な、ネストされた COPY ステートメントが検出されると、 コンパイラーは要求を発行します。
コンパイラーは、text-name への再帰呼び出しを許可しません。つまり、コピーブックは、そのコピーブックのデータの終わりに達するまでの間、ネストされた一連の COPY ステートメントの中で一度しか指定できません。
出口モジュールは、OPEN または FIND 要求を受け取ると、アクティブ・コピーブックに関する制御情報をスタックにプッシュしてから、要求された操作 (OPEN または FIND) を完了します。今度は、新しく要求された text-name (または basis-name) がアクティブ・コピーブックになります。
データ終了標識がコンパイラーに渡されるまで、一連の GET 要求を使用した通常の方法で処理が続けられます。
ネストされたアクティブ・コピーブックのデータ終了が検出されると、出口モジュールはその制御情報をスタックからポップします。コンパイラーからの次の要求は FIND であるため、出口モジュールは前のアクティブ・コピーブックに位置決めを再設定することができます。
コンパイラーが GET 要求を使用して出口モジュールを呼び出したら、出口モジュールはこのコピーブックから前に渡された同一レコードを渡す必要があります。同一レコードが渡されたことをコンパイラーが検証すると、データ終了標識が渡されるまで、GET 要求を使用して処理が続けられます。
LIBEXIT に使用されるパラメーター・リストの内容と各項目の説明については、前述の表を参照してください。
PRTEXIT を指定すると、コンパイラーは初期化時に出口モジュール (mod3) をロードします。 この出口モジュールは、SYSPRINT データ・セットの代わりに使用されます。
コンパイラーは、OPEN 命令コードを使用してこのモジュールを呼び出します。これにより、モジュールは、処理を行うための出力先を準備し、OPEN 要求の状況をコンパイラーに戻すことができます。その後は、コンパイラーが行を印刷しようとするたびに、PUT 命令コードによって出口モジュールが呼び出されます。コンパイラーが印刷対象レコードのアドレスと長さを渡すと、出口モジュールは戻りコードによって PUT 要求の状況をコンパイラーに渡します。印刷されるレコードの最初のバイトには、ANSI プリンター制御文字が入ります。
コンパイルが終了する前に、コンパイラーは CLOSE 命令コードを使用して出口モジュールを呼び出し、モジュールがその出力先に関係するリソースをすべて解放できるようにします。
PRTEXIT に使用されるパラメーター・リストの内容と各項目の説明については、前述の表を参照してください。
ADEXIT を指定すると、コンパイラーは初期化時に出口モジュール (mod4) をロードします。 出口モジュールは、SYSADATA データ・セットに書き込まれるレコードごとに呼び出されます。
コンパイラーは、OPEN 命令コードを使用してこのモジュールを呼び出します。これにより、モジュールは、処理を行うための準備をし、OPEN 要求の状況をコンパイラーに戻すことができます。その後は、コンパイラーが SYSADATA レコードを書き込むたびに、PUT 命令コードによって出口モジュールが呼び出されます。コンパイラーが SYSADATA レコードのアドレスと長さを渡すと、出口モジュールは戻りコードによって PUT 要求の状況をコンパイラーに渡します。
コンパイルが終了する前に、コンパイラーは CLOSE 命令コードを使用して出口モジュールを呼び出し、モジュールがリソースをすべて解放できるようにします。
ADEXIT に使用されるパラメーター・リストの内容と各項目の説明については、前述の表を参照してください。