設定された環境変数のリスト表示
ジョブに設定されている環境変数のリストを取得すると便利な場合があります。例えば、プログラムがクラッシュした場合、ジョブ・ログやプログラム・ダンプなど、診断情報を吐き出すルーチンがあります。それを行う場合、環境変数とその現在の設定もリスト表示すると便利な場合が少なくありません。これは特に、プログラムの使用方法が環境変数で制御されている CGI プログラムに当てはまります。
IBM は、変数を対話式に表示できる WRKENVVAR コマンドを提供していますが、IBM は設定済みのすべての変数を取り出すコマンドは提供していません。しかし、多少のポインター・ロジックを使用して変数のリストを取得することはできます。理解するためのキーポイントは、IBM は環境変数を記録するための environ というポインターを提供していることです。この変数は IBM が OS とともに提供するサービス・プログラムの 1 つからのエクスポートに過ぎません。この変数の値を簡単に自分の RPG プログラムにインポートできます。
別のキーポイントは、環境変数がすでにあるジョブで開始されている可能性がある (またはない) ということです。これは、あなたのプログラムがジョブ中で環境変数を使用する最初のプログラムかどうかによります。幸い、IBM は環境変数がまだ開始されていない場合に開始させる Qp0zInitEnv() という API を提供しています。以下のコードは、単純に RPG プログラムからジョブ中の環境変数を取り出す例を示しています。
H DFTACTGRP(*NO) ACTGRP(*NEW) D QUILNGTX PR ExtPgm('QUILNGTX') D text 65535a const options(*varsize) D length 10i 0 const D msgid 7a const D qualmsgf 20a const D errorCode 20i 0 const D Qp0zInitEnv pr 10i 0 extproc('Qp0zInitEnv') D environ s import('environ') D env s dim(32767) D based(environ) D x s 10i 0 D data s 65535a varying /free Qp0zInitEnv(); for x = 1 to %elem(env); if env(x) = *null; leave; endif; data = %str(env(x)); QUILNGTX( data: %len(Data): *blanks: *blanks: 0); endfor; *inlr = *on; /end-free
QUILNGTX API は環境変数には関連していません。これは 5250 ディスプレイに小さな「メッセージ・ウィンドウ」を表示し、多少のテキストを表示する単なる API です。単純なプルーフ概念やテスト・プログラムを作成する場合に使用したいと考えています。メッセージを画面に表示させる簡単な方法だからです。
上記のコードでは、import キーワードを指定した environ 変数が指定されています。これは RPG に、活動化グループの別のサービス・プログラムからこの変数をインポートするよう指示しています。実質的に、いずれかのプログラムからアクセスできる「グローバル」変数を作成します。environ はポインターの配列をポイントしています。配列には 4,096 ものポインターがあります (私のプログラムでは、万が一制限値が増えた場合に備えて最大 32,767 個を許可しています)。
配列の最後のポインターは *NULL を検索して検出できます。これは変数リストの最後を示します。配列の各ポインターは VAR=VALUE 形式の変数が 1 つ入った C スタイルのゼロ終了した文字列をポイントします。%str() を使用して C スタイル・パラメーターを RPG のネイティブ形式に変換します。
あなたの場合は、QUILNGTX を使用して変数を表示するのではなく、出力をファイルまたはスプールに書き出したいと考えているかもしれません。しかし、できればこの手法を理解していただき、出力を自分の好きなように作成できるよう、私のコードを変更できればと思っています。