LINKMVS および ATTCHMVS ホスト・コマンド環境
ADDRESS ATTCHMVS 'TESTPGMA var1 var2 var3'
パラメーターには、実際の値ではなく変数名を指定します。プログラムの名前および変数名を、単一引用符または二重引用符 で囲んでください。引用符を使用すると、言語プロセッサーは、どの変数も評価しません。言語プロセッサーは、単に、 式を処理のためにホスト・コマンド環境に渡すだけです。LINKMVS または ATTCHMVS 環境そのものは、変数を評価して、 変数置換を行います。各パラメーターに変数を使用しない場合、および式を引用符で囲まない場合、 変数置換で問題が発生し、予期しない結果を受け取ることがあります。
LINKMVS または ATTCHMVS 環境ルーチンが各変数の値を評価した 後、環境ルーチンは、その値を指し示すパラメーター・リストを作成 します。次に、環境ルーチンは、プログラムをリンクまたはタスク生成し、 パラメーター・リストをそのプログラムに渡します。
図 1 は、LINKMVS また は ATTCHMVS ホスト・コマンド環境ルーチンがパラメーターをプログラムに 渡す方法を示したものです。レジスター 0 は ENVBLOCK を指していますが、この下で、ADDRESS LINKMVS または ADDRESS ATTCHMVS を出す REXX EXEC が実行されています。レジスター 1 にはパラメーター・リストのアドレスが入り、 これはアドレスのリストで構成されます。パラメーター・リスト内の各アドレスは 1 つのパラメーターを指します。 パラメーター・リストの中の最後のアドレスの高位ビットは、 そのパラメーター・リストの終わりを示すために 1 に設定されています。
![ikja3gc2 ikja3gc2](ikja3gc2.gif)
⋮
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 が実行する処理のタイプが判別されます。
- 長さフィールドの中の値が 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 に更新する必要があります。
ADDRESS ATTCHMVS 'workpgm'
パラメーターをまったく指定しない場合、レジスター 1 には、 パラメーター・リストを指すアドレスが入ります。最初のパラメーター・アドレスの高位ビットがオンになります。このパラメーター・アドレスは、長さが 0 のパラメーターを指します。