前述したように、独自のコンパイラー・ユーザー出口を作成することも、単に IBMUEXIT.PLI を変更することもできます。いずれの場合も、コンパイラー・ユーザー出口用の実行可能 ファイルの名前は IBMUEXIT.DLLでなければなりません。
このセクションでは、次の方法について説明します。
まったく新しいコンパイラー・ユーザー出口の作成に時間を費やすのではなく、サンプル・プログラム IBMUEXIT.INF を変更して使用することができます。
INF ファイルを編集して、抑止するメッセージ番号と、変更するメッセージ番号の重大度レベルを指示します。サンプル IBMUEXIT.INF ファイルを図 28 に示します。
Fac Id Msg No Severity Suppress Comment +--------+--------+----------+----------+-------------------------------- 'IBM' 1041 -1 1 Comment spans multiple lines 'IBM' 1044 -1 1 FIXED BIN 7 mapped to 1 byte 'IBM' 1172 0 0 Select without OTHERWISE 'IBM' 1052 -1 1 Nodescriptor with * extent args 'IBM' 1047 12 0 Reorder inhibits optimization 'IBM' 8009 -1 1 Semicolon in string constant 'IBM' 1107 12 0 Undeclared ENTRY 'IBM' 1169 0 1 Precision of result determined by arg
最初の 2 行はヘッダー行で、IBMUEXIT では無視されます。残りの行には、可変数のブランクで区切られた入力データが含まれています。
ファイルの各列は、コンパイラー・ユーザー出口に次のように関係しています。
独自のユーザー出口を作成するには、モデルとして IBMUEXIT (サンプル・プログラムの 1 つとして製品に付属) を使用できま す。出口を作成するときには、初期化、メッセージのフィルター操作、および終了をそれぞれ必ずカバーしてください。
グローバル制御ブロックは、3 つのユーザー出口プロシージャー (初期化、フィルター操作、および終了) が呼び出されるたびに、それぞれに渡されます。次のコードと説明は、グローバル制御ブロック内の各フィールドの内容を示すものです。
Dcl
1 Uex_UIB native based( null() ),
2 Uex_UIB_Length fixed bin(31),
2 Uex_UIB_Exit_token pointer, /* for user exit's use */
2 Uex_UIB_User_char_str pointer, /* to exit option str */
2 Uex_UIB_User_char_len fixed bin(31),
2 Uex_UIB_Filename_str pointer, /* to source filename */
2 Uex_UIB_Filename_len fixed bin(31),
2 Uex_UIB_return_code fixed bin(31), /* set by exit procs */
2 Uex_UIB_reason_code fixed bin(31), /* set by exit procs */
2 Uex_UIB_Exit_Routs, /* exit entries set at
initialization */
3 ( Uex_UIB_Termination,
Uex_UIB_Message_Filter, /* call for each msg */
*, *, *, * )
limited entry (
*, /* to Uex_UIB */
*, /* to a request area */
);
初期化プロシージャーは、出口が必要とする初期化、例えば、ファイルのオープンやストレージの割り振りなどを実行する必要があります。初期化プロシージャー特有の制御ブロックは、次のようにコード化されます。
Dcl 1 Uex_ISA native based( null() ),
2 Uex_ISA_Length_fixed bin(31); /* storage(Uex_IS A) */
初期化プロシージャーのグローバル制御ブロックの構文については、グローバル制御ブロックの構造に説明があります。
初期化プロシージャーの完了時には、戻りコード/理由コードを次のように設定する必要があります。
メッセージ・フィルター操作プロシージャーを使うと、メッセージを抑止したり、メッセージの重大度を変更したりすることができます。どのメッセージの重大度も高くすることはできますが、 低くすることができるのは、「ERROR」(重大度コード 8) または「WARNING」(重大度コード 4) メッセージの重大度のみです。
プロシージャー特有の制御ブロックには、メッセージについての情報が含まれています。これは、特定のメッセージの取り扱い方法を示す情報をコンパイラーに渡すために使われます。
プロシージャー特有のメッセージ・フィルター制御ブロックの例を次に示します。
Dcl 1 Uex_MFX native based( null() ),
2 Uex_MFX_Length fixed bin(31),
2 Uex_MFX_Facility_Id char(3), /* of component writing
message */
2 * char(1),
2 Uex_MFX_Message_no fixed bin(31),
2 Uex_MFX_Severity fixed bin(15),
2 Uex_MFX_New_Severity fixed bin(15), /* set by exit proc */
2 Uex_MFX_Inserts fixed bin(15),
2 Uex_MFX_Inserts_Data( 6 refer(Uex_MFX_Inserts) ),
3 Uex_MFX_Ins_Type fixed bin(7),
3 Uex_MFX_Ins_Type_Data union unaligned,
4 * char(8),
4 Uex_MFX_Ins_Bin fixed bin(31),
4 Uex_MFX_Ins_Str,
5 Uex_MFX_Ins_Str_Len fixed bin(15),
5 Uex_MFX_Ins_Str_Addr pointer,
4 Uex_MFX_Ins_Series,
5 Uex_MFX_Ins_Series_Sep char(1),
5 Uex_MFX_Ins_Series_Addr pointer;
データ入力フィールド
メッセージ・フィルター操作プロシージャーの完了時に、戻りコード/理由コードを次のいずれかに設定してください。