LINKMVS および ATTCHMVS ホスト・コマンド環境

LINKMVS および ATTCHMVS 環境の場合、複数のパラメーターを プログラムに渡すことができます。プログラムの名前の後に、パラメーターそれぞれについての変数名を 指定してください。各変数名は、1 つ以上のブランクで区切ります。例えば、次のようになります。
ADDRESS ATTCHMVS 'TESTPGMA var1 var2 var3'

パラメーターには、実際の値ではなく変数名を指定します。プログラムの名前および変数名を、単一引用符または二重引用符 で囲んでください。引用符を使用すると、言語プロセッサーは、どの変数も評価しません。言語プロセッサーは、単に、 式を処理のためにホスト・コマンド環境に渡すだけです。LINKMVS または ATTCHMVS 環境そのものは、変数を評価して、 変数置換を行います。各パラメーターに変数を使用しない場合、および式を引用符で囲まない場合、 変数置換で問題が発生し、予期しない結果を受け取ることがあります。

LINKMVS または ATTCHMVS 環境ルーチンが各変数の値を評価した 後、環境ルーチンは、その値を指し示すパラメーター・リストを作成 します。次に、環境ルーチンは、プログラムをリンクまたはタスク生成し、 パラメーター・リストをそのプログラムに渡します。

図 1 は、LINKMVS また は ATTCHMVS ホスト・コマンド環境ルーチンがパラメーターをプログラムに 渡す方法を示したものです。レジスター 0 は ENVBLOCK を指していますが、この下で、ADDRESS LINKMVS または ADDRESS ATTCHMVS を出す REXX EXEC が実行されています。レジスター 1 にはパラメーター・リストのアドレスが入り、 これはアドレスのリストで構成されます。パラメーター・リスト内の各アドレスは 1 つのパラメーターを指します。 パラメーター・リストの中の最後のアドレスの高位ビットは、 そのパラメーター・リストの終わりを示すために 1 に設定されています。

各パラメーターは、ハーフワードの長さフィールドの後にパラメーター が続く形で構成されますが、このパラメーターは、LINKMVS または ATTCHMVS 命令 で指定した変数の値です。ハーフワードの長さフィールドには、パラメーターの長さが含まれますが、 これは、変数の値の長さです。ハーフワードの長さフィールドの最大値は 32,767 です。
図 1. LINKMVS および ATTCHMVS 環境の場合のパラメーター
ikja3gc2 ikja3gc2
1 つの例として、RTNWORK プログラムをタスク生成して、 注文番号 (43176) とコード (CDETT76) の 2 つのパラメーターを渡したい ものとします。ADDRESS ATTCHMVS 命令を使用する場合は、2 つのパラメーターに変数名 を指定します。 例えば、注文番号 43176 に対しては ordernum、 コード CDETT76 に対しては codenum を指定します。ADDRESS ATTCHMVS を使用する前に、その変数名に対して値を割り当てます。
⋮
ordernum = 43176
codenum = "CDETT76"
⋮
ADDRESS ATTCHMVS "RTNWORK ordernum codenum"
⋮
EXIT

例では、変数 ordernum に値 43176 を、 および変数 codenum には値 CDETT76 を割り当てます。ADDRESS ATTCHMVS 命令上には、この 2 つのパラメーターに対して変数名 を使用します。ATTCHMVS ホスト・コマンド環境は、変数を評価して、 その変数の値を RTNWORK プログラムに渡します。パラメーター・リストでは、最初の パラメーター (変数 ordernum) の 長さフィールドは 5 であり、その後にストリング 43176 が続きます。2 番目の パラメーター (変数 codenum) の長さフィールドは 7 で あり、その後にストリング CDETT76 が続きます。

リンクまたはタスク生成したプログラムを開始するときには、 ハーフワードの長さフィールドは、パラメーターの実際の長さが入っています。リンクまたはタスク生成されたプログラムは、処理を終了する前に、 パラメーターの値を更新できます。プログラムがハーフワードの長さフィールドに戻す値によっ て、LINKMVS または ATTCHMVS が実行する処理のタイプが判別されます。

LINKMVS または ATTCHMVS 環境ルーチンが再び制御権を得たときに、REXX EXEC に戻る前に、REXX 変数の値が更新されたかどうかが判別されます。特定のパラメーターに対する変数の値が更新されたかどうかを判別するために、LINKMVS または ATTCHMVS 環境は、ハーフワードの長さフィールドの中の値を検査します。長さフィールドの値によって、LINKMVS または ATTCHMVS は、変数を更新するか、 変数を更新しないか、あるいは変数にヌル・ストリングを設定するかします。
  • 長さフィールドの中の値が 0 より小さい 場合、LINKMVS または ATTCHMVS 環境は、そのパラメーターに対する 変数を更新しません。
  • 長さフィールドの中の値が 0 である 場合、LINKMVS または ATTCHMVS 環境は、そのパラメーターに対する 変数にヌル・ストリングを設定します。
  • 長さフィールドの中の値が 0 より大きい 場合、LINKMVS または ATTCHMVS 環境は、そのパラメーターに対する 変数を更新して、プログラムがパラメーター・リストに戻した値にします。 長さフィールドが正数である場合、LINKMVS または ATTCHMVS は、 単に、長さフィールドの長さを使用してその変数を更新します。

    値の元の長さが 500 バイトより小さい場合、TSO/E は、変数の値の長さに関係なく、500 バイトのストレージ域を用意します。例えば、プログラムを開始するときに変数の値の長さが 8 であった場合、 ハーフワードの長さフィールドには 8 という値が入ります。しかし、パラメーター自体のために使用できるストレージは、500 バイト になります。これにより、プログラムは、ストレージを取得しなくても、変数の長さを 増やすことができます。呼び出されたプログラムが変数の長さを変更する場合は、 長さフィールドも変更する必要があります。

    値の元の長さが 500 バイト以上の場合は、追加で割り振られるスペースはありません。例えば、値が 620 バイトの長さを持つ変数を指定したとします。この場合、呼び出されたプログラムは、最大 620 バイトまでの長さの値を戻す ことができます。TSO/E は、追加のバッファー域は用意しません。この場合、リンクまたはタスク生成されたプログラムがもっと大きな 値を戻すことが予想されれば、元の値の右側にブランクを埋め込んでください。

1 つの例として、PGMCODES というプログラムにリンクして、PC7177 という 値を持った変数 pcode を渡すとします。LINKMVS 環境は、変数 pcode の 値 (PC7177) を評価して、 その値を指すパラメーター・リストを作成します。ハーフワードの長さフィールドには値の長さ (この場合 6) が入り、 その後に値そのものが続きます。PGMCODES プログラムが、PC7177 の値を PC7177ADC3 という値に 更新したとします。PGMCODES プログラムが制御を LINKMVS 環境に戻すときには、 プログラムは、EXEC に戻す値の実際の長さを示すために、ハーフワード の長さフィールドの中の長さの値を 10 に更新する必要があります。

LINKMVS または ATTCHMVS 環境を使用して、パラメーターをまったく指定 しないようにすることもできます。例えば、次のようになります。
ADDRESS ATTCHMVS 'workpgm'

パラメーターをまったく指定しない場合、レジスター 1 には、 パラメーター・リストを指すアドレスが入ります。最初のパラメーター・アドレスの高位ビットがオンになります。このパラメーター・アドレスは、長さが 0 のパラメーターを指します。